Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enyim Memcached Client does not write / read data

Tags:

c#

memcached

I've installed memcached on Windows as a service, listening on the default port 11211. I know this works, because I can telnet to the server and carry out get / set commands without any problems.

I've then downloaded the Enyim Memcached client (Enyim.Caching.dll, version 2.7) and written a simple test program:

var mcc = new MemcachedClientConfiguration();
mcc.AddServer("127.0.0.1:11211");
mcc.SocketPool.ReceiveTimeout = new TimeSpan(0, 0, 10);
mcc.SocketPool.ConnectionTimeout = new TimeSpan(0, 0, 10);
mcc.SocketPool.DeadTimeout = new TimeSpan(0, 0, 20);

using (MemcachedClient client = new MemcachedClient(mcc))
{
    client.Store(StoreMode.Set, "enyimtest", "test value");
    Console.WriteLine(client.Get<string>("enyimtest"));
}

I know this connects to my server correctly, as calling the stats command in telnet shows an increase in the number of connections. However, it doesn't call get or set, as the cmd_get and cmd_set stats counters remain constant. The call to client.Get returns null.

The program does not error in any way. Does anyone know what could prevent the Enyim client from working in this situation?

EDIT:

Looks like this is caused by a timeout. Afer configuring log4net to capture the client's logging output, I found it contained the following (in addition to other stack trace items):

2010-12-17 14:26:37,579 [1] ERROR Enyim.Caching.Memcached.MemcachedNode [(null)] - System.IO.IOException: Failed to read from the socket '172.23.0.100:11211'. Error: TimedOut

2010-12-17 14:26:37,626 [1] WARN Enyim.Caching.Memcached.MemcachedNode.InternalPoolImpl [(null)] - Marking node 172.23.0.100:11211 as dead

I still don't understand why it is timing out though?

like image 230
Richard Fawcett Avatar asked Dec 17 '10 13:12

Richard Fawcett


2 Answers

After an hour or so of playing around, I've found the answer. I used Wireshark to look at the network traffic to and from the server. I noticed that when using the Enyim client, the messages looked nothing like those when using telnet. In particular, I couldn't read the protocol commands going across the wire when using the Enyim client.

Therefore, I concluded that the Enyim client was using a different protocol.

A second protocol was added to the memcached server in version 1.4, which is the binary protocol. Prior to that, only the text protocol was supported. The latest Windows binary I can find for memcached is the one from Jellycan, and it is only version 1.2.6.

The Enyim client is configured to use the Binary protocol by default, which was just ignored by my server as it couldn't be understood.

I added the following line to my test program, and things started working immediately:

mcc.Protocol = MemcachedProtocol.Text;
like image 113
Richard Fawcett Avatar answered Nov 03 '22 15:11

Richard Fawcett


I ran into the same issue above. I too struggled to find a newer version of memcached for Windows, but did find one eventually.

I've put links to the latest binaries along with other useful resources here.

like image 45
Ben Foster Avatar answered Nov 03 '22 15:11

Ben Foster