Digdagのセッションについて調査メモ

Digdagのセッションについての調査メモです。

以下のようなworkflowがあるとする。

```workflow.dig:yml
+task1:
  sh>: echo task1

+task2:
  sh>: echo task2

+task3:
  sh>: echo task3
```

初回実行してみる。

```bash
$ digdag run workflow.dig
2017-03-15 20:25:15 +0900: Digdag v0.9.5
2017-03-15 20:25:17 +0900 [WARN] (main): Using a new session time 2017-03-15T00:00:00+00:00.
2017-03-15 20:25:17 +0900 [INFO] (main): Using session /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+0000.
2017-03-15 20:25:18 +0900 [INFO] (main): Starting a new session project id=1 workflow name=workflow session_time=2017-03-15T00:00:00+00:00
2017-03-15 20:25:20 +0900 [INFO] (0017@+workflow+task1): sh>: echo task1
task1
2017-03-15 20:25:21 +0900 [INFO] (0017@+workflow+task2): sh>: echo task2
task2
2017-03-15 20:25:22 +0900 [INFO] (0017@+workflow+task3): sh>: echo task3
task3
Success. Task state is saved at /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
```

workflowが実行された。

すぐにもう一度実行してみる。

```bash
$ digdag run workflow.dig
2017-03-15 20:26:12 +0900: Digdag v0.9.5
2017-03-15 20:26:14 +0900 [WARN] (main): Reusing the last session time 2017-03-15T00:00:00+00:00.
2017-03-15 20:26:14 +0900 [INFO] (main): Using session /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+0000.
2017-03-15 20:26:14 +0900 [INFO] (main): Starting a new session project id=1 workflow name=workflow session_time=2017-03-15T00:00:00+00:00
2017-03-15 20:26:15 +0900 [WARN] (0017@+workflow+task1): Skipped
2017-03-15 20:26:15 +0900 [WARN] (0017@+workflow+task2): Skipped
2017-03-15 20:26:15 +0900 [WARN] (0017@+workflow+task3): Skipped
Success. Task state is saved at /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
```

2度目は処理が実行されずスキップされている。


セッションの情報は`.digdag`ディレクトリ下に日付がついて保存されている。
ここに`task1,task2,task3の実行が成功した`という状態が保存されているため、2度目の実行はスキップされる。

以下のような状態で保存されている。

```bash
$ ls -l .digdag/status/20170315T000000+0000
total 32
-rw-r--r--  1 toyama-h  wheel  174  3 15 20:26 +workflow+task1.yml
-rw-r--r--  1 toyama-h  wheel  174  3 15 20:26 +workflow+task2.yml
-rw-r--r--  1 toyama-h  wheel  174  3 15 20:26 +workflow+task3.yml
-rw-r--r--  1 toyama-h  wheel  168  3 15 20:26 +workflow.yml
```

このまま何度digdag runしても処理は永久にSkipされる。なぜ？

# --sessionオプション

--sessionには引数として、

* `hourly`
* `daily`
* `last`
* `"yyyy-MM-dd"`
* `"yyyy-MM-dd HH:mm:SS"`

が指定可能。
この--sessionのデフォルト値はlast(最後に実行されたセッションを適用)になるため、2回め以降の実行は永久にスキップされてしまう。

--session hourlyで実行してみる。

```bash
$ digdag run workflow.dig --session hourly
2017-03-15 20:37:23 +0900: Digdag v0.9.5
2017-03-15 20:37:25 +0900 [INFO] (main): Using session /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T110000+0000.
2017-03-15 20:37:25 +0900 [INFO] (main): Starting a new session project id=1 workflow name=workflow session_time=2017-03-15T11:00:00+00:00
2017-03-15 20:37:27 +0900 [INFO] (0017@+workflow+task1): sh>: echo task1
task1
2017-03-15 20:37:27 +0900 [INFO] (0017@+workflow+task2): sh>: echo task2
task2
2017-03-15 20:37:28 +0900 [INFO] (0017@+workflow+task3): sh>: echo task3
task3
Success. Task state is saved at /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T110000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
```

