dbgroup-nagoya-u / pmem-atomic

A utility library for atomic operations in persistent memory.
Apache License 2.0
0 stars 0 forks source link

記述子プールの永続化 #14

Closed manabinohibi closed 1 year ago

manabinohibi commented 1 year ago

@baycedar 報告(というよりヘルプ)用のドラフトです. とりあえずこれと同じ方針で実装を進めています.

現状はエラー出ます. [build] /usr/local/include/libpmemobj++/detail/life.hpp:79:34: error: no matching constructor for initialization of 'dbgroup::atomic::pmwcas::ElementHolder' [clang-diagnostic-error]

そもそもこの方針で正しいかもわかりませんが,記述子ポインタの扱いがわからないなぁといったところです. 今まで通りunique_ptrで良いのか,persistent_ptrを使うのか,はたまたどっちもなのか…

お時間あれば少し見ていただけると嬉しいです.

baycedar commented 1 year ago

なんとなくですが,persistent_ptrは今回の用途には適していない感じがしますね.スマートポインタと言ってはいますが,pmem::obj::poolで確保した領域のトランザクションを介した操作に特化してるだけな感じがします.

manabinohibi commented 1 year ago

どうもありがとうございます.(遅くなってスミマセン…)

ElementHolderでもみたいに管理用の配列を同じく保持して,PMEMを閉じた後も専有状態だけは別途解放できるようにしないとダメっぽいです.

今の実装だと構造体PoolElementに占有状態を保持するフラグと記述子を持たせて,それをElementHolderのメンバ変数としていますが,このあたりの実装を変えないとダメということでしょうか…? もしくは構造体PoolElementはそのままもたせておいて,管理用の配列を追加する形になるんでしょうか?

すみません,このあたりの構造がまだつかめてないです.

baycedar commented 1 year ago

今の実装だと構造体PoolElementに占有状態を保持するフラグと記述子を持たせて,それをElementHolderのメンバ変数としていますが,このあたりの実装を変えないとダメということでしょうか…?

はい,そうなると思います.以下のように,pmempoolのルート領域として使用する型は単なるPMwCASDescriptorの配列になって,

  struct DescPool {
    PMwCASDescriptor pool[kDescriptorPoolSize];
  };

これとは別に各記述子の専有状態を管理する配列を別途共有ポインタとして保持する感じです.

std::shared_ptr<std::atomic_bool[kDescriptorPoolSize]> reserve_arr_ = std::make_shared<std::atomic_bool[]>(kDescriptorPoolSize);