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) 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 }