diff --git a/cmd/bucket-metadata.go b/cmd/bucket-metadata.go index ab14d7e6a..9339c553f 100644 --- a/cmd/bucket-metadata.go +++ b/cmd/bucket-metadata.go @@ -37,6 +37,11 @@ type BucketMetaState interface { SendEvent(args *EventArgs) error } +// BucketUpdater - Interface implementer calls one of BucketMetaState's methods. +type BucketUpdater interface { + BucketUpdate(client BucketMetaState) error +} + // Type that implements BucketMetaState for local node. type localBucketMetaState struct { ObjectAPI func() ObjectLayer diff --git a/cmd/s3-peer-client.go b/cmd/s3-peer-client.go index e93ce39d4..758256f8b 100644 --- a/cmd/s3-peer-client.go +++ b/cmd/s3-peer-client.go @@ -108,7 +108,7 @@ func (s3p s3Peers) GetPeerClient(peer string) BucketMetaState { // The updates are sent via a type implementing the BucketMetaState // interface. This makes sure that the local node is directly updated, // and remote nodes are updated via RPC calls. -func (s3p s3Peers) SendUpdate(peerIndex []int, args interface{}) []error { +func (s3p s3Peers) SendUpdate(peerIndex []int, args BucketUpdater) []error { // peer error array errs := make([]error, len(s3p)) @@ -119,27 +119,7 @@ func (s3p s3Peers) SendUpdate(peerIndex []int, args interface{}) []error { // Function that sends update to peer at `index` sendUpdateToPeer := func(index int) { defer wg.Done() - var err error - // Get BMS client for peer at `index`. The index is - // already checked for being within array bounds. - client := s3p[index].bmsClient - - // Make the appropriate bucket metadata update - // according to the argument type - switch v := args.(type) { - case *SetBucketNotificationPeerArgs: - err = client.UpdateBucketNotification(v) - - case *SetBucketListenerPeerArgs: - err = client.UpdateBucketListener(v) - - case *SetBucketPolicyPeerArgs: - err = client.UpdateBucketPolicy(v) - - default: - err = fmt.Errorf("Unknown arg in BucketMetaState updater - %v", args) - } - errs[index] = err + errs[index] = args.BucketUpdate(s3p[index].bmsClient) } // Special (but common) case of peerIndex == nil, implies send diff --git a/cmd/s3-peer-rpc-handlers.go b/cmd/s3-peer-rpc-handlers.go index f4f992ebb..24424ced3 100644 --- a/cmd/s3-peer-rpc-handlers.go +++ b/cmd/s3-peer-rpc-handlers.go @@ -48,6 +48,10 @@ type SetBucketNotificationPeerArgs struct { NCfg *notificationConfig } +func (s *SetBucketNotificationPeerArgs) BucketUpdate(client BucketMetaState) error { + return client.UpdateBucketNotification(s) +} + func (s3 *s3PeerAPIHandlers) SetBucketNotificationPeer(args *SetBucketNotificationPeerArgs, reply *GenericReply) error { // check auth if !isRPCTokenValid(args.Token) { @@ -68,6 +72,10 @@ type SetBucketListenerPeerArgs struct { LCfg []listenerConfig } +func (s *SetBucketListenerPeerArgs) BucketUpdate(client BucketMetaState) error { + return client.UpdateBucketListener(s) +} + func (s3 *s3PeerAPIHandlers) SetBucketListenerPeer(args *SetBucketListenerPeerArgs, reply *GenericReply) error { // check auth if !isRPCTokenValid(args.Token) { @@ -110,6 +118,10 @@ type SetBucketPolicyPeerArgs struct { PChBytes []byte } +func (s *SetBucketPolicyPeerArgs) BucketUpdate(client BucketMetaState) error { + return client.UpdateBucketPolicy(s) +} + // tell receiving server to update a bucket policy func (s3 *s3PeerAPIHandlers) SetBucketPolicyPeer(args *SetBucketPolicyPeerArgs, reply *GenericReply) error { // check auth