I am using Rails 3.2.5 and Koala 1.3.0 (not the latest, because the latest refuses to run even the sample Facebook app from Heroku). Web server is Unicorn.
When I try to POST to timeline using put_connections():
@fbgraph = Koala::Facebook::API.new(session[:access_token])
logger.debug "put_connections(#{url_for @room}), start"
@fbgraph.put_connections("me", "myapp:view", :room => url_for(@room))
logger.debug "put_connections(), end"
The controller stalls for 12s before getting an exception:
Completed 500 Internal Server Error in 12075ms
Koala::Facebook::APIError (HTTP 500: Response body: {"error":{"type":"Exception","message":"Could not retrieve data from URL.","code":1660002}}):
I tested with the debug tool: http://developers.facebook.com/tools/debug and it found no error for the URL logged in line 2.
My web server logs a GET from Facebook IP and returns 200 OK. Facebook IP then makes some more requests to fetch images, which also gets 200 OK.
I am testing this on my app's test users FYI.
UPDATE
This seems to be an OpenGraph issue. This problem reproduces for me: https://developers.facebook.com/bugs/213733412077729
Basically the POST is successful only after I test it on the debugger once! Anyone experienced this before?
Figured it out. Of course the debugger thing doesn't make sense. It worked because Facebook then has my view on their cache.
This is a classic reentrancy problem (which I can't believe I have to deal with in Rails!) -- Facebook's POST API is synchronous and it only returns after it calls back to my show controller. But since I only have 1 worker thread, there is no one servicing the request, thus the hang.
The fix is to invoke the API asynchronously in a thread.
Thread.new {
@fbgraph.put_connections("me", "myapp:view", :room => url_for(@room))
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With