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{