blogこの広告は、90日以上更新していないブログに表示しています。2012-03-27statsのcmd_setは、incrなども含むのか?memcachedtwitterで@nekoyaさんがつぶやいていて、memcachedは他のミドルウェアとかよりはソースコードはだいぶ簡潔だろうし、このぐらいならコード調べるのはわりとできそうだな、と思ったのでせっかくなので追ってみた。結論としては、incrの更新の場合には、statsのcmd_setは更新されず、add/replace/set/append/prependの場合には、更新されるようです。"%llu",予想通りわりと特定はすぐできたらしい。stats->slab_stats[sid].set_cmds;ざーと見つつ想像すると、threadローカルなものと、グローバルなstatsの記述があるっぽい。memcached.cあたりでマッチしたやつを追っていく。pthread_mutex_unlock(&c->thread->stats.mutex);というのがあって、メソッド前のコメントを読むに、set/add/replaceのときに、set_cmdsは++されるようだ。}もう一箇所set_cmdsを使っているところを調べると、complete_update_binという関数にぶちあたる。set_cmds++しているところの下の方を見て想像するに、add/replace/append/prepend/set時にこのメソッドが呼びだされるようだ。最初にぶちあたった方をあとから見返してみると、complete_nread_asciiも下の方に同様の処理をしていたようだ。}#endifメソッド名から想像するに、complete_nread_asciiは、asciiベースのプロトコルで更新した場合に呼びだされるhookで、complete_update_binは、バイナリプロトコルの場合で更新した場合に呼びだされるメソッドなのかな。テキストプロトコルでは,CAS値はgetsコマンドを発行することにより取得しますが,バイナリプロトコルではほぼすべてのコマンドに対してレコードのCAS値を取得できる仕様になっています。バイナリプロトコルでは24バイト固定長リクエスト・レスポンスヘッダ内の8バイトをCAS値に割り当ており,その領域をつかってCAS値が送受信されます。そのあたりの仕組みはプロトコル上は、バイナリプロトコルには(必要ないので)ない、とのことのようだ。追記まだ結論にはいたっていませんでした。incrの場合にどうなるか、を追っていたのであった。さきほどの、complete_update_binの呼びだし元を調べてみると、一箇所で、ずばり、complete_nread_binaryという関数のようです。break;incrの場合の処理のときは、どうやら、complete_update_binは呼びだされないもよう。いうことで、cmd_setはincrを含まない、といえそうです。(1)はてなブログをはじめよう!walf443さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。