diff --git a/cmd/pbm-agent/agent.go b/cmd/pbm-agent/agent.go index 0cbc19ac7..6e4dfcf57 100644 --- a/cmd/pbm-agent/agent.go +++ b/cmd/pbm-agent/agent.go @@ -103,6 +103,9 @@ func (a *Agent) Start(ctx context.Context) error { logger := log.FromContext(ctx) logger.Printf("pbm-agent:\n%s", version.Current().All("")) logger.Printf("node: %s/%s", a.brief.SetName, a.brief.Me) + logger.Printf("conn level ReadConcern: %v; WriteConcern: %v", + a.leadConn.MongoOptions().ReadConcern.Level, + a.leadConn.MongoOptions().WriteConcern.W) c, cerr := ctrl.ListenCmd(ctx, a.leadConn, a.closeCMD) diff --git a/pbm/connect/connect.go b/pbm/connect/connect.go index c70218aaa..728539858 100644 --- a/pbm/connect/connect.go +++ b/pbm/connect/connect.go @@ -41,14 +41,25 @@ func Direct(direct bool) MongoOption { // If the option is not specified the default is: [readconcern.Majority]. func ReadConcern(readConcern *readconcern.ReadConcern) MongoOption { return func(opts *options.ClientOptions) error { - if readConcern == nil { - return errors.New("ReadConcern not specified") + if err := validateReadConcern(readConcern); err != nil { + return err } opts.SetReadConcern(readConcern) return nil } } +func validateReadConcern(readConcern *readconcern.ReadConcern) error { + if readConcern == nil { + return errors.New("ReadConcern not specified") + } + if readConcern.Level != readconcern.Local().Level && + readConcern.Level != readconcern.Majority().Level { + return errors.New("ReadConcern level is not allowed") + } + return nil +} + // WriteConcern option sets level of acknowledgment for write operation. // For PBM typically use: [writeconcern.W1] or [writeconcern.Majority]. // If the option is not specified the default is: [writeconcern.Majority]. @@ -147,6 +158,13 @@ func validateConnStringOpts(opts *options.ClientOptions) error { if err = validateWriteConcern(opts.WriteConcern); err != nil { return err } + if err = validateReadConcern(opts.ReadConcern); err != nil { + return err + } + if opts.ReadConcern.Level == readconcern.Majority().Level && + opts.WriteConcern.W == writeconcern.W1().W { + return errors.New("ReadConcern majority and WriteConcern 1 is not allowed") + } return nil }