machete
machete

Reputation: 1157

Go Lang and Labix mgo - getting EOF after subsequent requests

I have a web process, similar to

func main() {
    // mgo
    mongoDatabase, err := mgopath.Connect(envMongoPath)
    if err != nil {
        log.Fatal(err)
    }

    r := mux.NewRouter()
    // ....
    r.HandleFunc("/apps/{app:.+}", stuffHandler(mongoDatabase)).Methods("GET")
    http.Handle("/", r)

    listen := fmt.Sprintf("%s:%s", host, port)
    log.Fatal(http.ListenAndServe(listen, nil))
}

while mgopath.Connect looks like

func Connect(mongoPath string) (*mgo.Database, error) {
    dbConfig, err := url.Parse(mongoPath)
    if err != nil {
        return nil, err
    }

    log.Printf("Connecting to %s", dbConfig.Host)
    sess, err := mgo.Dial(dbConfig.Host)
    if err != nil {
        return nil, err
    }

    dbName := dbConfig.Path
    log.Printf("Using database %s", dbName)
    if len(dbName) < 2 {
        return nil, errors.New("No database name specified.")
    }

    dbName = dbConfig.Path[1:len(dbConfig.Path)]
    return sess.DB(dbName), err
}

Somewhere down the road:

c := database.C("stuff")
err = c.Find(bson.M{"id": id}).One(&item) // First ~1-2 minutes work as expected, then I receive EOFs
// c.Insert(), c.Update(), c.All()...

The problem is, that after a couple of minutes, all queries to mongodb return the error EOF. I have to restart the process to get things working again. Experienced both issues on Mac and (more frequently) on Windows. MongoDB runs inside of Docker, which in turn runs inside of boot2docker. VM Port forwarding have been done (that's why queries work for a certain amount of time).

Does mgo require me to dial every time I'm doing a query? Is there some timeout I don't know about?

Upvotes: 3

Views: 3049

Answers (2)

lee
lee

Reputation: 9

session.Copy may create many many connections to mongodb, in big projects, you may got "too many files open", so you can try this:

https://github.com/ti/mdb

this will auto call session.refresh if your connection is not stable.

less connection and less error, for retry policy.

Upvotes: 1

machete
machete

Reputation: 1157

The answer can be found here: https://groups.google.com/forum/#!topic/mgo-users/XM0rc6p-V-8

There are two easy ways to get rid of the error:

1) Call Refresh on the session, which makes it discard (or put back in the pool, if the connection is good) the connection it's holding, and pick a new one when necessary.

2) Instead of using a single session, use many by calling session.Copy when you need a new session, and then call session.Close when you're done with it. This will also mean you're using multiple connections to the database, when necessary.

Upvotes: 4

Related Questions