Mercurial > hg > Document > Growi
changeset 133:4b861b6d7cd0
backup 2023-11-07
author | autobackup |
---|---|
date | Tue, 07 Nov 2023 00:10:03 +0900 |
parents | f89d9ffb6458 |
children | e965a4b3e697 |
files | user/matac42/notes/2023/11/06.md |
diffstat | 1 files changed, 380 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/matac42/notes/2023/11/06.md Tue Nov 07 00:10:03 2023 +0900 @@ -0,0 +1,380 @@ +# 研究目的 + +## システム全体の信頼性を上げたい + +- システムの構成要素全体の信頼性を上げる必要がある + - アプリケーション + - OS + - ファイルシステム + - DB + - メモリとSSD + - 分散ノード + - ネットワーク + +## ファイルシステムとDBの信頼性を考える + +ファイルシステムとは何か + +DBとは何か + +これらは何が違うのか + +検証・モデル検査をできる形に記述したい + +## ファイルシステム + +可変長の文字列を格納するファイル + +そのファイルにアクセスするための名前管理 + +同時アクセスした時に名前管理の一貫性を保証する + +ファイルに同時に書き込まれた時の一貫性の保証はしない + +(ファイルの書き込みを制御するロック機構がある + +## DB + +入力の属性名と型の組みを複数持つレコード + +特定の属性をキーとしたテーブル + +レコードのinsert, delete, updateの直列化可能性を保証する機能がある + +## ファイルシステムとDBの違い + +格納するものの形式 + +それにアクセスする方法 + +直列化可能性を保証する手法 + +これらが違うだけで本質的な違いはない + +## ファイルシステムとDBのもつ追加機能 + +電源切った時にデータが残る(持続性persistency) + +書き込めたかどうかをtrue, falseで判定するatomic write + +ひとつのノードが失われた時にデータを保護する多重性 + +適当なチェックポイントからDB、ファイルシステムを回復する機能 + +複数のコピーを調停するコミット機構 + +## Gears OSを使って実現する + + +- CodeGear + - 処理の単位 +- DataGear + - データの単位 +- metaGear + - データの整合性 + - 資源管理 + +非破壊的なRedBlackTreeでほとんどのものが記述できるのではないか + +## 信頼性を上げる方法 + +- 証明 + - GearsAgdaを使ってinvariantを証明する +- テスト +- モデル検査 +- システムの構成要素全体にこれらの方法を適用したい +- 既存システムの信頼性における問題点の解決 + +## GearsOS上のファイルシステムやDB + +RedBlackTreeでどちらも一応実現できてはいる + +が、できていないことも多い + +複数のreplicationを持てていない + +GCがない + +とりあえず、RedBlackTreeのコピーをやると良いのではないか + +## RedBlackTreeのコピー + +簡単なのでは? + +実際は複雑 + +Treeをコピーしている間に変更されたら? + +頭から最後までコピーすることはできない + +コピー前と後で同一であることを確認する必要がある + +## コピーのアルゴリズム + +insertはRedBlackTreeを辿って必要なノードまでTreeをコピーしながら下っていく + +見つかったら変更したTreeを返す + +そのためには + +Stackを使ってTreeを辿っていく + +まず左側を深さ優先で辿る + +アロケートしたノードは別のContext上に作る必要がある + +なぜならばGCしたいから + +全部のTreeをコピーしたら古いContextを消すことでGCになる + +これはメモリ管理をモナドで表していることになる + +リーフまできたらStackを巻き戻すCGを呼ぶ + +この時左側はできているので右側を呼び出す + +Stackのノードの情報だけでできるのか + +Stackが二つ必要 + +全体と途中まで作りかけのTreeのStack + +## 既存のRedBlackTreeのtestを動かしてみた + +ちょっとだけ修正したら動いた。 + +```bash +./cleanup.sh + +cmake . +CMake Warning (dev) in CMakeLists.txt: + No project() command is present. The top-level CMakeLists.txt file must + contain a literal, direct call to the project() command. Add a line of + code such as + + project(ProjectName) + + near the top of the file, but after cmake_minimum_required(). + + CMake is pretending there is a "project(Project)" command on the first + line. +This warning is for project developers. Use -Wno-dev to suppress it. + +CMake Warning (dev) in CMakeLists.txt: + cmake_minimum_required() should be called prior to this top-level project() + call. Please see the cmake-commands(7) manual for usage documentation of + both commands. +This warning is for project developers. Use -Wno-dev to suppress it. + +-- The C compiler identification is AppleClang 15.0.0.15000040 +-- The CXX compiler identification is AppleClang 15.0.0.15000040 +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Configuring done (0.7s) +-- Generating done (0.1s) +-- Build files have been written to: /Users/matac/ws/src/firefly/hg/Gears/Gears/src/parallel_execution +make rbtree +[ 0%] Generating c-rbtree/test/rbTree_test.c +[ 33%] Generating c-rbtree/RedBlackTree.c +[ 33%] Generating c-rbtree/SingleLinkedQueue.c +[ 33%] Generating c-rbtree/SingleLinkedStack.c +[WARN] Not found SingleLinkedStack.h at generate_stub.pl line 679. +[ 33%] Generating c-rbtree/rbtree-context.c +[ 33%] Building C object CMakeFiles/rbtree.dir/c-rbtree/SingleLinkedQueue.c.o +[ 66%] Building C object CMakeFiles/rbtree.dir/c-rbtree/test/rbTree_test.c.o +[ 66%] Building C object CMakeFiles/rbtree.dir/c-rbtree/RedBlackTree.c.o +[ 66%] Building C object CMakeFiles/rbtree.dir/c-rbtree/SingleLinkedStack.c.o +[ 66%] Building C object CMakeFiles/rbtree.dir/compare.c.o +[ 66%] Building C object CMakeFiles/rbtree.dir/c-rbtree/rbtree-context.c.o +[100%] Linking C executable rbtree +[100%] Built target rbtree +make rbtree_test1 +[ 0%] Generating c-rbtree_test1/test/rb_tree_test1.c +[ 0%] Generating c-rbtree_test1/AtomicReference.c +[ 25%] Generating c-rbtree_test1/CPUWorker.c +[ 25%] Generating c-rbtree_test1/RedBlackTree.c +[ 25%] Generating c-rbtree_test1/SingleLinkedQueue.c +[ 50%] Generating c-rbtree_test1/SingleLinkedStack.c +[WARN] Not found SingleLinkedStack.h at generate_stub.pl line 679. +[ 50%] Generating c-rbtree_test1/SynchronizedQueue.c +[ 50%] Generating c-rbtree_test1/TaskManagerImpl.c +[ 50%] Generating c-rbtree_test1/rbtree_test1-context.c +[ 50%] Building C object CMakeFiles/rbtree_test1.dir/c-rbtree_test1/test/rb_tree_test1.c.o +/Users/matac/ws/src/firefly/hg/Gears/Gears/src/parallel_execution/c-rbtree_test1/test/rb_tree_test1.c:7:33: warning: incompatible pointer types assigning to 'union Data *' from 'struct Tree *' [-Wincompatible-pointer-types] + 7 | Gearef(context, Tree)->tree = tree; + | ^ ~~~~ +/Users/matac/ws/src/firefly/hg/Gears/Gears/src/parallel_execution/c-rbtree_test1/test/rb_tree_test1.c:23:17: warning: incompatible pointer types assigning to 'union Data *' from 'Queue *' (aka 'struct Queue *') [-Wincompatible-pointer-types] + 23 | node->value = queue; + | ^ ~~~~~ +/Users/matac/ws/src/firefly/hg/Gears/Gears/src/parallel_execution/c-rbtree_test1/test/rb_tree_test1.c:43:17: warning: incompatible pointer types assigning to 'union Data *' from 'Queue *' (aka 'struct Queue *') [-Wincompatible-pointer-types] + 43 | node->value = queue; + | ^ ~~~~~ +/Users/matac/ws/src/firefly/hg/Gears/Gears/src/parallel_execution/c-rbtree_test1/test/rb_tree_test1.c:62:17: warning: incompatible pointer types assigning to 'union Data *' from 'Queue *' (aka 'struct Queue *') [-Wincompatible-pointer-types] + 62 | node->value = queue; + | ^ ~~~~~ +4 warnings generated. +[ 50%] Building C object CMakeFiles/rbtree_test1.dir/c-rbtree_test1/TaskManagerImpl.c.o +[ 50%] Building C object CMakeFiles/rbtree_test1.dir/c-rbtree_test1/CPUWorker.c.o +[ 75%] Building C object CMakeFiles/rbtree_test1.dir/c-rbtree_test1/SynchronizedQueue.c.o +[ 75%] Building C object CMakeFiles/rbtree_test1.dir/c-rbtree_test1/AtomicReference.c.o +[ 75%] Building C object CMakeFiles/rbtree_test1.dir/c-rbtree_test1/SingleLinkedQueue.c.o +[ 75%] Building C object CMakeFiles/rbtree_test1.dir/c-rbtree_test1/RedBlackTree.c.o +[ 75%] Building C object CMakeFiles/rbtree_test1.dir/c-rbtree_test1/SingleLinkedStack.c.o +[100%] Building C object CMakeFiles/rbtree_test1.dir/compare.c.o +[100%] Building C object CMakeFiles/rbtree_test1.dir/c-rbtree_test1/rbtree_test1-context.c.o +[100%] Linking C executable rbtree_test1 +[100%] Built target rbtree_test1 +./rbtree +test_main +test1_stub +Test1 +value->3,key->3 +test2_stub +Test2 +test3 +value=3 key=3 +test4 +test5 +./rbtree_test1 +---create stub +---create +---put1 stub +---put1 +---put2 stub +---put2 +---remove stub +---remove +key = 0 (key = 1 (NULL), (NULL)), (NULL) +``` + +`rbTreeCopy_test.cbc`を追加した + +- いくつかputした後copyする + +```c +#include <stdio.h> +#interface "Tree.h" + +/* #include <assert.h> */ + +__code rbTreeTest1(struct Tree* tree) { + printf("Test1\n"); + Node* node = new Node(); + node->value = (union Data*)new Integer(); + ((Integer*)node->value)->value = 1; + node->key = 1; + printf("value->%d,key->%d\n",((Integer*)node->value)->value,node->key); + goto tree->put(node, rbTreeTest2); +} + +__code rbTreeTest1_stub(struct Context* context) { + printf("test1_stub\n"); + Tree* tree = createRedBlackTree(context); + goto rbTreeTest1(context,tree); +} + + +__code rbTreeTest2(struct Tree* tree) { + printf("Test2\n"); + Node* node = new Node(); + node->value = (union Data*)new Integer(); + ((Integer*)(node->value))->value= 2; + node->key = 2; + goto tree->get(node, rbTreeTest3); +} + +__code rbTreeTest2_stub(struct Context* context) { + printf("test2_stub\n"); + Tree* tree = (struct Tree*)Gearef(context, Tree)->tree; + goto rbTreeTest2(context,tree); +} + + +__code rbTreeTest3(struct Tree* tree, struct Node* node0) { + printf("test3\n"); + printf("value=%d key=%d\n", ((Integer*)node0->value)->value, node0->key); + Node* node = new Node(); + node->value = (union Data*)new Integer(); + ((Integer*)(node->value))->value = 3; + node->key = 3; + goto tree->put(node, rbTreeTest4); +} + +__code rbTreeTest3_stub(struct Context* context) { + Tree* tree = (struct Tree*)Gearef(context, Tree)->tree; + Node* node0 = Gearef(context, Tree)->node; + goto rbTreeTest3(context,tree,node0); +} + +__code rbTreeTest4(struct Tree* tree) { + printf("test4\n"); + Node* node = new Node(); + node->value = (union Data*)new Integer(); + ((Integer*)(node->value))->value = 4; + node->key = 4; + goto tree->put(node, rbTreeTest5); +} + +__code rbTreeTest4_stub(struct Context* context) { + Tree* tree = (struct Tree*)Gearef(context, Tree)->tree; + goto rbTreeTest4(context,tree); +} + +__code rbTreeTest5(struct Tree* tree) { + printf("test5\n"); + Node* node = new Node(); + node->value = (union Data*)new Integer(); + goto tree->copy(exit_code); +} + +__code rbTreeTest5_stub(struct Context* context) { + Tree* tree = (struct Tree*)Gearef(context, Tree)->tree; + goto rbTreeTest5(context,tree); +} + +int main(int argc, char const* argv[]) { + printf("test_main\n"); + goto rbTreeTest1(); +} +``` + +## RedBlackTreeを読んでいた + +読みながらcopyRedBlackTreeがどんなコードになるか考えていた。 +が、`newNode`がなんなのかよくわかっていないということがわかった。 + +↓newNodeが考慮されていない + +### copyRedBlackTree + +- leftを入れる +- left==Nullならばrightを入れて見る + - そうでなければleftを次のNodeとしてgoto copyTree +- right==Nullならばgoto copyTreePopする + - そうでなければrightを次のNodeとしてgoto copyTree + +### copyRedBlackTreePop + +- rootならば + - left != Null && right != Nullならば終了 + - right == Nullならばrightを入れる + - right == Nullならば終了 + - そうでなければrightを次のnodeとしてgoto copyTree +- right!=Nullならばpopしてgoto copyTreePop +- rightを入れる +- right!=Nullならばrightを次のNodeとしてgoto copyTree +- right==Nullならばpopしgoto copyTreePop + - そうでなければrightを次のNodeとしてgoto copyTree + +この辺はinsertNodeのようにcaseで分ける感じか? + +## 明日11時からGearsをやります +