em-synchrony icon indicating copy to clipboard operation
em-synchrony copied to clipboard

MongoDB Socket Exception breaks inserts

Open tobyhede opened this issue 13 years ago • 6 comments

Run into a weird one.

I cannot insert when using 'em-synchrony/em-mongo' , but I can read.

My insert code is pretty much lifted from the specs:

EventMachine.synchrony do
  db = EM::Mongo::Connection.new("localhost", 27017).db('hot_test')
  collection = db.collection('test')

  collection.insert(:name => 'two', :position => 1)
  EventMachine.stop
end

I can insert using the 'regular' em-mongo gem with EventMachine.

I am seeing a SocketException in the mongo log.

Sun Dec 25 13:15:42 [initandlisten] connection accepted from 127.0.0.1:51392 #4
Sun Dec 25 13:15:42 [conn4] Socket recv() conn closed? 127.0.0.1:51392
Sun Dec 25 13:15:42 [conn4] SocketException: remote: 127.0.0.1:51392 error: 9001 socket exception [0] server [127.0.0.1:51392] 
Sun Dec 25 13:15:42 [conn4] end connection 127.0.0.1:51392

This Exception also occurs when reading, but the values the read works:

Sun Dec 25 13:13:37 [initandlisten] connection accepted from 127.0.0.1:51378 #2
Sun Dec 25 13:13:37 [conn2] runQuery called hot_test.test {}
Sun Dec 25 13:13:37 [conn2]    used cursor: 0x102603a70
Sun Dec 25 13:13:37 [conn2] query hot_test.test nreturned:1 reslen:70 0ms
Sun Dec 25 13:13:37 [conn2] Socket recv() conn closed? 127.0.0.1:51378
Sun Dec 25 13:13:37 [conn2] SocketException: remote: 127.0.0.1:51378 error: 9001 socket exception [0] server [127.0.0.1:51378]

Using MongoDB v2.0.1 on OS X.

tobyhede avatar Dec 25 '11 02:12 tobyhede

The plot thickens.

If I have a reference to collection.find in my code, everything suddenly works as expected.

So the following will do the insert:

EventMachine.synchrony do
  db = EM::Mongo::Connection.new("localhost", 27017).db('hot_test')
  collection = db.collection('test')

  collection.insert(:name => 'two', :position => 1)
  collection.find
  EventMachine.stop
end

If I remove collection.find, the insert does nothing.

In all cases I see the SocketException in the mongo log

tobyhede avatar Dec 25 '11 22:12 tobyhede

Toby, currently em-synchrony only patches the find methods in em-mongo: https://github.com/igrigorik/em-synchrony/blob/master/lib/em-synchrony/em-mongo.rb#L62

Sorry about the confusion with this.. Two things we can do: (a) extend the patch to more methods, or (b) for a "quick fix" you can use Synchrony.sync interface to make the insert operations behave as you would expect.

igrigorik avatar Dec 27 '11 16:12 igrigorik

FYI: https://github.com/igrigorik/em-synchrony/pull/98

igrigorik avatar Dec 27 '11 16:12 igrigorik

Thanks for the info. Had me stumped, but eventually had discovered the missing methods and started my own implementation. May progress with this while keeping an eye on these other branches to see what I may be able to contribute.

tobyhede avatar Jan 02 '12 00:01 tobyhede

@tobyhede - I just updated my branch on that pull request with more functions wrapped or rewritten. Would love to both see your work and get your thoughts on the work I've done so far. As of right now, I'm close to code complete, am moving onto testing/bug fixing unless someone finds something wrong or broken.

We're going to try and put this into production soon (Weeks), so would love to get another set of eyes and or opinions into the mix.

Sujal

sujal avatar Jan 03 '12 05:01 sujal

Any updates on this?

igrigorik avatar Jun 18 '12 23:06 igrigorik