prune_kv_values_updated_before emits actions in HashMap order; replay fails with `kv clear mismatch`
Đánh giá
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức phù hợp với người mới
- 25/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- node.js, rust
- Lĩnh vực
- distributed-systems
Hướng nghiên cứu
Start in src/lib.rs at prune_kv_values_updated_before (around lines 3411-3427), then inspect get_kv_all_keys around lines 3360-3362 and the kv_metadata declaration around line 1715. Reproduce the Node.js SDK scenario with multiple matching keys and verify that replay emits and consumes KV actions in a consistent order.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Summary
An orchestration that prunes two or more KV keys in one turn fails on a later replay with nondeterministic: kv clear mismatch. The orchestration code is deterministic. The order of the actions that the runtime emits is not.
Where
prune_kv_values_updated_beforeiterateskv_metadataand callsclear_kv_valuefor each key: https://github.com/microsoft/duroxide/blob/6a458861763a7aa5b78a7c1c97691a6f00489a8b/src/lib.rs#L3411-L3427kv_metadatais astd::collections::HashMap: https://github.com/microsoft/duroxide/blob/6a458861763a7aa5b78a7c1c97691a6f00489a8b/src/lib.rs#L1715get_kv_all_keysreturns the keys inHashMaporder as well: https://github.com/microsoft/duroxide/blob/6a458861763a7aa5b78a7c1c97691a6f00489a8b/src/lib.rs#L3360-L3362
A HashMap has a random seed per map. So the iteration order differs between two replays of the same turn, also inside one process.
How it fails
- Execution 1 writes the keys
atofand continues as new. - Execution 2 calls
prune_kv_values_updated_before(cutoff). All six keys match. The turn records sixKeyValueClearedevents in some order. - A later turn replays the same code. The six
ClearKeyValueactions come out in a different order. - The replay engine compares the first action with the first event, finds another key, and fails the orchestration.
Reproduction
Reproduced with duroxide 0.1.30 on SQLite, through the Node.js SDK:
runtime.registerOrchestration('Prune', function* (ctx, input) {
if (!input || !input.second) {
for (const k of ['a', 'b', 'c', 'd', 'e', 'f']) ctx.setValue(k, 'x');
yield ctx.continueAsNew({ second: true });
return '';
}
const now = yield ctx.utcNow();
const pruned = ctx.pruneKvValuesUpdatedBefore(now + 60_000); // clears all six keys
yield ctx.utcNow();
yield ctx.utcNow();
return `pruned ${pruned}`;
});
6 of 6 instances failed, for example with:
nondeterministic: kv clear mismatch: action=ClearKeyValue { key: "d" } vs event=KeyValueCleared { key: "a" }
Impact
- An orchestration that calls
prune_kv_values_updated_beforewith more than one matching key can fail for good. With n keys, two replays agree on the order with a chance of 1 in n!. get_kv_all_keysandget_kv_all_valueshand the same random order to orchestration code. Code that loops over the result and schedules work per key is nondeterministic for the same reason.
Suggested fix
- Sort the keys in
prune_kv_values_updated_beforebefore the actions are emitted. - Return sorted keys from
get_kv_all_keys, or keep the KV state in aBTreeMap.
Tracked in #55.
- Ngôn ngữ chính
- Rust
- Star
- 221
- Fork
- 61
- Merge trung bình
- 3 ngày 5 giờ
- Pull request đã merge (30 ngày)
- 1
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của microsoft/duroxide
-
One failed session lock renewal loses the session: no retry, no log, no signal to running activitiesĐang mởbug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 30/100
-
bug
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 72/100
-
bug
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 38/100
-
bug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
-
A failed activity lock renewal can lose the activity result; the orchestration waits foreverĐang mởbug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
Tất cả issue của microsoft/duroxide
Issue tương tự
-
[Feature]: [P3] engine-rs: the package source hash should ignore line endings and untracked filesĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
maniator/verticopolis#880 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
IO.get_env on Node truncates names at embedded NULCó thể đã có người làm @Yi-111-a đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
HigherOrderCO/Bend#1449 · 1 bình luận ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
Maintainer thường phản hồi trong vòng 1 ngày
-
documentation
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
Maintainer thường phản hồi trong vòng 3 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
Maintainer thường phản hồi trong vòng 1 ngày