Upgrade to Pro — share decks privately, control downloads, hide ads and more …

full scratch mysql storage engine

Avatar for kentsu kentsu
January 18, 2020

full scratch mysql storage engine

Avatar for kentsu

kentsu

January 18, 2020
Tweet

More Decks by kentsu

Other Decks in Technology

Transcript

  1. 自己紹介 - けんつ (@lrf141) - DBMS, 分散システム - Go /

    PHP / C - MySQL はフェチ - 社会性がたりない
  2. 今日話すこと - OSS としての mysql-server コード・リーディング - 既存の SE 実装

    - 内部実装を支えるシステムコール - MySQL Internal Manual - Source Code Documentation
  3. 今日話すこと - OSS としての mysql-server コード・リーディング - 既存の SE 実装

    - 内部実装を支えるシステムコール - MySQL Internal Manual - Source Code Documentation
  4. 資料 - MySQL Internal Manual - MySQL 8.0.18 Source Code

    Documentation - Connpass に掲載したブログ - Github mysql-server
  5. Lock - Share にマスターロック(THR_LOCK)、ハンドラにロックインスタンス (THR_LOCK_DATA) - ロックインスタンスが他のハンドラに対して有効なロックを持つ - Posix Thread

    ベース - デフォルトで SELECT は共有ロック、INSERT 等は排他ロック - 内部ロックはロックインスタンスを利用
  6. class Gambit_share : public Handler_share { public: THR_LOCK lock; const

    char *name; … } class ha_gambit : public handler { THR_LOCK_DATA lock; ///< MySQL lock Gambit_share *share; ///< Shared lock info Gambit_share * get_share(); ///< Get the share
  7. Table 作成時の処理 - /var/lib/mysql 以下にデータベース名でディレクトリが存在する前提 - テーブル毎にディレクトリが作成される - ha_hoge::create を実装する

    - open システムコールのラッパーである my_create を使用する - sdi ファイルも同時に生成される - 作成時にオプションを変更可能
  8. int ha_gambit::create (const char *name, TABLE *, HA_CREATE_INFO *, dd::Table

    *) { DBUG_TRACE; File create_file; DBUG_ENTER("ha_gambit::create" ); if ((create_file= my_create(name, 0, O_RDWR | O_TRUNC, MYF(0))) < 0) DBUG_RETURN(-1); if ((my_close(create_file, MYF(0))) < 0) DBUG_RETURN(-1);
  9. Table 読み込み時の処理 - ha_hoge::open を実装する - SELECT, INSERT, etc… 時に走るためロックが必要

    - ファイルディスクリプタは share でもっておくのが良さそう?
  10. int ha_gambit::open(const char *name, int, uint, const dd::Table *) {

    DBUG_TRACE; File open_file; if (!(share = get_share())) return 1; thr_lock_data_init(&share->lock, &lock, NULL); if (!(open_file = my_open(name, O_RDWR, MYF(0)))) return 1; share->table_file = open_file; share->name = name; return 0; }
  11. 共通の前提 - Share(TABLE_SHARE) がテーブルのメタデータを保持 - TABLE_SHARE は各フィールドの情報を持つ Field も保持 -

    各フィールドは String(sql_string.h) というバッファを利用 - ロックが走る - 内部フォーマットの先頭はカラム数分の Null ビットマップ
  12. SELECT 時の処理 - Field の値を引数である buf に格納 - 値の実体は Field->ptr

    - buf にコピーするべきだが Field->ptr と buf は参照先が同じ - store メソッドで Field->ptr に値読み取った値を格納する
  13. おわりに - MySQL 内でストレージエンジンが担保する機能は少ない - SE は Handler が肝 -

    ロックに関することがわかると大体いける - 全て実装依存 - コードはドキュメント