fix: select always online peers for remote listing (#11153)

always find the right set of online peers for remote listing,
this may have an effect on listing if the server is down - we
should do this to avoid always performing transient operations
on bucket->peerClient that is permanently or down for a long
period.
This commit is contained in:
Harshavardhana 2020-12-22 09:16:07 -08:00 committed by GitHub
parent 5c451d1690
commit 274bbad5cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 2 deletions

View File

@ -1258,14 +1258,26 @@ func (sys *NotificationSys) GetLocalDiskIDs(ctx context.Context) (localDiskIDs [
return localDiskIDs return localDiskIDs
} }
// returns all the peers that are currently online.
func (sys *NotificationSys) getOnlinePeers() []*peerRESTClient {
var peerClients []*peerRESTClient
for _, peerClient := range sys.allPeerClients {
if peerClient != nil && peerClient.IsOnline() {
peerClients = append(peerClients, peerClient)
}
}
return peerClients
}
// restClientFromHash will return a deterministic peerRESTClient based on s. // restClientFromHash will return a deterministic peerRESTClient based on s.
// Will return nil if client is local. // Will return nil if client is local.
func (sys *NotificationSys) restClientFromHash(s string) (client *peerRESTClient) { func (sys *NotificationSys) restClientFromHash(s string) (client *peerRESTClient) {
if len(sys.peerClients) == 0 { if len(sys.peerClients) == 0 {
return nil return nil
} }
idx := xxhash.Sum64String(s) % uint64(len(sys.allPeerClients)) peerClients := sys.getOnlinePeers()
return sys.allPeerClients[idx] idx := xxhash.Sum64String(s) % uint64(len(peerClients))
return peerClients[idx]
} }
// NewNotificationSys - creates new notification system object. // NewNotificationSys - creates new notification system object.

View File

@ -78,6 +78,11 @@ func (client *peerRESTClient) String() string {
return client.host.String() return client.host.String()
} }
// IsOnline returns true if the peer client is online.
func (client *peerRESTClient) IsOnline() bool {
return client.restClient.IsOnline()
}
// Close - marks the client as closed. // Close - marks the client as closed.
func (client *peerRESTClient) Close() error { func (client *peerRESTClient) Close() error {
client.restClient.Close() client.restClient.Close()