func (self *Conn) mergeRecent(operation string, r common.Range, up bool) (result []common.Item) { currentRedundancy := self.ring.Redundancy() futures := make([]*rpc.Call, currentRedundancy) results := make([]*[]common.Item, currentRedundancy) nodes := make(common.Remotes, currentRedundancy) nextKey := r.Key var nextSuccessor *common.Remote for i := 0; i < currentRedundancy; i++ { _, _, nextSuccessor = self.ring.Remotes(nextKey) var thisResult []common.Item nodes[i] = *nextSuccessor results[i] = &thisResult futures[i] = nextSuccessor.Go(operation, r, &thisResult) nextKey = nextSuccessor.Pos } for index, future := range futures { <-future.Done if future.Error != nil { self.removeNode(nodes[index]) return self.mergeRecent(operation, r, up) } } result = common.MergeItems(results, up) return }
func (self *Conn) findRecent(operation string, data common.Item) (result *common.Item) { currentRedundancy := self.ring.Redundancy() futures := make([]*rpc.Call, currentRedundancy) results := make([]*common.Item, currentRedundancy) nodes := make(common.Remotes, currentRedundancy) nextKey := data.Key var nextSuccessor *common.Remote for i := 0; i < currentRedundancy; i++ { _, _, nextSuccessor = self.ring.Remotes(nextKey) thisResult := &common.Item{} nodes[i] = *nextSuccessor results[i] = thisResult futures[i] = nextSuccessor.Go(operation, data, thisResult) nextKey = nextSuccessor.Pos } for index, future := range futures { <-future.Done if future.Error != nil { self.removeNode(nodes[index]) return self.findRecent(operation, data) } if result == nil || result.Timestamp < results[index].Timestamp { result = results[index] } } return }
func (self *Conn) putVia(succ *common.Remote, key, value []byte, sync bool) { data := common.Item{ Key: key, Value: value, Sync: sync, } var x int if err := succ.Call("DHash.Put", data, &x); err != nil { self.removeNode(*succ) _, _, newSuccessor := self.ring.Remotes(key) *succ = *newSuccessor self.putVia(succ, key, value, sync) } }