retry once if EureDB fails to avoid netword occassionally failure (#171)
diff --git a/server/service/mongo/session/session.go b/server/service/mongo/session/session.go
index 4d1378b..4f85031 100644
--- a/server/service/mongo/session/session.go
+++ b/server/service/mongo/session/session.go
@@ -200,10 +200,7 @@
//EnsureDB build mongo db schema
func EnsureDB() {
- session, err := mgo.Dial(config.GetDB().URI)
- if err != nil {
- openlog.Fatal("can not dial db:" + err.Error())
- }
+ session := OpenSession()
defer session.Close()
session.SetMode(mgo.Monotonic, true)
@@ -218,6 +215,26 @@
ensureKVLongPolling(session)
}
+func OpenSession() *mgo.Session {
+ var timeout time.Duration
+ var err error
+ if config.GetDB().Timeout != "" {
+ timeout, err = time.ParseDuration(config.GetDB().Timeout)
+ if err != nil {
+ openlog.Fatal("invalid timeout :" + err.Error())
+ }
+ }
+ session, err := mgo.DialWithTimeout(config.GetDB().URI, timeout)
+ if err != nil {
+ openlog.Warn("can not dial db, retry once:" + err.Error())
+ session, err = mgo.DialWithTimeout(config.GetDB().URI, timeout)
+ if err != nil {
+ openlog.Fatal("can not dial db:" + err.Error())
+ }
+ }
+ return session
+}
+
func ensureKVLongPolling(session *mgo.Session) {
c := session.DB(DBName).C(CollectionPollingDetail)
err := c.Create(&mgo.CollectionInfo{Validator: bson.M{