今度は実行された。

```
$ ls -l .digdag/status/
total 0
drwxr-xr-x  6 toyama-h  wheel  204  3 15 20:25 20170315T000000+0000
drwxr-xr-x  6 toyama-h  wheel  204  3 15 20:37 20170315T110000+0000
```

時間付きのディレクトリが作成されている。

もう一度実行しても、そのhour内であれば処理はskipされる。

```bash
$ digdag run workflow.dig --session hourly                                                                                                                       1 ↵
2017-03-15 20:43:58 +0900: Digdag v0.9.5
2017-03-15 20:43:59 +0900 [INFO] (main): Using session /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T110000+0000.
2017-03-15 20:44:00 +0900 [INFO] (main): Starting a new session project id=1 workflow name=workflow session_time=2017-03-15T11:00:00+00:00
2017-03-15 20:44:00 +0900 [WARN] (0017@+workflow+task1): Skipped
2017-03-15 20:44:00 +0900 [WARN] (0017@+workflow+task2): Skipped
2017-03-15 20:44:00 +0900 [WARN] (0017@+workflow+task3): Skipped
Success. Task state is saved at /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T110000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
```

このセッションは自分で日付指定する事もできる。
例えばmonthlyなセッションを作りたい場合は以下のようにする。

```bash
$ digdag run workflow.dig --session "`date '+%Y-%m-01'`"
```

%dの部分だけを01などで固定する事によってmonthlyにしている。

# -sオプション

taskを途中から実行する際には-sを使う。
セッションを消して,dailyで実行してみる。

```bash
$ rm -rf .digdag/status/20170315T000000+0000
$ digdag run workflow.dig -s '+workflow+task2' --session daily
2017-03-15 20:53:06 +0900: Digdag v0.9.5
2017-03-15 20:53:09 +0900 [INFO] (main): Using session /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+0000.
2017-03-15 20:53:09 +0900 [INFO] (main): Starting a new session project id=1 workflow name=workflow session_time=2017-03-15T00:00:00+00:00
2017-03-15 20:53:10 +0900 [INFO] (0017@+workflow+task1): sh>: echo task1
task1
2017-03-15 20:53:11 +0900 [INFO] (0017@+workflow+task2): sh>: echo task2
task2
2017-03-15 20:53:11 +0900 [INFO] (0017@+workflow+task3): sh>: echo task3
task3
Success. Task state is saved at /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
```

あれ？
task2から実行したいのに、task1も実行されてしまった。

もう一度実行。

```bash
$ digdag run workflow.dig -s '+workflow+task2' --session daily
2017-03-15 20:54:02 +0900: Digdag v0.9.5
2017-03-15 20:54:04 +0900 [INFO] (main): Using session /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+0000.
2017-03-15 20:54:04 +0900 [INFO] (main): Starting a new session project id=1 workflow name=workflow session_time=2017-03-15T00:00:00+00:00
2017-03-15 20:54:04 +0900 [WARN] (0017@+workflow+task1): Skipped
2017-03-15 20:54:06 +0900 [INFO] (0017@+workflow+task2): sh>: echo task2
task2
2017-03-15 20:54:06 +0900 [INFO] (0017@+workflow+task3): sh>: echo task3
task3
Success. Task state is saved at /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
```

今度はtask2から実行出来た。
`task2はtask1の成功に依存している`ため、`task1が成功した履歴がセッション上に必要`ということになる。

毎回最初から実行したい場合は-a(--rerun)を使う。

## まとめ
* 初回実行は全てのタスクが実行されてしまう。
* 2回目以降の実行はセッションの状態次第でskipされる。
* 「-sを使い」且つ「2回目以降の実行」の場合のみ途中から実行できる。
* 最初から実行したい場合は-a(--rerun)。
* sessionのデフォルトは`last`なので、-a(--rerun)を使わずに実行していれば2回目以降は永久にskipされてしまう。