capture_submissions
投げた瞬間に「誰のために投げたか」を残すための表です。
// BrowserHive のタスク id が、結果の報告へ戻る join の鍵になる。 .addColumn("task_id", "uuid", (col) => col.primaryKey()) .addColumn("correlation_id", "text") .addColumn("org_id", "text", (col) => col.notNull()) // それを求めた利用者。居た場合に限る。人ではなく組織に属する定期実行では NULL。 .addColumn("submitted_by", "text") .addColumn("submitted_at", "timestamptz", (col) => col.notNull().defaultTo(sql`now()`))取り込みごとの結果 manifest の在り処は 014 で足しました。
// bucket を除いた鍵。報告が運んだ場所をそのまま —— 台帳は組まない。 .addColumn("manifest_key", "text") // 書けなかった理由、または台帳には読めない場所だった理由。 .addColumn("manifest_error", "text")BrowserHive に「組織」という概念はありません。 取り込みを投げるとき capture-ledger は
URL と設定だけを渡し、返ってくるのは taskId です。
後から bucket の .result.json を拾って台帳を埋めるとき、その manifest には
組織を特定するものが何も入っていません。だから投げた瞬間にここへ記録して
おくのが唯一の出どころになります。
capture-ledger が知っている BrowserHive が知っている───────────────── ─────────────────────capture_targets.org_id ──┐ taskId │ 成果物の場所 └──→ (組織は知らない) capture_submissions task_id → org_id の対応この行が無いと、reconciler は「このアーカイブは誰のものか」を言えません。
段の報告を受ける handler(src/api/crawls.ts)が、報告のうち taskId を持つページ
すべて(失敗も含む)について 1 行ずつ書きます。その取り込みの .result.json が
書かれた場所も一緒です。
submitted.map((r): Insertable<CaptureSubmissionsTable> => ({ taskId: r.taskId, correlationId: r.correlationId ?? crawlId, orgId: crawl.orgId, submittedBy: crawl.requestedBy, manifestKey: manifests.get(r.taskId)?.key ?? null, manifestError: manifests.get(r.taskId)?.error ?? null,}));capture-ledger は manifest の鍵を組みません。 BrowserHive(または受け口)は Capture
の応答で manifest を書いた場所を答え、Windmill の flow がそれを manifestLocation として
運びます。handler は、その場所が設定の bucket の中なら鍵の部分を残します。manifest を
書けなかった取り込みは代わりに manifestError で報告され、その理由がここに入ります。
別の bucket や s3:// でない場所も理由として入ります —— 読み先を報告する側に選ばせない
ためです。
taskId を持つのに、この 2 つのちょうど 1 つを持たない報告は 400 で断ります。受け付けると、
読みに行く先の無い取り込みが残るからです。
taskId は BrowserHive が採番し、使い回されることはありませんが、段の報告が送り直される
ことはあるので onConflict … doNothing() を置いています。
reconcile.ts が、manifest_key を持ち、まだアーカイブの無い行を引きます。
manifest_key を持ち、archives に行の無い capture_submissions の行 → GetObject(manifest_key) → archives に登録し、その org_id と submitted_by で tuple を積む| 列 | 要点 |
|---|---|
task_id |
主キー。 BrowserHive が採番したもので、結果の報告へ戻る join の鍵 |
org_id |
not null。この表が在る理由そのもの |
submitted_by |
それを求めた利用者。人ではなく組織に属する定期実行では NULL |
submitted_at |
now() 既定 |
manifest_key |
その取り込みの .result.json の在り処(bucket を除く)。報告のまま。manifest_error が在るときと、014 より前の行では NULL |
manifest_error |
台帳が読める manifest が無い理由。書けなかったか、報告された場所が設定の bucket の外 |