TCP close()だけに着目してmemcache-clientを覗いてみる
/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::Server#closeが呼ばれることでTCP socket closeとなるのだけど、それを呼んでいるのはMemCache#resetだけでそれ以外はエラー発生時のみ(要はコード上、暗黙的にcloseされることはない). また、TCP socketをプーリングして云々、という処理も見当たらないのであった。
define_finalizerをつかっているところもなかった。TCPSocketよりも上のコードを見る必要があるかなぁ。