読者です 読者をやめる 読者になる 読者になる

TCP close()だけに着目してmemcache-clientを覗いてみる

memcached ruby

/usr/lib/ruby/gems/1.8/gems/memcache-client-1.7.2/lib/memcache.rbで「:vimgrep /^\s*\(class\|module\)\s/ % | cw」と打ってやると…

  1 memcache.rb|31 col 1| class MemCache
  2 memcache.rb|920 col 1| class Server
  3 memcache.rb|1073 col 1| class MemCacheError < RuntimeError; end
  4 memcache.rb|1077 col 1| module Continuum
  5 memcache.rb|1101 col 1| class Entry

と出てくる. とてもコンパクトで助かる。

class Continuum::EntryはMemcachedサーバーが複数台指定された場合のみ使用されるので、今回は無視する。すると主要なクラスは以下となる。

  • class MemCache::Server
    • MemcacheサーバーとのTCP接続を抽象化
  • class MemCache
    • Memcache-client処理全般
    • 特にMemcacheプロトコルのコマンド文字列生成やレスポンスのパースなど
    • TCPソケット周りはclass MemCache::Serverを使用(with_serverメソッド経由)

で、MemCache::Server#closeが呼ばれることでTCP socket closeとなるのだけど、それを呼んでいるのはMemCache#resetだけでそれ以外はエラー発生時のみ(要はコード上、暗黙的にcloseされることはない). また、TCP socketをプーリングして云々、という処理も見当たらないのであった。

define_finalizerをつかっているところもなかった。TCPSocketよりも上のコードを見る必要があるかなぁ。