Digdagのセッションについての調査メモです。
以下のようなworkflowがあるとする。
+task1:
sh>: echo task1
+task2:
sh>: echo task2
+task3:
sh>: echo task3
初回実行してみる。
$ 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が実行された。
すぐにもう一度実行してみる。
$ 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度目の実行はスキップされる。
以下のような状態で保存されている。
$ 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で実行してみる。
$ 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される。
$ 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なセッションを作りたい場合は以下のようにする。
$ digdag run workflow.dig --session "`date '+%Y-%m-01'`"
%dの部分だけを01などで固定する事によってmonthlyにしている。
-sオプション
taskを途中から実行する際には-sを使う。
セッションを消して,dailyで実行してみる。
$ 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も実行されてしまった。
もう一度実行。
$ 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されてしまう。