1.5.14をソースからビルドしてデフォルト設定時、SETコマンド実行時の動作をソースコードで確認します。false;sanitycheck関数後に、signal関数。memcached.cevent_get_versionはlibeventの関数。ここでは、"2.0.21-stable"という文字列を取得しeverに格納されている。変数に"ec2-user"が設定される。指定しているので、getopt_longの取得結果のvの処理はwhile文で3回繰り返される。}その後、パラメータの値が、制限値外のものが指定されていたらエラーで終了する。hash.ctypeでMURMUR3_HASHが指定されている。}6358行目で関数がreturnされる。event_handler関数が、後ほどコマンド実行される度に呼び出される関数。最後にmain_baseがevent_base_loopによりイベントのループ処理が始まる。}thread->notify_send_fdにはbufに格納された"c"をwriteする。drive_machineその後一旦libeventの処理に戻り、event_handlerからdrive_machinec->stateがconn_new_cmdとなっている。conn_waiting)が実行される。drive_machinec->stateがconn_waitingになっている。最後にconn_set_state関数でconn_readに設定している。drive_machine再びlibeventの処理に戻る。event.cのevent_process_active関数中でevent_process_activeが実行されると再びevent_handlerに戻ってくるc->stateがconn_readに設定されている。resがREAD_DATA_RECEIVEDより、conn_parse_cmdに設定される。{5276行目でbreak。その後、関数もretrunされる。memcached.c:5053実際に入力した内容を読み込む処理。}5065│MemcachedではASCIIモードとバイナリーモードが利用できるが、ここではASCIIモードを利用しているので、そちらの処理を実行。sample1"の要素数である6が返される。}4tokenize_command関数の実行結果を元に処理が実行される。memcached.c:3102ここではSETコマンド実行時にnoreplyオプションを指定していないので何も実行されない。items.c:260CASを有効にしていると、uint64_tのサイズ分の8バイトが全体サイズに追加されている処理も行われている。items.c:272slabs_allocが実行される。slabs.c:337do_slabs_newslabが実行される。}5conn_nreadの状態に設定される。}2drive_machineに再度戻ってきて、conn_nreadの処理が実行される。complete_nread_asciiが実行される。hashMurmurHash3_x86_32関数が実行される。expirationですでにあるキー中のメモリは上書きされる。}do_item_linkが実行される。}4retがSTOREDとなっている。memcached.c:1171conn_writeに設定される。thread.c:638hash関数は、先程と同様MurmurHash3_x86_32関数が実行される。}2drive_machineに戻ってくる。1];その後、ensure_iov_space関数が呼ばれる。ここでは特に何もしない。memcached.c:5361TRANSMIT_INCOMPLETEをreturnする。その後、抜けて、drive_machineからc->stateはconn_writeで再度この関数が実行される。その時は、TRANSMIT_COMPLETEをreturnする。}2c->write_and_goにはconn_new_cmdが設定されており、c->stateはこの状態に設定される。memcached.c:2766conn_waitingの状態に設定。}2update_event関数ではtrueが返され、conn_readが実行される。stop変数のフラグにtrueが設定されたことによりwhile文のループは終了する。事前準備Memcachedデバッグ用にビルドしておく。-O2で最適化しているとgdbの際に順にコードを追っていくと困難になるので-O0に変更しておく。ないと、デバッグの際に、順番に実行してもソースコード中の動きがばらばらになる。https://github.com/cgdb/cgdb/issues/184デバッグMemcachedはLibeventを利用しており、コマンド実行時に呼ばれる関数はevent_handlerを起点とする。そのため、ここにブレークポイントを打っておくと良い。以下のコマンドを実行。7sample1スレッド3に切り替えて、nextを続けていると、先程ブレークポイントを設定しておいたevent_handler関数で止まる。コメントをキャンセルメールアドレスが公開されることはありません。mismith227.。