From 6fd6ed620eb8d831eddae3eafc465c9b3cb8a46d Mon Sep 17 00:00:00 2001 From: Jeff Mitchell Date: Fri, 7 Jul 2017 10:38:55 -0400 Subject: [PATCH 1/3] Add some reconnection logic in case of EOF in Mongo --- plugins/database/mongodb/mongodb.go | 35 +++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/plugins/database/mongodb/mongodb.go b/plugins/database/mongodb/mongodb.go index 31fdd85cc82a..8c4556179a92 100644 --- a/plugins/database/mongodb/mongodb.go +++ b/plugins/database/mongodb/mongodb.go @@ -1,12 +1,14 @@ package mongodb import ( + "io" "time" "encoding/json" "fmt" + "github.com/hashicorp/errwrap" "github.com/hashicorp/vault/api" "github.com/hashicorp/vault/builtin/logical/database/dbplugin" "github.com/hashicorp/vault/plugins" @@ -124,7 +126,21 @@ func (m *MongoDB) CreateUser(statements dbplugin.Statements, usernameConfig dbpl } err = session.DB(mongoCS.DB).Run(createUserCmd, nil) - if err != nil { + switch err { + case nil: + case io.EOF: + if err := m.ConnectionProducer.Close(); err != nil { + return "", "", errwrap.Wrapf("error closing EOF'd mongo connection: {{err}}", err) + } + session, err := m.getConnection() + if err != nil { + return "", "", err + } + err = session.DB(mongoCS.DB).Run(createUserCmd, nil) + if err != nil { + return "", "", err + } + default: return "", "", err } @@ -165,7 +181,22 @@ func (m *MongoDB) RevokeUser(statements dbplugin.Statements, username string) er } err = session.DB(db).RemoveUser(username) - if err != nil && err != mgo.ErrNotFound { + switch err { + case nil: + case mgo.ErrNotFound: + case io.EOF: + if err := m.ConnectionProducer.Close(); err != nil { + return errwrap.Wrapf("error closing EOF'd mongo connection: {{err}}", err) + } + session, err := m.getConnection() + if err != nil { + return err + } + err = session.DB(db).RemoveUser(username) + if err != nil { + return err + } + default: return err } From e032b2ae324663976d76c042b7de61ef7df976e0 Mon Sep 17 00:00:00 2001 From: Jeff Mitchell Date: Tue, 18 Jul 2017 19:20:10 -0400 Subject: [PATCH 2/3] Check error string in addition to type for EOF --- plugins/database/mongodb/mongodb.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/database/mongodb/mongodb.go b/plugins/database/mongodb/mongodb.go index 8c4556179a92..cc0f1ab8ef17 100644 --- a/plugins/database/mongodb/mongodb.go +++ b/plugins/database/mongodb/mongodb.go @@ -2,6 +2,7 @@ package mongodb import ( "io" + "strings" "time" "encoding/json" @@ -128,7 +129,7 @@ func (m *MongoDB) CreateUser(statements dbplugin.Statements, usernameConfig dbpl err = session.DB(mongoCS.DB).Run(createUserCmd, nil) switch err { case nil: - case io.EOF: + case io.EOF || strings.Contains(err.Error(), "EOF"): if err := m.ConnectionProducer.Close(); err != nil { return "", "", errwrap.Wrapf("error closing EOF'd mongo connection: {{err}}", err) } @@ -184,7 +185,7 @@ func (m *MongoDB) RevokeUser(statements dbplugin.Statements, username string) er switch err { case nil: case mgo.ErrNotFound: - case io.EOF: + case io.EOF || strings.Contains(err.Error(), "EOF"): if err := m.ConnectionProducer.Close(); err != nil { return errwrap.Wrapf("error closing EOF'd mongo connection: {{err}}", err) } From cc62d2b6fc8afaf5bb57e56f46691fa17000d85c Mon Sep 17 00:00:00 2001 From: Jeff Mitchell Date: Thu, 31 Aug 2017 16:30:08 -0400 Subject: [PATCH 3/3] Fix compilation --- plugins/database/mongodb/mongodb.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/plugins/database/mongodb/mongodb.go b/plugins/database/mongodb/mongodb.go index cc0f1ab8ef17..52671dae2f5c 100644 --- a/plugins/database/mongodb/mongodb.go +++ b/plugins/database/mongodb/mongodb.go @@ -127,9 +127,9 @@ func (m *MongoDB) CreateUser(statements dbplugin.Statements, usernameConfig dbpl } err = session.DB(mongoCS.DB).Run(createUserCmd, nil) - switch err { - case nil: - case io.EOF || strings.Contains(err.Error(), "EOF"): + switch { + case err == nil: + case err == io.EOF, strings.Contains(err.Error(), "EOF"): if err := m.ConnectionProducer.Close(); err != nil { return "", "", errwrap.Wrapf("error closing EOF'd mongo connection: {{err}}", err) } @@ -182,10 +182,9 @@ func (m *MongoDB) RevokeUser(statements dbplugin.Statements, username string) er } err = session.DB(db).RemoveUser(username) - switch err { - case nil: - case mgo.ErrNotFound: - case io.EOF || strings.Contains(err.Error(), "EOF"): + switch { + case err == nil, err == mgo.ErrNotFound: + case err == io.EOF, strings.Contains(err.Error(), "EOF"): if err := m.ConnectionProducer.Close(); err != nil { return errwrap.Wrapf("error closing EOF'd mongo connection: {{err}}", err) }