mirror of https://github.com/minio/minio.git
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:
parent
5c451d1690
commit
274bbad5cb
|
@ -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.
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue