Make it clearer

This commit is contained in:
Kishan Mohanbhai Sagathiya 2019-11-08 19:45:01 +05:30
parent 108fcff8a9
commit 0e7ed97e59
2 changed files with 50 additions and 39 deletions

View File

@ -1678,6 +1678,18 @@ func (c *Cluster) getTrustedPeers(ctx context.Context) ([]peer.ID, error) {
return trustedPeers, nil
}
func setTrackerStatus(gpin *api.GlobalPinInfo, h cid.Cid, peers []peer.ID, status api.TrackerStatus, t time.Time) {
for _, p := range peers {
gpin.PeerMap[peer.IDB58Encode(p)] = &api.PinInfo{
Cid: h,
Peer: p,
PeerName: p.String(),
Status: status,
TS: t,
}
}
}
func (c *Cluster) globalPinInfoCid(ctx context.Context, comp, method string, h cid.Cid) (*api.GlobalPinInfo, error) {
ctx, span := trace.StartSpan(ctx, "cluster/globalPinInfoCid")
defer span.End()
@ -1687,15 +1699,17 @@ func (c *Cluster) globalPinInfoCid(ctx context.Context, comp, method string, h c
PeerMap: make(map[string]*api.PinInfo),
}
var dests []peer.ID
var members []peer.ID
var err error
var remote []peer.ID
timeNow := time.Now()
// set dests (allocated peers, we will contact them through rpc) and remote (un-allocated peers,
// we will set remote status)
if c.config.FollowerMode {
// during follower mode return status only on self peer
dests = []peer.ID{c.host.ID()}
remote = []peer.ID{}
} else {
members, err = c.consensus.Peers(ctx)
members, err := c.consensus.Peers(ctx)
if err != nil {
logger.Error(err)
return nil, err
@ -1703,31 +1717,27 @@ func (c *Cluster) globalPinInfoCid(ctx context.Context, comp, method string, h c
// If pin is not part of the pinset, mark it unpinned
pin, err := c.PinGet(ctx, h)
if err == state.ErrNotFound {
setTrackerStatus(gpin, h, members, api.TrackerStatusUnpinned, timeNow)
return gpin, nil
}
if err != nil {
if err != state.ErrNotFound {
logger.Error(err)
return nil, err
}
for _, member := range members {
gpin.PeerMap[peer.IDB58Encode(member)] = &api.PinInfo{
Cid: h,
Peer: member,
PeerName: member.String(),
Status: api.TrackerStatusUnpinned,
TS: timeNow,
}
}
return gpin, nil
}
if len(pin.Allocations) > 0 {
dests = pin.Allocations
remote = peersSubtract(members, dests)
} else {
dests = members
remote = []peer.ID{}
}
}
// set status remote on un-allocated peers
setTrackerStatus(gpin, h, remote, api.TrackerStatusRemote, timeNow)
lenDests := len(dests)
replies := make([]*api.PinInfo, lenDests, lenDests)
ctxs, cancels := rpcutil.CtxsWithCancel(ctx, lenDests)
@ -1768,27 +1778,6 @@ func (c *Cluster) globalPinInfoCid(ctx context.Context, comp, method string, h c
}
}
if c.config.FollowerMode || len(dests) == len(members) {
return gpin, nil
}
// set status remote on un-allocated peers
for _, member := range members {
id := peer.IDB58Encode(member)
_, ok := gpin.PeerMap[id]
if ok {
continue
}
gpin.PeerMap[id] = &api.PinInfo{
Cid: h,
Peer: member,
PeerName: member.String(),
Status: api.TrackerStatusRemote,
TS: timeNow,
}
}
return gpin, nil
}

22
util.go
View File

@ -146,3 +146,25 @@ func xor(a, b distance) distance {
}
return c
}
// peersSubtract subtracts peers ID slice b from peers ID slice a.
func peersSubtract(a []peer.ID, b []peer.ID) []peer.ID {
lenb := len(b)
result := make([]peer.ID, len(a)-lenb)
bMap := make(map[peer.ID]struct{}, lenb)
for _, p := range b {
bMap[p] = struct{}{}
}
for _, p := range a {
_, ok := bMap[p]
if ok {
continue
}
result = append(result, p)
}
return result
}