2020/06/09

2020/06/09

# 研究目的

  • アプリケーションの信頼性を向上させたい
    • その為には土台となる OS 自体の信頼性が重要である
  • OSそのものも巨大なプログラムである
  • 並列並行処理などに起因するバグや、そもそもOSを構成する処理が巨大
    • テストコードを用いた方法で信頼性を確保することが困難
    • テストではなく定理証明とモデル検査でOSの信頼性を高めたい

# 今週の進捗

  • growiのdockerのvolumeと戦っていた
  • Gearsのスクリプトの修正と機能追加
    • 作っているプロジェクトは今日ビルドが通ったが、セグフォした…

# docker-composeのvolume

  • dockerではデータ永続化の為などでホストのディレクトリなどをマウントできる

    • volumeと呼ばれる
  • docker-composeの場合は次のように書く

1
2
3
4
5
6
7
8
9
    image: mongo:3.6
    restart: unless-stopped
    volumes:
      - mongo_configdb:/data/configdb
      - mongo_db:/data/db
    restart: always

volumes:
  mongo_db:
  • 最後のvolumesにパスを書いていない
    • その場合は/var/lib/docker/volumesのコンテナに対応したディレクトリに保存される
    • この方法だとdocker pruneとかした時に間違って消える可能性があるらしい
    • ホームディレクトリとかにおいて自前で管理したい

# データベース関連のバックアップ

  • mongodbのバックアップ

    • docker exec -d growi_mongo_1 mongodump --gzip --archive=mongodb.gz
    • docker cp growi_mongo_1:/mongodb.gz .
  • mysqlのバックアップ

    • docker exec -it growi_mariadb_1 mysqldump -u hackmd -panatofuz_hackmd_pass hackmd > dump.archive
  • mongodbのバックアップからのリストア -`` docker cp mongodb.gz growi_mongo_1:/`

    • docker exec -it growi_mongo_1 mongorestore --gzip --drop --archive=mongodb.gz
  • mysqlのリストア

    • 微妙にdocker execではできなかったので、bashを立ち上げて内部でやる
    • docker exec -it growi_mariadb_1 bash

# Gears関連

  • interfaceの定義時などで呼び出した自前のヘッダファイルをcontextに含める機能を実装
1
2
3
4
5
6
#include "piposaru.h"

typedef struct token <Type, Impl> {
  __code add(Impl* token, enum TokenKind tk, char* datum, __code next(...));
  __code next(....);
} token;
  • こういうふうに書いておくと
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#define GET_WAIT_LIST(dseg) (GET_META(dseg)->wait)

#define Gearef(context, t) (&(context)->data[D_##t]->t)

// (SingleLinkedStack *)context->data[D_Stack]->Stack.stack->Stack.stack

#define GearImpl(context, intf, name) (Gearef(context, intf)->name->intf.name)

#include "c/enumCode.h"

enum Relational {
    EQ,
    GT,
    LT,
};

#include "c/enumData.h"
// use /Users/anatofuz/src/firefly/hg/Gears/Gears/src/parallel_execution/../parallel_execution/examples/piposaru/token.h

#include "/Users/anatofuz/src/firefly/hg/Gears/Gears/src/parallel_execution/../parallel_execution/examples/piposaru/piposaru.h"
struct Context {
    enum Code next;
    struct Worker* worker;
    struct TaskManager* taskManager;
    int codeNum;
    __code (**code) (struct Context*);
    union Data **data;
    void* heapStart;
  • こんな感じで読み込まれる

  • enumがgenerate_stubで上手く回収できなかったので修正した

    • enum TokenKind tk = Gearef(context, token)->TokenKind;みたいになる問題
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@@ -155,15 +159,15 @@
         if (/__code (\w+)/) {
             next if $described_data_gear;
             my $args = $';
-            while ($args =~ /\s*(struct|union|const)?\s*([\w\[\]_]+)\*?\s*(\w+),?/g) {
+            while ($args =~ /\s*(struct|union|const|enum)?\s*([\w\[\]_]+)\*?\s*(\w+),?/g) {
               #$args eq  (Impl* vm, pde_t* pgdir, char* init, uint sz, __code next(...));
               my $const_type = $1;
               my $ttype = $2;
               my $tname = $3;

               $ttype =~ s/(Impl|Isa|Type)/Data/;
-              if ($const_type eq 'const') {
-                $ttype = "const $ttype";
+              if ($const_type =~ /(const|enum)/) {
+                $ttype = "$1 $ttype";
               }
               $var{$name}->{$tname} = $ttype;
             }
@@ -447,12 +451,12 @@
                         for my $arg (@args) {
                             $arg =~ s/^\s*//;
                             last if ($arg =~ /\.\.\./);
-                            $arg =~ s/^(struct|union|const)?\s*(\w+)(\**)\s(\w+)//;
+                            $arg =~ s/^(struct|union|const|enum)?\s*(\w+)(\**)\s(\w+)//;
                             my $structType = $1;
                             my $typeName = $2;
                             my $ptrType = $3;
                             my $varName = $4;
-                        if ($structType =~ /const/) {
+                        if ($structType =~ /(const|enum)/) {
                             $typeName = "$structType $typeName";
                         }
                             my $typeField = lcfirst($typeName);
  • とりあえず生成されるようになった
1
2
3
4
5
6
7
__code add_token_impl_stub(struct Context* context) {
  token_impl* token = (token_impl*)GearImpl(context, token, token);
  enum TokenKind tk = Gearef(context, token)->tk;
  char* datum = Gearef(context, token)->datum;
  enum Code next = Gearef(context, token)->next;
  goto add_token_impl(context, token, tk, datum, next);
}

# やること

  • GearsのTaskManager周りを理解していないことがわかった
    • par goto含めて修正していく
    • Gearsのコンパイラ作成
      • スクリプト作ろうとしてましたが、コンパイラを目指す方針で
      • Cコンパイラ?
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy