From c209b681661430f3d0f834ca43c6891d4b758dfb Mon Sep 17 00:00:00 2001 From: Carlos Salguero Date: Mon, 20 Feb 2017 14:57:40 -0300 Subject: [PATCH] PT-74 Fixed getSecuritySettings func On some servers, like a mongos with config servers, this fails if session mode is Monotonic. On some other servers like a secondary in a replica set, this fails if the session mode is Strong. Added a new func to try to get this info using both modes if necessary. --- src/go/pt-mongodb-summary/main.go | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/go/pt-mongodb-summary/main.go b/src/go/pt-mongodb-summary/main.go index 574512ac..25017c49 100644 --- a/src/go/pt-mongodb-summary/main.go +++ b/src/go/pt-mongodb-summary/main.go @@ -466,19 +466,36 @@ func GetSecuritySettings(session pmgo.SessionManager, ver string) (*security, er } } - s.Users, _ = session.DB("admin").C("system.users").Count() - if err != nil { - return nil, errors.Wrap(err, "cannot get users count") - } + // On some servers, like a mongos with config servers, this fails if session mode is Monotonic + // On some other servers like a secondary in a replica set, this fails if the session mode is Strong. + // Lets try both + newSession := session.Clone() + defer newSession.Close() + newSession.SetMode(mgo.Strong, true) - s.Roles, err = session.DB("admin").C("system.roles").Count() - if err != nil { - return nil, errors.Wrap(err, "cannot get roles count") + if s.Users, s.Roles, err = getUserRolesCount(newSession); err != nil { + newSession.SetMode(mgo.Monotonic, true) + if s.Users, s.Roles, err = getUserRolesCount(newSession); err != nil { + return nil, errors.Wrap(err, "cannot get security settings.") + } } return &s, nil } +func getUserRolesCount(session pmgo.SessionManager) (int, int, error) { + users, err := session.DB("admin").C("system.users").Count() + if err != nil { + return 0, 0, errors.Wrap(err, "cannot get users count") + } + + roles, err := session.DB("admin").C("system.roles").Count() + if err != nil { + return 0, 0, errors.Wrap(err, "cannot get roles count") + } + return users, roles, nil +} + func getNodeType(session pmgo.SessionManager) (string, error) { md := proto.MasterDoc{} err := session.Run("isMaster", &md)