func (self *CoordinatorImpl) sendRequestToReplicas(request *protocol.Request, replicas []*ClusterServer) { for _, server := range replicas { if server.Id != self.clusterConfiguration.localServerId { err := server.MakeRequest(request, nil) if err != nil { log.Warn("REPLICATION ERROR: ", request.GetSequenceNumber(), err) } } } }
func (self *ProtobufRequestHandler) HandleRequest(request *protocol.Request, conn net.Conn) error { if *request.Type == protocol.Request_PROXY_WRITE { response := &protocol.Response{RequestId: request.Id, Type: &self.writeOk} request.OriginatingServerId = &self.clusterConfig.localServerId // TODO: make request logging and datastore write atomic replicationFactor := self.clusterConfig.GetReplicationFactor(request.Database) err := self.db.LogRequestAndAssignSequenceNumber(request, &replicationFactor, request.OwnerServerId) if err != nil { return err } err = self.db.WriteSeriesData(*request.Database, request.Series) if err != nil { return err } err = self.WriteResponse(conn, response) // TODO: add quorum writes? self.coordinator.ReplicateWrite(request) return err } else if *request.Type == protocol.Request_PROXY_DROP_SERIES { response := &protocol.Response{RequestId: request.Id, Type: &self.writeOk} request.OriginatingServerId = &self.clusterConfig.localServerId replicationFactor := uint8(*request.ReplicationFactor) // TODO: make request logging and datastore write atomic err := self.db.LogRequestAndAssignSequenceNumber(request, &replicationFactor, request.OwnerServerId) if err != nil { return err } err = self.db.DropSeries(*request.Database, *request.Series.Name) if err != nil { return err } err = self.WriteResponse(conn, response) self.coordinator.ReplicateWrite(request) return err } else if *request.Type == protocol.Request_REPLICATION_DROP_SERIES { replicationFactor := uint8(*request.ReplicationFactor) // TODO: make request logging and datastore write atomic err := self.db.LogRequestAndAssignSequenceNumber(request, &replicationFactor, request.OwnerServerId) if err != nil { switch err := err.(type) { case datastore.SequenceMissingRequestsError: log.Warn("Missing sequence number error: Request SN: %v Last Known SN: %v", request.GetSequenceNumber(), err.LastKnownRequestSequence) go self.coordinator.ReplayReplication(request, &replicationFactor, request.OwnerServerId, &err.LastKnownRequestSequence) return nil default: return err } } return self.db.DropSeries(*request.Database, *request.Series.Name) } else if *request.Type == protocol.Request_PROXY_DROP_DATABASE { response := &protocol.Response{RequestId: request.Id, Type: &self.writeOk} request.OriginatingServerId = &self.clusterConfig.localServerId replicationFactor := uint8(*request.ReplicationFactor) // TODO: make request logging and datastore write atomic err := self.db.LogRequestAndAssignSequenceNumber(request, &replicationFactor, request.OwnerServerId) if err != nil { return err } err = self.db.DropDatabase(*request.Database) if err != nil { return err } err = self.WriteResponse(conn, response) self.coordinator.ReplicateWrite(request) return err } else if *request.Type == protocol.Request_REPLICATION_DROP_DATABASE { replicationFactor := uint8(*request.ReplicationFactor) // TODO: make request logging and datastore write atomic err := self.db.LogRequestAndAssignSequenceNumber(request, &replicationFactor, request.OwnerServerId) if err != nil { switch err := err.(type) { case datastore.SequenceMissingRequestsError: log.Warn("Missing sequence number error: Request SN: %v Last Known SN: %v", request.GetSequenceNumber(), err.LastKnownRequestSequence) go self.coordinator.ReplayReplication(request, &replicationFactor, request.OwnerServerId, &err.LastKnownRequestSequence) return nil default: return err } } return self.db.DropDatabase(*request.Database) } else if *request.Type == protocol.Request_PROXY_DELETE { response := &protocol.Response{RequestId: request.Id, Type: &self.writeOk} request.OriginatingServerId = &self.clusterConfig.localServerId // TODO: make request logging and datastore write atomic replicationFactor := self.clusterConfig.GetReplicationFactor(request.Database) err := self.db.LogRequestAndAssignSequenceNumber(request, &replicationFactor, request.OwnerServerId) if err != nil { return err } query, err := parser.ParseQuery(*request.Query) if err != nil { return err } err = self.db.DeleteSeriesData(*request.Database, query[0].DeleteQuery) if err != nil { return err } err = self.WriteResponse(conn, response) // TODO: add quorum writes? self.coordinator.ReplicateDelete(request) return err } else if *request.Type == protocol.Request_REPLICATION_WRITE { replicationFactor := self.clusterConfig.GetReplicationFactor(request.Database) // TODO: make request logging and datastore write atomic err := self.db.LogRequestAndAssignSequenceNumber(request, &replicationFactor, request.OwnerServerId) if err != nil { switch err := err.(type) { case datastore.SequenceMissingRequestsError: log.Warn("Missing sequence number error: Request SN: %v Last Known SN: %v", request.GetSequenceNumber(), err.LastKnownRequestSequence) go self.coordinator.ReplayReplication(request, &replicationFactor, request.OwnerServerId, &err.LastKnownRequestSequence) return nil default: return err } } self.db.WriteSeriesData(*request.Database, request.Series) return nil } else if *request.Type == protocol.Request_REPLICATION_DELETE { replicationFactor := self.clusterConfig.GetReplicationFactor(request.Database) // TODO: make request logging and datastore write atomic err := self.db.LogRequestAndAssignSequenceNumber(request, &replicationFactor, request.OwnerServerId) if err != nil { switch err := err.(type) { case datastore.SequenceMissingRequestsError: go self.coordinator.ReplayReplication(request, &replicationFactor, request.OwnerServerId, &err.LastKnownRequestSequence) return nil default: return err } } query, err := parser.ParseQuery(*request.Query) if err != nil { return err } return self.db.DeleteSeriesData(*request.Database, query[0].DeleteQuery) } else if *request.Type == protocol.Request_QUERY { go self.handleQuery(request, conn) } else if *request.Type == protocol.Request_LIST_SERIES { go self.handleListSeries(request, conn) } else if *request.Type == protocol.Request_REPLICATION_REPLAY { self.handleReplay(request, conn) } else if *request.Type == protocol.Request_SEQUENCE_NUMBER { self.handleSequenceNumberRequest(request, conn) } else { log.Error("unknown request type: %v", request) return errors.New("Unknown request type") } return nil }