From 17eeec6895242997ba8d8aecdb5a2579006d4984 Mon Sep 17 00:00:00 2001 From: Aditya Manthramurthy Date: Fri, 14 Oct 2016 22:49:51 -0700 Subject: [PATCH] Bucket policy propagation (Fixes #2930) (#2932) Fixes a serialisation bug - encoding/gob does not directly support serializing `map[string]interface{}`, so we serialise to JSON and send a byte array in the RPC call, and deserialize and update on the receiver. --- cmd/s3-peer-client.go | 8 +++++++- cmd/s3-peer-rpc-handlers.go | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/cmd/s3-peer-client.go b/cmd/s3-peer-client.go index 7b4607040..a9f0a1ece 100644 --- a/cmd/s3-peer-client.go +++ b/cmd/s3-peer-client.go @@ -17,6 +17,7 @@ package cmd import ( + "encoding/json" "fmt" "path" "sync" @@ -213,7 +214,12 @@ func S3PeersUpdateBucketListener(bucket string, lcfg []listenerConfig) { // S3PeersUpdateBucketPolicy - Sends update bucket policy request to // all peers. Currently we log an error and continue. func S3PeersUpdateBucketPolicy(bucket string, pCh policyChange) { - setBPPArgs := &SetBPPArgs{Bucket: bucket, PCh: pCh} + byts, err := json.Marshal(pCh) + if err != nil { + errorIf(err, "Failed to marshal policyChange - this is a BUG!") + return + } + setBPPArgs := &SetBPPArgs{Bucket: bucket, PChBytes: byts} peers := globalS3Peers.GetPeers() errsMap := globalS3Peers.SendRPC(peers, "S3.SetBucketPolicyPeer", setBPPArgs) for peer, err := range errsMap { diff --git a/cmd/s3-peer-rpc-handlers.go b/cmd/s3-peer-rpc-handlers.go index 580bc3a33..e412738d7 100644 --- a/cmd/s3-peer-rpc-handlers.go +++ b/cmd/s3-peer-rpc-handlers.go @@ -16,7 +16,10 @@ package cmd -import "time" +import ( + "encoding/json" + "time" +) func (s3 *s3PeerAPIHandlers) LoginHandler(args *RPCLoginArgs, reply *RPCLoginReply) error { jwt, err := newJWT(defaultInterNodeJWTExpiry) @@ -128,8 +131,8 @@ type SetBPPArgs struct { Bucket string - // policy config - PCh policyChange + // Policy change (serialized to JSON) + PChBytes []byte } // tell receiving server to update a bucket policy @@ -145,5 +148,10 @@ func (s3 *s3PeerAPIHandlers) SetBucketPolicyPeer(args SetBPPArgs, reply *Generic return errServerNotInitialized } - return globalBucketPolicies.SetBucketPolicy(args.Bucket, args.PCh) + var pCh policyChange + if err := json.Unmarshal(args.PChBytes, &pCh); err != nil { + return err + } + + return globalBucketPolicies.SetBucketPolicy(args.Bucket, pCh) }