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

full scratch mysql storage engine

kentsu
January 18, 2020

full scratch mysql storage engine

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 が肝 -

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