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:
parent
492b5612e7
commit
87d9e4f156
46
cluster.go
46
cluster.go
|
@ -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(),
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user