Sequantially garbage collect on peers

IPFS garbage collection stops add and remove, so running garbage
collection on all nodes at once would cause many cluster functionalities
to error
Do it sequantially to avoid that problem.
This commit is contained in:
Kishan Mohanbhai Sagathiya 2019-10-22 14:34:11 +05:30
parent 492b5612e7
commit 87d9e4f156

View File

@ -1895,42 +1895,34 @@ func (c *Cluster) RepoGC(ctx context.Context) (*api.GlobalRepoGC, error) {
logger.Error(err)
return nil, err
}
lenMembers := len(members)
ctxs, cancels := rpcutil.CtxsWithCancel(ctx, lenMembers)
defer rpcutil.MultiCancel(cancels)
repoGCsResp := make([]*api.RepoGC, lenMembers, lenMembers)
errs := c.rpcClient.MultiCall(
ctxs,
members,
"Cluster",
"RepoGCLocal",
struct{}{},
rpcutil.CopyRepoGCSliceToIfaces(repoGCsResp),
)
// clubbing `RepoGCLocal` responses of all peers into one
// to club `RepoGCLocal` responses of all peers into one
globalRepoGC := api.GlobalRepoGC{PeerMap: make(map[string]*api.RepoGC)}
for i, resp := range repoGCsResp {
e := errs[i]
if e == nil {
globalRepoGC.PeerMap[peer.IDB58Encode(members[i])] = resp
for _, member := range members {
var repoGC api.RepoGC
err = c.rpcClient.CallContext(
ctx,
member,
"Cluster",
"RepoGCLocal",
struct{}{},
&repoGC,
)
if err == nil {
globalRepoGC.PeerMap[peer.IDB58Encode(member)] = &repoGC
continue
}
if rpc.IsAuthorizationError(e) {
logger.Debug("rpc auth error:", e)
if rpc.IsAuthorizationError(err) {
logger.Debug("rpc auth error:", err)
continue
}
logger.Errorf("%s: error in broadcast response from %s: %s ", c.id, members[i], e)
logger.Errorf("%s: error in broadcast response from %s: %s ", c.id, member, err)
globalRepoGC.PeerMap[peer.IDB58Encode(members[i])] = &api.RepoGC{
Peer: members[i],
Peername: peer.IDB58Encode(members[i]),
globalRepoGC.PeerMap[peer.IDB58Encode(member)] = &api.RepoGC{
Peer: member,
Peername: peer.IDB58Encode(member),
Keys: []api.IPFSRepoGC{},
Error: err.Error(),
}