Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   Interesting problem with memcache-client and sockets (http://www.velocityreviews.com/forums/t847999-interesting-problem-with-memcache-client-and-sockets.html)

Jakanapes 02-08-2008 01:56 PM

Interesting problem with memcache-client and sockets
 
Hi all,

Been writing unit tests and found an interesting problem.

We're using memcache on a web app and wanted to test that the proper
exceptions would be thrown if the memcache server went down.

If memcache server is started, then killed, then a set or a get is
called, the MemCacheError exception is always rescued.

However, if memcache server is started, a set and get is called, the
server is killed, then about half the time if a set is called, no
exception. If a get is called, always an exception.

I tracked it down to the set method in memcache.rb
************************
def set(key, value, expiry = 0, raw = false)
raise MemCacheError, "Update of readonly cache" if @readonly
server, cache_key = request_setup key
socket = server.socket

value = Marshal.dump value unless raw
command = "set #{cache_key} 0 #{expiry} #{value.size}\r\n#{value}\r
\n"

begin
@mutex.lock if @multithread
socket.write command
result = socket.gets
raise MemCacheError, $1.strip if result =~ /^SERVER_ERROR (.*)/
rescue SocketError, SystemCallError, IOError => err
server.close
raise MemCacheError, err.message
ensure
@mutex.unlock if @multithread
end
end
******************************************
I found that in some cases socket.write command would throw the
appropriate IOError, but that sometimes it would return OK and result
would be 'nil'

I added this code

if result.nil?
server.close
raise MemCacheError, "No MemCache Server"
end

and that throws my exception, but that seems pretty hackish and I'd
like to get a better understanding of the problem.

What's interesting to me is that it only happens if a set was called
while the memcache server was up, then another called after the server
was stopped. It never happens if the memcache object has never
successfully done a set. Meanwhile, a get will always throw an
exception, though different ones ( connection reset by peer and lost
connection to localhost:11211 ) about equally.

memcache-client 1.5
ruby 1.8.6 (2007-09-23 patchlevel 110) [i686-darwin8.11.1]

running on Mac OS 10.4

memcached 1.2.4

Any thoughts are appreciated.


All times are GMT. The time now is 09:26 AM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.