Ejemplo n.º 1
0
func (r *Replica) handleReplicaConnection(rid int, reader *bufio.Reader) error {
	var msgType byte
	var err error
	for !r.Shutdown && err == nil {

		if msgType, err = reader.ReadByte(); err != nil {
			break
		}

		switch uint8(msgType) {

		case gpaxosproto.PREPARE:
			prep := new(gpaxosproto.Prepare)
			if err = prep.Unmarshal(reader); err != nil {
				break
			}
			r.prepareChan <- prep
			break

			/*        case gpaxosproto.PREPARE_REPLY:
			          preply := new(gpaxosproto.PrepareReply)
			          if err = preply.Unmarshal(reader); err != nil {
			             break
			          }
			          r.prepareReplyChan <- preply
			          break*/

		case gpaxosproto.M1A:
			msg := new(gpaxosproto.M_1a)
			if err = msg.Unmarshal(reader); err != nil {
				break
			}
			r.m1aChan <- msg
			break

		case gpaxosproto.M1B:
			msg := new(gpaxosproto.M_1b)
			if err = msg.Unmarshal(reader); err != nil {
				break
			}

			//HACK
			for _, cid := range msg.Cstruct {
				cmd := new(state.Command)
				cmd.Unmarshal(reader)
				r.commandsMutex.Lock()
				if _, present := r.commands[cid]; !present {
					if cmd.Op != 0 || cmd.K != 0 || cmd.V != 0 {
						r.commands[cid] = cmd
					}
				}
				r.commandsMutex.Unlock()
			}

			r.m1bChan <- msg
			break

		case gpaxosproto.M2A:
			msg := new(gpaxosproto.M_2a)
			if err = msg.Unmarshal(reader); err != nil {
				break
			}
			r.m2aChan <- msg
			break

		case gpaxosproto.M2B:
			msg := new(gpaxosproto.M_2b)
			if err = msg.Unmarshal(reader); err != nil {
				break
			}
			//HACK
			for _, cid := range msg.Cids {
				cmd := new(state.Command)
				cmd.Unmarshal(reader)
				r.commandsMutex.Lock()
				if _, present := r.commands[cid]; !present {
					r.commands[cid] = cmd
				}
				r.commandsMutex.Unlock()
			}
			r.m2bChan <- msg
			break

		case gpaxosproto.COMMIT:
			commit := new(gpaxosproto.Commit)
			if err = commit.Unmarshal(reader); err != nil {
				break
			}
			r.commitChan <- commit
			break

		}
	}
	if err != nil {
		log.Println("Error when reading from the connection with replica", rid, err)
		r.Alive[rid] = false
		return err
	}
	return nil
}