Skip to content

[index] 第2インデックス yakushima の統合(ビルド統合 + YakushimaWrapper 実装) #89

Description

@thawk105

親イシュー: #27 / #27「MasstreeWrapper をトップレベルの index/ ディレクトリに移動する」を分割したうちの 1 つ (旧ステップ3+4)。

目的

第2インデックスとして project-tsurugi/yakushima を ccbench に統合し、-DCCBENCH_INDEX=yakushima で masstree と切り替え可能にする。yakushima は Tsurugi DB の並行インデックスで、masstree 派生の設計のため ccbench の phantom 回避モデルがそのまま移植できる見込み。

依存

現状 (2026-05-15 検証済み)

ccbench 側

  • masstree 固有概念が漏れている 7 プロトコル (cicada / ermia / mocc / oze / si / silo / tictoc) が scan_callback.hhon_resp_node / transaction.hhnode_map_ / transaction.ccinsert_info_t 再検証で「masstree のリーフノードバージョン」を phantom 回避の一次メカニズムとして直接使っている。
  • masstree は static lib (libkohler_masstree_json.a) を build_tools/bootstrap.sh でビルドし ccbench::masstree IMPORTED ターゲットで取り込む方式。
  • 値型は Tuple* を masstree の value として格納し、GC は protocol 側。

yakushima 側 (WebFetch で master を確認)

  • ライセンス: Apache-2.0。ヘッダオンリー (README 明記)。C++17 以上CMake >= 3.10。third_party は git submodule update --init --recursive で取得。
  • version.h (確認済み): node_version64_body は 64bit。前半 32bit = vinsert_delete:29 / locked:1 / inserting_deleting:1 / splitting:1、後半 32bit = vsplit:29 / deleted:1 / root:1 / border:1node_version64std::atomic<node_version64_body> をラップし get_body() が acquire load で 64bit body を返す。masstree の version レイアウト・意味論とほぼ同型 — ccbench の node_map_ 検証 (64bit 値の == 比較) がそのまま乗る見込み。
  • scan のノードバージョン記録 (scan_helper.h 確認済み): scan_border は (1) 範囲内に要素が見つかったノード、(2) 範囲に含まれる最右ノードで該当要素なしの場合、(3) 範囲に含まれる最左ノードで該当要素なしの場合 に node_version_vec へ記録する。コメントにも "included in the phantom verification" と明記。masstree on_resp_node の「責任範囲が重なる境界ノードを記録」と同等の phantom 回避意図を持つ。
  • 公開 API (include/kvs.hyakushima namespace): init() / fin()create_storage / delete_storage / find_storageenter(Token&) / leave(Token)put<ValueType>(..., inserted_node_info*)get<ValueType>(..., std::pair<node_version64_body, node_version64*>* checked_version)remove(...)scan<ValueType>(..., node_version_vec*, max_size, right_to_left)
    • inserted_node_info { node_version64* modified_nvp; node_version64* created_nvp; } — ccbench の insert_info_t (node / old_version / new_version) にほぼ 1:1 対応。
  • apt 依存 (build_tools/ubuntu.deps 確認済み): build-essential clang-tidy clang-tools clang-tidy-8 cmake doxygen gcovr git gnuplot libboost-filesystem-dev libgflags-dev libgoogle-glog-dev libspdlog-dev libtbb-dev ninja-build。実行時に効くのは libboost-filesystem-dev / libgflags-dev / libgoogle-glog-dev / libspdlog-dev / libtbb-dev あたり。ccbench の devcontainer / CI (ubuntu:24.04 / GCC 13) にこれらが入っているかは要確認。

着手前に解決すべき要確認事項 (このイシューの前提調査)

  • Token ライフサイクル / エポック GC との関係how_to_use.md は導入的で未記述。include/thread_info.h とテストコードを精読し、ccbench の worker スレッドモデル (スレッド固定) に乗るか、エポック GC マネージャスレッドの扱いを確認する。
  • 値の所有権・GC モデルput が value をコピーして自前管理するのか、created_value_ptr が何か。ccbench は Tuple* をインデックスに格納し GC は protocol 側。ValueType = Tuple* 固定で乗せられるか、所有権モデルの見直しが要るかを kvs.h / テストコード精読で判断する。
  • scan のノードバージョン記録の網羅性 — 境界ノードは記録されることを確認済みだが、中間ノードで要素ゼロのケースの扱いは scan_helper.h の全パスを精読して確認する (実害は薄い見込みだが phantom 取りこぼしは致命的なので念のため)。

やること

フェーズ1: yakushima のビルド統合

  • yakushima を取り込む (ヘッダオンリーなので static lib ビルドは不要、submodule + include path 追加 or FetchContent)。yakushima 自身が submodule を持つので --recursive が要る。[P8] third_party: FetchContent 基盤導入 — masstree / googletest 移行 #97 と方針を揃える。
  • 不足する apt 依存を build_tools/bootstrap_apt.sh / build_tools/ubuntu.deps / .devcontainer/Dockerfile に追加 (devcontainer / CI で確認)。
  • -DCCBENCH_INDEX=yakushima を cmake オプションに追加 (この時点では wrapper は無く、yakushima のヘッダが include できビルドが通ることだけ確認)。

フェーズ2: index/yakushima/wrapper.hh の実装

  • MasstreeWrapper<T> と同じ public API 面 (get_value / insert_value / remove_value / scan / thread_init / table_init / insert_info_t / node_type / ScanCallback) を yakushima 上に再現する YakushimaWrapper<T> を実装。
  • マッピング:
    • thread_initenter(Token&)table_initinit + create_storage
    • insert_value(key, T*, insert_info_t*)put<...>(...) + inserted_node_infoinsert_info_t に変換
    • get_valueget<...>remove_valueremove
    • scanon_resp_node コールバック → yakushima scannode_version_vec を走査してコールバックを駆動
    • node_type / version 64bit 値 → node_version64 / get_body() に委譲
  • insert_info_t を masstree 固有の型でなく wrapper 共通の型にする ({ const void* node; uint64_t old_version; uint64_t new_version; })。masstree wrapper 側もこの共通型を埋めるよう調整。
  • まず silo 1 プロトコルだけで yakushima バックエンドを通し YCSB が回り数値が出ることを確認 → 残り 6 プロトコル (cicada/ermia/mocc/oze/si/tictoc) へ展開。

スコープ外 / 残課題

完了条件

  • -DCCBENCH_INDEX=yakushima で全 7 プロトコル (node-version phantom 回避を使うもの) がビルド・動作する。
  • silo + YCSB で yakushima バックエンドの数値が出る。
  • index/yakushima/wrapper.hhindex/masstree/wrapper.hh と同じ API 面を提供する。
  • yakushima の apt 依存が devcontainer / CI に反映されている。
  • ライセンス併記が明文化されている。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions