aboutsummaryrefslogtreecommitdiffstats
path: root/research/experiments
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-10-19 14:08:53 +0100
committereunhhu <[email protected]>2026-10-19 14:08:53 +0100
commitcbfec0d3ac239e050597bdb080645ffb53bad66e (patch)
tree8675b6614efab24877032913f3dd00ba4272a137 /research/experiments
parentde1d30da1203cae9cd857052c339ac026f18cffa (diff)
downloadpure-cbfec0d3ac239e050597bdb080645ffb53bad66e.tar.gz
pure-cbfec0d3ac239e050597bdb080645ffb53bad66e.zip
046: 029's principle 2 put to its breaking experiment on one Pi, the tools and the numbers: an owner (pure-run --store) with shim.so preloaded ships every change its store makes to its files (ops.h: create, write, truncate, allocate, rename, unlink, mkdir), cut at each fsync or fdatasync, over pure link (shipper.c, follower.c), and its sync returns once the follower has the cut (synchronous: one cut in flight, no log); identity: 100,000 messages (200,081 cuts; 34 compactions, an image written again) and 200,000 (400,149 cuts; 67 compactions, a second log segment), the stores compared byte for byte every 1,999 and 3,001 cuts and at the end: 0 differences, the follower's store opened as owner holding every message; takeover: 70 kill -9s (owner alone, the whole node, the node with cuts of 512 and 64 B records): all open, hold every message the owner said done, none not sent, the entries in order (and equal to the owner's own store each time); prefixes: 867 op boundaries of a 100,000-message stream (568 within cuts, 266 around installs) opened as stores: all pass; the price: 204 to 400 us a message on tmpfs (155 us waiting for acks, two cuts a message), 903 bytes shipped a message, 42% of them zeros written ahead (a compaction's new file and the tree's tail)
Diffstat (limited to 'research/experiments')
-rw-r--r--research/experiments/046-commit-replica/2026-10-19-bytes.jsonl1
-rw-r--r--research/experiments/046-commit-replica/2026-10-19-identity.jsonl2
-rw-r--r--research/experiments/046-commit-replica/2026-10-19-prefixes-100k-samples.jsonl868
-rw-r--r--research/experiments/046-commit-replica/2026-10-19-prefixes.jsonl2
-rw-r--r--research/experiments/046-commit-replica/2026-10-19-price.jsonl2
-rw-r--r--research/experiments/046-commit-replica/2026-10-19-takeover.jsonl70
-rw-r--r--research/experiments/046-commit-replica/entries.aup12
-rw-r--r--research/experiments/046-commit-replica/follower.c211
-rw-r--r--research/experiments/046-commit-replica/ops.h45
-rw-r--r--research/experiments/046-commit-replica/prefixes.py119
-rw-r--r--research/experiments/046-commit-replica/run.py261
-rw-r--r--research/experiments/046-commit-replica/shim.c353
-rw-r--r--research/experiments/046-commit-replica/shipper.c120
13 files changed, 2066 insertions, 0 deletions
diff --git a/research/experiments/046-commit-replica/2026-10-19-bytes.jsonl b/research/experiments/046-commit-replica/2026-10-19-bytes.jsonl
new file mode 100644
index 0000000..d7ddf2b
--- /dev/null
+++ b/research/experiments/046-commit-replica/2026-10-19-bytes.jsonl
@@ -0,0 +1 @@
+{"what": "bytes written a message, by file, of the 100,000-message journal (prefixes.py)", "events": 100000, "compaction (.pending)": {"writes": 699, "bytes": 37072679, "per_event": 370.7, "zero_bytes": 37056748}, "image": {"writes": 19, "bytes": 655694, "per_event": 6.6, "zero_bytes": 0}, "pure.tree": {"writes": 206271, "bytes": 36483756, "per_event": 364.8, "zero_bytes": 983641}, "log-0": {"writes": 100000, "bytes": 7068992, "per_event": 70.7, "zero_bytes": 0}}
diff --git a/research/experiments/046-commit-replica/2026-10-19-identity.jsonl b/research/experiments/046-commit-replica/2026-10-19-identity.jsonl
new file mode 100644
index 0000000..042b190
--- /dev/null
+++ b/research/experiments/046-commit-replica/2026-10-19-identity.jsonl
@@ -0,0 +1,2 @@
+{"run": "identity", "events": 100000, "done": 100000, "owner_exit": 0, "every": 1999, "samples": 100, "samples_differing": 0, "first_differing": [], "end_differences": [], "shim": {"cuts": 200081, "shipped_bytes": 90258606, "waited_ms": 15199.8, "create": [40, 1149], "write": [306989, 88255228], "truncate": [0, 0], "allocate": [1, 24], "rename": [38, 1237], "unlink": [0, 0], "mkdir": [1, 7], "sync": [200081, 2000961], "renamed_to": {"pure.tree": 34, "image-entries": 2, "image-0heard": 1, "image-0sent": 1}}, "shipper": {"cuts": 200081, "records": 200114, "record_bytes": 92059632, "waited_ms": 12018.6, "packets": 228164, "resent": 0}, "follower": {"heard": 200114, "cuts": 200081, "ops": 507150, "op_bytes": 90258606, "received": 228164, "deliveries": 200114, "stored": 200114}, "owner_files": {".writer.lock": 0, "image-0heard": 50, "image-0sent": 60, "image-entries": 655480, "log-0": 8388608, "pure.tree": 1123399}, "follower_opened": {"opened": true, "fault": "none", "total": 100000, "summed": 49975000}}
+{"run": "identity", "events": 200000, "done": 200000, "owner_exit": 0, "every": 3001, "samples": 133, "samples_differing": 0, "first_differing": [], "end_differences": [], "shim": {"cuts": 400149, "shipped_bytes": 178744674, "waited_ms": 43096.0, "create": [74, 2122], "write": [613932, 174738440], "truncate": [0, 0], "allocate": [2, 48], "rename": [71, 2293], "unlink": [0, 0], "mkdir": [1, 7], "sync": [400149, 4001764], "renamed_to": {"pure.tree": 67, "image-entries": 2, "image-0heard": 1, "image-0sent": 1}}, "shipper": {"cuts": 400149, "records": 400215, "record_bytes": 182346609, "waited_ms": 33989.4, "packets": 454929, "resent": 0}, "follower": {"within_cut": false, "heard": 400215, "cuts": 400149, "ops": 1014229, "op_bytes": 178744674, "received": 454929, "deliveries": 400215, "stored": 400215}, "owner_files": {".writer.lock": 0, "image-0heard": 50, "image-0sent": 60, "image-entries": 655480, "log-0": 8388608, "log-1": 8388608, "pure.tree": 1123399}, "follower_opened": {"opened": true, "fault": "none", "total": 200000, "summed": 99950000}}
diff --git a/research/experiments/046-commit-replica/2026-10-19-prefixes-100k-samples.jsonl b/research/experiments/046-commit-replica/2026-10-19-prefixes-100k-samples.jsonl
new file mode 100644
index 0000000..286e31d
--- /dev/null
+++ b/research/experiments/046-commit-replica/2026-10-19-prefixes-100k-samples.jsonl
@@ -0,0 +1,868 @@
+{"ops": 7, "of": 507150, "cut": 0, "within_cut": true, "total": 0, "passed": true}
+{"ops": 8, "of": 507150, "cut": 0, "within_cut": true, "total": 0, "passed": true}
+{"ops": 9, "of": 507150, "cut": 0, "within_cut": true, "total": 0, "passed": true}
+{"ops": 10, "of": 507150, "cut": 0, "within_cut": false, "total": 0, "passed": true}
+{"ops": 11, "of": 507150, "cut": 1, "within_cut": true, "total": 0, "passed": true}
+{"ops": 12, "of": 507150, "cut": 1, "within_cut": false, "total": 0, "passed": true}
+{"ops": 13, "of": 507150, "cut": 2, "within_cut": false, "total": 0, "passed": true}
+{"ops": 17, "of": 507150, "cut": 4, "within_cut": true, "total": 0, "passed": true}
+{"ops": 18, "of": 507150, "cut": 4, "within_cut": true, "total": 0, "passed": true}
+{"ops": 19, "of": 507150, "cut": 4, "within_cut": true, "total": 0, "passed": true}
+{"ops": 20, "of": 507150, "cut": 4, "within_cut": false, "total": 0, "passed": true}
+{"ops": 21, "of": 507150, "cut": 5, "within_cut": true, "total": 0, "passed": true}
+{"ops": 22, "of": 507150, "cut": 5, "within_cut": false, "total": 0, "passed": true}
+{"ops": 23, "of": 507150, "cut": 6, "within_cut": true, "total": 0, "passed": true}
+{"ops": 25, "of": 507150, "cut": 6, "within_cut": true, "total": 0, "passed": true}
+{"ops": 26, "of": 507150, "cut": 6, "within_cut": true, "total": 0, "passed": true}
+{"ops": 27, "of": 507150, "cut": 6, "within_cut": true, "total": 0, "passed": true}
+{"ops": 28, "of": 507150, "cut": 6, "within_cut": false, "total": 0, "passed": true}
+{"ops": 29, "of": 507150, "cut": 7, "within_cut": true, "total": 0, "passed": true}
+{"ops": 30, "of": 507150, "cut": 7, "within_cut": false, "total": 0, "passed": true}
+{"ops": 31, "of": 507150, "cut": 8, "within_cut": true, "total": 0, "passed": true}
+{"ops": 33, "of": 507150, "cut": 8, "within_cut": true, "total": 0, "passed": true}
+{"ops": 34, "of": 507150, "cut": 8, "within_cut": true, "total": 0, "passed": true}
+{"ops": 35, "of": 507150, "cut": 8, "within_cut": true, "total": 0, "passed": true}
+{"ops": 36, "of": 507150, "cut": 8, "within_cut": false, "total": 0, "passed": true}
+{"ops": 37, "of": 507150, "cut": 9, "within_cut": true, "total": 0, "passed": true}
+{"ops": 38, "of": 507150, "cut": 9, "within_cut": false, "total": 0, "passed": true}
+{"ops": 39, "of": 507150, "cut": 10, "within_cut": true, "total": 0, "passed": true}
+{"ops": 639, "of": 507150, "cut": 247, "within_cut": false, "total": 117, "passed": true}
+{"ops": 1117, "of": 507150, "cut": 436, "within_cut": true, "total": 212, "passed": true}
+{"ops": 3736, "of": 507150, "cut": 1469, "within_cut": false, "total": 728, "passed": true}
+{"ops": 5746, "of": 507150, "cut": 2263, "within_cut": false, "total": 1125, "passed": true}
+{"ops": 7680, "of": 507150, "cut": 3026, "within_cut": true, "total": 1506, "passed": true}
+{"ops": 8644, "of": 507150, "cut": 3406, "within_cut": false, "total": 1697, "passed": true}
+{"ops": 8911, "of": 507150, "cut": 3510, "within_cut": false, "total": 1749, "passed": true}
+{"ops": 8928, "of": 507150, "cut": 3517, "within_cut": false, "total": 1752, "passed": true}
+{"ops": 10264, "of": 507150, "cut": 4045, "within_cut": true, "total": 2016, "passed": true}
+{"ops": 11211, "of": 507150, "cut": 4419, "within_cut": false, "total": 2203, "passed": true}
+{"ops": 14541, "of": 507150, "cut": 5732, "within_cut": true, "total": 2859, "passed": true}
+{"ops": 15383, "of": 507150, "cut": 6057, "within_cut": true, "total": 3022, "passed": true}
+{"ops": 15384, "of": 507150, "cut": 6057, "within_cut": true, "total": 3022, "passed": true}
+{"ops": 15385, "of": 507150, "cut": 6057, "within_cut": true, "total": 3022, "passed": true}
+{"ops": 15386, "of": 507150, "cut": 6057, "within_cut": false, "total": 3022, "passed": true}
+{"ops": 15387, "of": 507150, "cut": 6058, "within_cut": true, "total": 3022, "passed": true}
+{"ops": 15388, "of": 507150, "cut": 6058, "within_cut": false, "total": 3022, "passed": true}
+{"ops": 15389, "of": 507150, "cut": 6059, "within_cut": true, "total": 3022, "passed": true}
+{"ops": 16173, "of": 507150, "cut": 6369, "within_cut": true, "total": 3177, "passed": true}
+{"ops": 16309, "of": 507150, "cut": 6422, "within_cut": false, "total": 3204, "passed": true}
+{"ops": 17053, "of": 507150, "cut": 6716, "within_cut": false, "total": 3351, "passed": true}
+{"ops": 18110, "of": 507150, "cut": 7134, "within_cut": true, "total": 3560, "passed": true}
+{"ops": 18823, "of": 507150, "cut": 7416, "within_cut": true, "total": 3700, "passed": true}
+{"ops": 19026, "of": 507150, "cut": 7496, "within_cut": true, "total": 3741, "passed": true}
+{"ops": 19114, "of": 507150, "cut": 7530, "within_cut": false, "total": 3758, "passed": true}
+{"ops": 20582, "of": 507150, "cut": 8110, "within_cut": false, "total": 4048, "passed": true}
+{"ops": 20715, "of": 507150, "cut": 8163, "within_cut": false, "total": 4074, "passed": true}
+{"ops": 20757, "of": 507150, "cut": 8180, "within_cut": true, "total": 4082, "passed": true}
+{"ops": 21226, "of": 507150, "cut": 8365, "within_cut": true, "total": 4175, "passed": true}
+{"ops": 22253, "of": 507150, "cut": 8771, "within_cut": true, "total": 4378, "passed": true}
+{"ops": 22634, "of": 507150, "cut": 8921, "within_cut": false, "total": 4453, "passed": true}
+{"ops": 23099, "of": 507150, "cut": 9105, "within_cut": true, "total": 4545, "passed": true}
+{"ops": 23241, "of": 507150, "cut": 9161, "within_cut": false, "total": 4573, "passed": true}
+{"ops": 24385, "of": 507150, "cut": 9613, "within_cut": true, "total": 4799, "passed": true}
+{"ops": 24630, "of": 507150, "cut": 9710, "within_cut": true, "total": 4847, "passed": true}
+{"ops": 28556, "of": 507150, "cut": 11261, "within_cut": true, "total": 5623, "passed": true}
+{"ops": 28643, "of": 507150, "cut": 11295, "within_cut": false, "total": 5640, "passed": true}
+{"ops": 30717, "of": 507150, "cut": 12107, "within_cut": true, "total": 6046, "passed": true}
+{"ops": 30718, "of": 507150, "cut": 12107, "within_cut": true, "total": 6046, "passed": true}
+{"ops": 30719, "of": 507150, "cut": 12107, "within_cut": true, "total": 6046, "passed": true}
+{"ops": 30720, "of": 507150, "cut": 12107, "within_cut": false, "total": 6046, "passed": true}
+{"ops": 30721, "of": 507150, "cut": 12108, "within_cut": true, "total": 6046, "passed": true}
+{"ops": 30722, "of": 507150, "cut": 12108, "within_cut": false, "total": 6046, "passed": true}
+{"ops": 30723, "of": 507150, "cut": 12109, "within_cut": true, "total": 6046, "passed": true}
+{"ops": 30763, "of": 507150, "cut": 12125, "within_cut": true, "total": 6054, "passed": true}
+{"ops": 31952, "of": 507150, "cut": 12594, "within_cut": false, "total": 6289, "passed": true}
+{"ops": 32455, "of": 507150, "cut": 12793, "within_cut": false, "total": 6388, "passed": true}
+{"ops": 33035, "of": 507150, "cut": 13022, "within_cut": false, "total": 6503, "passed": true}
+{"ops": 34481, "of": 507150, "cut": 13594, "within_cut": true, "total": 6788, "passed": true}
+{"ops": 35482, "of": 507150, "cut": 13989, "within_cut": false, "total": 6986, "passed": true}
+{"ops": 35533, "of": 507150, "cut": 14009, "within_cut": false, "total": 6996, "passed": true}
+{"ops": 35812, "of": 507150, "cut": 14120, "within_cut": true, "total": 7051, "passed": true}
+{"ops": 36469, "of": 507150, "cut": 14379, "within_cut": false, "total": 7181, "passed": true}
+{"ops": 37597, "of": 507150, "cut": 14825, "within_cut": true, "total": 7404, "passed": true}
+{"ops": 39424, "of": 507150, "cut": 15546, "within_cut": false, "total": 7765, "passed": true}
+{"ops": 39613, "of": 507150, "cut": 15621, "within_cut": false, "total": 7802, "passed": true}
+{"ops": 40329, "of": 507150, "cut": 15904, "within_cut": true, "total": 7944, "passed": true}
+{"ops": 40368, "of": 507150, "cut": 15919, "within_cut": false, "total": 7951, "passed": true}
+{"ops": 40420, "of": 507150, "cut": 15940, "within_cut": true, "total": 7962, "passed": true}
+{"ops": 41503, "of": 507150, "cut": 16368, "within_cut": true, "total": 8175, "passed": true}
+{"ops": 41575, "of": 507150, "cut": 16396, "within_cut": true, "total": 8190, "passed": true}
+{"ops": 42710, "of": 507150, "cut": 16844, "within_cut": false, "total": 8414, "passed": true}
+{"ops": 42997, "of": 507150, "cut": 16958, "within_cut": true, "total": 8471, "passed": true}
+{"ops": 43177, "of": 507150, "cut": 17029, "within_cut": false, "total": 8506, "passed": true}
+{"ops": 43251, "of": 507150, "cut": 17058, "within_cut": false, "total": 8521, "passed": true}
+{"ops": 43636, "of": 507150, "cut": 17210, "within_cut": false, "total": 8597, "passed": true}
+{"ops": 43977, "of": 507150, "cut": 17345, "within_cut": false, "total": 8664, "passed": true}
+{"ops": 44031, "of": 507150, "cut": 17366, "within_cut": false, "total": 8675, "passed": true}
+{"ops": 44044, "of": 507150, "cut": 17372, "within_cut": true, "total": 8677, "passed": true}
+{"ops": 44456, "of": 507150, "cut": 17534, "within_cut": false, "total": 8759, "passed": true}
+{"ops": 44845, "of": 507150, "cut": 17688, "within_cut": true, "total": 8836, "passed": true}
+{"ops": 45163, "of": 507150, "cut": 17814, "within_cut": true, "total": 8898, "passed": true}
+{"ops": 46051, "of": 507150, "cut": 18157, "within_cut": true, "total": 9070, "passed": true}
+{"ops": 46052, "of": 507150, "cut": 18157, "within_cut": true, "total": 9070, "passed": true}
+{"ops": 46053, "of": 507150, "cut": 18157, "within_cut": true, "total": 9070, "passed": true}
+{"ops": 46054, "of": 507150, "cut": 18157, "within_cut": false, "total": 9070, "passed": true}
+{"ops": 46055, "of": 507150, "cut": 18158, "within_cut": true, "total": 9070, "passed": true}
+{"ops": 46056, "of": 507150, "cut": 18158, "within_cut": false, "total": 9070, "passed": true}
+{"ops": 46057, "of": 507150, "cut": 18159, "within_cut": true, "total": 9070, "passed": true}
+{"ops": 46203, "of": 507150, "cut": 18217, "within_cut": true, "total": 9099, "passed": true}
+{"ops": 47732, "of": 507150, "cut": 18821, "within_cut": true, "total": 9401, "passed": true}
+{"ops": 48150, "of": 507150, "cut": 18986, "within_cut": true, "total": 9484, "passed": true}
+{"ops": 48698, "of": 507150, "cut": 19202, "within_cut": false, "total": 9592, "passed": true}
+{"ops": 48745, "of": 507150, "cut": 19221, "within_cut": true, "total": 9601, "passed": true}
+{"ops": 50150, "of": 507150, "cut": 19776, "within_cut": true, "total": 9879, "passed": true}
+{"ops": 50468, "of": 507150, "cut": 19902, "within_cut": true, "total": 9941, "passed": true}
+{"ops": 50953, "of": 507150, "cut": 20093, "within_cut": false, "total": 10037, "passed": true}
+{"ops": 51112, "of": 507150, "cut": 20156, "within_cut": true, "total": 10069, "passed": true}
+{"ops": 51745, "of": 507150, "cut": 20406, "within_cut": true, "total": 10194, "passed": true}
+{"ops": 53622, "of": 507150, "cut": 21148, "within_cut": true, "total": 10564, "passed": true}
+{"ops": 54542, "of": 507150, "cut": 21511, "within_cut": false, "total": 10746, "passed": true}
+{"ops": 55075, "of": 507150, "cut": 21722, "within_cut": true, "total": 10851, "passed": true}
+{"ops": 55502, "of": 507150, "cut": 21890, "within_cut": false, "total": 10936, "passed": true}
+{"ops": 56909, "of": 507150, "cut": 22446, "within_cut": true, "total": 11214, "passed": true}
+{"ops": 56937, "of": 507150, "cut": 22457, "within_cut": false, "total": 11219, "passed": true}
+{"ops": 57666, "of": 507150, "cut": 22745, "within_cut": false, "total": 11363, "passed": true}
+{"ops": 57800, "of": 507150, "cut": 22798, "within_cut": true, "total": 11390, "passed": true}
+{"ops": 58733, "of": 507150, "cut": 23167, "within_cut": true, "total": 11574, "passed": true}
+{"ops": 59909, "of": 507150, "cut": 23631, "within_cut": false, "total": 11806, "passed": true}
+{"ops": 60137, "of": 507150, "cut": 23722, "within_cut": true, "total": 11851, "passed": true}
+{"ops": 60377, "of": 507150, "cut": 23816, "within_cut": false, "total": 11899, "passed": true}
+{"ops": 61134, "of": 507150, "cut": 24115, "within_cut": false, "total": 12048, "passed": true}
+{"ops": 61385, "of": 507150, "cut": 24207, "within_cut": true, "total": 12094, "passed": true}
+{"ops": 61386, "of": 507150, "cut": 24207, "within_cut": true, "total": 12094, "passed": true}
+{"ops": 61387, "of": 507150, "cut": 24207, "within_cut": true, "total": 12094, "passed": true}
+{"ops": 61388, "of": 507150, "cut": 24207, "within_cut": false, "total": 12094, "passed": true}
+{"ops": 61389, "of": 507150, "cut": 24208, "within_cut": true, "total": 12094, "passed": true}
+{"ops": 61390, "of": 507150, "cut": 24208, "within_cut": false, "total": 12094, "passed": true}
+{"ops": 61391, "of": 507150, "cut": 24209, "within_cut": true, "total": 12094, "passed": true}
+{"ops": 63992, "of": 507150, "cut": 25236, "within_cut": false, "total": 12608, "passed": true}
+{"ops": 64082, "of": 507150, "cut": 25272, "within_cut": true, "total": 12626, "passed": true}
+{"ops": 65159, "of": 507150, "cut": 25698, "within_cut": true, "total": 12838, "passed": true}
+{"ops": 66505, "of": 507150, "cut": 26229, "within_cut": false, "total": 13104, "passed": true}
+{"ops": 66544, "of": 507150, "cut": 26245, "within_cut": true, "total": 13112, "passed": true}
+{"ops": 66927, "of": 507150, "cut": 26396, "within_cut": true, "total": 13188, "passed": true}
+{"ops": 67031, "of": 507150, "cut": 26437, "within_cut": false, "total": 13208, "passed": true}
+{"ops": 70609, "of": 507150, "cut": 27851, "within_cut": true, "total": 13915, "passed": true}
+{"ops": 72685, "of": 507150, "cut": 28671, "within_cut": true, "total": 14325, "passed": true}
+{"ops": 73179, "of": 507150, "cut": 28866, "within_cut": true, "total": 14423, "passed": true}
+{"ops": 73874, "of": 507150, "cut": 29140, "within_cut": false, "total": 14560, "passed": true}
+{"ops": 75424, "of": 507150, "cut": 29753, "within_cut": true, "total": 14866, "passed": true}
+{"ops": 76441, "of": 507150, "cut": 30155, "within_cut": true, "total": 15067, "passed": true}
+{"ops": 76719, "of": 507150, "cut": 30257, "within_cut": true, "total": 15118, "passed": true}
+{"ops": 76720, "of": 507150, "cut": 30257, "within_cut": true, "total": 15118, "passed": true}
+{"ops": 76721, "of": 507150, "cut": 30257, "within_cut": true, "total": 15118, "passed": true}
+{"ops": 76722, "of": 507150, "cut": 30257, "within_cut": false, "total": 15118, "passed": true}
+{"ops": 76723, "of": 507150, "cut": 30258, "within_cut": true, "total": 15118, "passed": true}
+{"ops": 76724, "of": 507150, "cut": 30258, "within_cut": false, "total": 15118, "passed": true}
+{"ops": 76725, "of": 507150, "cut": 30259, "within_cut": true, "total": 15118, "passed": true}
+{"ops": 77651, "of": 507150, "cut": 30625, "within_cut": true, "total": 15301, "passed": true}
+{"ops": 77700, "of": 507150, "cut": 30644, "within_cut": true, "total": 15311, "passed": true}
+{"ops": 78227, "of": 507150, "cut": 30852, "within_cut": false, "total": 15415, "passed": true}
+{"ops": 79267, "of": 507150, "cut": 31263, "within_cut": false, "total": 15620, "passed": true}
+{"ops": 79810, "of": 507150, "cut": 31478, "within_cut": true, "total": 15727, "passed": true}
+{"ops": 79837, "of": 507150, "cut": 31488, "within_cut": false, "total": 15733, "passed": true}
+{"ops": 79867, "of": 507150, "cut": 31500, "within_cut": false, "total": 15739, "passed": true}
+{"ops": 80430, "of": 507150, "cut": 31723, "within_cut": true, "total": 15850, "passed": true}
+{"ops": 80740, "of": 507150, "cut": 31845, "within_cut": false, "total": 15911, "passed": true}
+{"ops": 80904, "of": 507150, "cut": 31910, "within_cut": true, "total": 15944, "passed": true}
+{"ops": 81774, "of": 507150, "cut": 32254, "within_cut": true, "total": 16115, "passed": true}
+{"ops": 83542, "of": 507150, "cut": 32952, "within_cut": true, "total": 16465, "passed": true}
+{"ops": 84039, "of": 507150, "cut": 33148, "within_cut": false, "total": 16563, "passed": true}
+{"ops": 86185, "of": 507150, "cut": 33996, "within_cut": false, "total": 16987, "passed": true}
+{"ops": 86281, "of": 507150, "cut": 34034, "within_cut": true, "total": 17006, "passed": true}
+{"ops": 88085, "of": 507150, "cut": 34747, "within_cut": true, "total": 17362, "passed": true}
+{"ops": 89060, "of": 507150, "cut": 35132, "within_cut": true, "total": 17555, "passed": true}
+{"ops": 90366, "of": 507150, "cut": 35648, "within_cut": true, "total": 17813, "passed": true}
+{"ops": 91846, "of": 507150, "cut": 36233, "within_cut": true, "total": 18105, "passed": true}
+{"ops": 92053, "of": 507150, "cut": 36307, "within_cut": true, "total": 18142, "passed": true}
+{"ops": 92054, "of": 507150, "cut": 36307, "within_cut": true, "total": 18142, "passed": true}
+{"ops": 92055, "of": 507150, "cut": 36307, "within_cut": true, "total": 18142, "passed": true}
+{"ops": 92056, "of": 507150, "cut": 36307, "within_cut": false, "total": 18142, "passed": true}
+{"ops": 92057, "of": 507150, "cut": 36308, "within_cut": true, "total": 18142, "passed": true}
+{"ops": 92058, "of": 507150, "cut": 36308, "within_cut": false, "total": 18142, "passed": true}
+{"ops": 92059, "of": 507150, "cut": 36309, "within_cut": true, "total": 18142, "passed": true}
+{"ops": 92839, "of": 507150, "cut": 36617, "within_cut": false, "total": 18296, "passed": true}
+{"ops": 93011, "of": 507150, "cut": 36685, "within_cut": false, "total": 18330, "passed": true}
+{"ops": 93680, "of": 507150, "cut": 36949, "within_cut": false, "total": 18462, "passed": true}
+{"ops": 96125, "of": 507150, "cut": 37915, "within_cut": false, "total": 18945, "passed": true}
+{"ops": 96240, "of": 507150, "cut": 37961, "within_cut": true, "total": 18968, "passed": true}
+{"ops": 96357, "of": 507150, "cut": 38007, "within_cut": true, "total": 18991, "passed": true}
+{"ops": 96648, "of": 507150, "cut": 38122, "within_cut": true, "total": 19049, "passed": true}
+{"ops": 96830, "of": 507150, "cut": 38194, "within_cut": true, "total": 19085, "passed": true}
+{"ops": 97871, "of": 507150, "cut": 38605, "within_cut": false, "total": 19290, "passed": true}
+{"ops": 99009, "of": 507150, "cut": 39055, "within_cut": true, "total": 19515, "passed": true}
+{"ops": 99124, "of": 507150, "cut": 39100, "within_cut": true, "total": 19538, "passed": true}
+{"ops": 99448, "of": 507150, "cut": 39228, "within_cut": true, "total": 19602, "passed": true}
+{"ops": 99510, "of": 507150, "cut": 39252, "within_cut": false, "total": 19614, "passed": true}
+{"ops": 99564, "of": 507150, "cut": 39274, "within_cut": true, "total": 19625, "passed": true}
+{"ops": 100194, "of": 507150, "cut": 39523, "within_cut": true, "total": 19749, "passed": true}
+{"ops": 100905, "of": 507150, "cut": 39804, "within_cut": true, "total": 19889, "passed": true}
+{"ops": 101898, "of": 507150, "cut": 40196, "within_cut": true, "total": 20086, "passed": true}
+{"ops": 101922, "of": 507150, "cut": 40206, "within_cut": true, "total": 20090, "passed": true}
+{"ops": 102315, "of": 507150, "cut": 40361, "within_cut": true, "total": 20168, "passed": true}
+{"ops": 102526, "of": 507150, "cut": 40444, "within_cut": true, "total": 20210, "passed": true}
+{"ops": 103061, "of": 507150, "cut": 40656, "within_cut": true, "total": 20315, "passed": true}
+{"ops": 103475, "of": 507150, "cut": 40819, "within_cut": false, "total": 20397, "passed": true}
+{"ops": 103982, "of": 507150, "cut": 41019, "within_cut": false, "total": 20497, "passed": true}
+{"ops": 104247, "of": 507150, "cut": 41124, "within_cut": true, "total": 20550, "passed": true}
+{"ops": 104750, "of": 507150, "cut": 41323, "within_cut": true, "total": 20649, "passed": true}
+{"ops": 105449, "of": 507150, "cut": 41599, "within_cut": true, "total": 20787, "passed": true}
+{"ops": 105634, "of": 507150, "cut": 41672, "within_cut": true, "total": 20824, "passed": true}
+{"ops": 106214, "of": 507150, "cut": 41901, "within_cut": false, "total": 20938, "passed": true}
+{"ops": 106252, "of": 507150, "cut": 41916, "within_cut": true, "total": 20946, "passed": true}
+{"ops": 106282, "of": 507150, "cut": 41928, "within_cut": true, "total": 20952, "passed": true}
+{"ops": 107387, "of": 507150, "cut": 42357, "within_cut": true, "total": 21166, "passed": true}
+{"ops": 107388, "of": 507150, "cut": 42357, "within_cut": true, "total": 21166, "passed": true}
+{"ops": 107389, "of": 507150, "cut": 42357, "within_cut": true, "total": 21166, "passed": true}
+{"ops": 107390, "of": 507150, "cut": 42357, "within_cut": false, "total": 21166, "passed": true}
+{"ops": 107391, "of": 507150, "cut": 42358, "within_cut": true, "total": 21166, "passed": true}
+{"ops": 107392, "of": 507150, "cut": 42358, "within_cut": false, "total": 21166, "passed": true}
+{"ops": 107393, "of": 507150, "cut": 42359, "within_cut": true, "total": 21166, "passed": true}
+{"ops": 107545, "of": 507150, "cut": 42419, "within_cut": false, "total": 21196, "passed": true}
+{"ops": 107761, "of": 507150, "cut": 42504, "within_cut": false, "total": 21239, "passed": true}
+{"ops": 108884, "of": 507150, "cut": 42948, "within_cut": true, "total": 21461, "passed": true}
+{"ops": 109526, "of": 507150, "cut": 43202, "within_cut": true, "total": 21587, "passed": true}
+{"ops": 110116, "of": 507150, "cut": 43435, "within_cut": true, "total": 21704, "passed": true}
+{"ops": 110474, "of": 507150, "cut": 43576, "within_cut": true, "total": 21775, "passed": true}
+{"ops": 112222, "of": 507150, "cut": 44267, "within_cut": true, "total": 22120, "passed": true}
+{"ops": 112952, "of": 507150, "cut": 44555, "within_cut": false, "total": 22264, "passed": true}
+{"ops": 113487, "of": 507150, "cut": 44766, "within_cut": false, "total": 22370, "passed": true}
+{"ops": 114149, "of": 507150, "cut": 45028, "within_cut": true, "total": 22501, "passed": true}
+{"ops": 118199, "of": 507150, "cut": 46628, "within_cut": true, "total": 23301, "passed": true}
+{"ops": 118335, "of": 507150, "cut": 46682, "within_cut": true, "total": 23327, "passed": true}
+{"ops": 119567, "of": 507150, "cut": 47168, "within_cut": false, "total": 23571, "passed": true}
+{"ops": 119630, "of": 507150, "cut": 47193, "within_cut": false, "total": 23583, "passed": true}
+{"ops": 121502, "of": 507150, "cut": 47933, "within_cut": true, "total": 23953, "passed": true}
+{"ops": 121835, "of": 507150, "cut": 48064, "within_cut": false, "total": 24019, "passed": true}
+{"ops": 122155, "of": 507150, "cut": 48191, "within_cut": true, "total": 24082, "passed": true}
+{"ops": 122360, "of": 507150, "cut": 48272, "within_cut": true, "total": 24123, "passed": true}
+{"ops": 122721, "of": 507150, "cut": 48407, "within_cut": true, "total": 24190, "passed": true}
+{"ops": 122722, "of": 507150, "cut": 48407, "within_cut": true, "total": 24190, "passed": true}
+{"ops": 122723, "of": 507150, "cut": 48407, "within_cut": true, "total": 24190, "passed": true}
+{"ops": 122724, "of": 507150, "cut": 48407, "within_cut": false, "total": 24190, "passed": true}
+{"ops": 122725, "of": 507150, "cut": 48408, "within_cut": true, "total": 24190, "passed": true}
+{"ops": 122726, "of": 507150, "cut": 48408, "within_cut": false, "total": 24190, "passed": true}
+{"ops": 122727, "of": 507150, "cut": 48409, "within_cut": true, "total": 24190, "passed": true}
+{"ops": 123250, "of": 507150, "cut": 48616, "within_cut": true, "total": 24293, "passed": true}
+{"ops": 123679, "of": 507150, "cut": 48785, "within_cut": false, "total": 24378, "passed": true}
+{"ops": 124214, "of": 507150, "cut": 48996, "within_cut": false, "total": 24484, "passed": true}
+{"ops": 125058, "of": 507150, "cut": 49330, "within_cut": true, "total": 24651, "passed": true}
+{"ops": 128027, "of": 507150, "cut": 50503, "within_cut": true, "total": 25237, "passed": true}
+{"ops": 128190, "of": 507150, "cut": 50567, "within_cut": false, "total": 25269, "passed": true}
+{"ops": 129079, "of": 507150, "cut": 50918, "within_cut": false, "total": 25445, "passed": true}
+{"ops": 130296, "of": 507150, "cut": 51399, "within_cut": false, "total": 25685, "passed": true}
+{"ops": 130452, "of": 507150, "cut": 51461, "within_cut": true, "total": 25716, "passed": true}
+{"ops": 132904, "of": 507150, "cut": 52430, "within_cut": true, "total": 26200, "passed": true}
+{"ops": 133001, "of": 507150, "cut": 52468, "within_cut": true, "total": 26220, "passed": true}
+{"ops": 133962, "of": 507150, "cut": 52848, "within_cut": true, "total": 26409, "passed": true}
+{"ops": 134389, "of": 507150, "cut": 53016, "within_cut": true, "total": 26494, "passed": true}
+{"ops": 135974, "of": 507150, "cut": 53642, "within_cut": false, "total": 26807, "passed": true}
+{"ops": 137222, "of": 507150, "cut": 54136, "within_cut": true, "total": 27053, "passed": true}
+{"ops": 138055, "of": 507150, "cut": 54457, "within_cut": true, "total": 27214, "passed": true}
+{"ops": 138056, "of": 507150, "cut": 54457, "within_cut": true, "total": 27214, "passed": true}
+{"ops": 138057, "of": 507150, "cut": 54457, "within_cut": true, "total": 27214, "passed": true}
+{"ops": 138058, "of": 507150, "cut": 54457, "within_cut": false, "total": 27214, "passed": true}
+{"ops": 138059, "of": 507150, "cut": 54458, "within_cut": true, "total": 27214, "passed": true}
+{"ops": 138060, "of": 507150, "cut": 54458, "within_cut": false, "total": 27214, "passed": true}
+{"ops": 138061, "of": 507150, "cut": 54459, "within_cut": true, "total": 27214, "passed": true}
+{"ops": 138360, "of": 507150, "cut": 54577, "within_cut": false, "total": 27273, "passed": true}
+{"ops": 139755, "of": 507150, "cut": 55128, "within_cut": false, "total": 27549, "passed": true}
+{"ops": 141039, "of": 507150, "cut": 55636, "within_cut": true, "total": 27802, "passed": true}
+{"ops": 141429, "of": 507150, "cut": 55790, "within_cut": true, "total": 27879, "passed": true}
+{"ops": 141755, "of": 507150, "cut": 55918, "within_cut": false, "total": 27944, "passed": true}
+{"ops": 141789, "of": 507150, "cut": 55932, "within_cut": true, "total": 27950, "passed": true}
+{"ops": 142659, "of": 507150, "cut": 56276, "within_cut": true, "total": 28122, "passed": true}
+{"ops": 143548, "of": 507150, "cut": 56627, "within_cut": true, "total": 28298, "passed": true}
+{"ops": 143998, "of": 507150, "cut": 56804, "within_cut": false, "total": 28387, "passed": true}
+{"ops": 144344, "of": 507150, "cut": 56941, "within_cut": false, "total": 28455, "passed": true}
+{"ops": 144401, "of": 507150, "cut": 56964, "within_cut": true, "total": 28466, "passed": true}
+{"ops": 145429, "of": 507150, "cut": 57370, "within_cut": true, "total": 28670, "passed": true}
+{"ops": 146513, "of": 507150, "cut": 57798, "within_cut": true, "total": 28884, "passed": true}
+{"ops": 147364, "of": 507150, "cut": 58134, "within_cut": false, "total": 29052, "passed": true}
+{"ops": 148760, "of": 507150, "cut": 58686, "within_cut": true, "total": 29327, "passed": true}
+{"ops": 149753, "of": 507150, "cut": 59078, "within_cut": true, "total": 29524, "passed": true}
+{"ops": 149772, "of": 507150, "cut": 59086, "within_cut": true, "total": 29527, "passed": true}
+{"ops": 150047, "of": 507150, "cut": 59194, "within_cut": true, "total": 29582, "passed": true}
+{"ops": 150070, "of": 507150, "cut": 59203, "within_cut": false, "total": 29586, "passed": true}
+{"ops": 152620, "of": 507150, "cut": 60211, "within_cut": true, "total": 30090, "passed": true}
+{"ops": 152815, "of": 507150, "cut": 60288, "within_cut": true, "total": 30128, "passed": true}
+{"ops": 153389, "of": 507150, "cut": 60507, "within_cut": true, "total": 30238, "passed": true}
+{"ops": 153390, "of": 507150, "cut": 60507, "within_cut": true, "total": 30238, "passed": true}
+{"ops": 153391, "of": 507150, "cut": 60507, "within_cut": true, "total": 30238, "passed": true}
+{"ops": 153392, "of": 507150, "cut": 60507, "within_cut": false, "total": 30238, "passed": true}
+{"ops": 153393, "of": 507150, "cut": 60508, "within_cut": true, "total": 30238, "passed": true}
+{"ops": 153394, "of": 507150, "cut": 60508, "within_cut": false, "total": 30238, "passed": true}
+{"ops": 153395, "of": 507150, "cut": 60509, "within_cut": true, "total": 30238, "passed": true}
+{"ops": 156496, "of": 507150, "cut": 61734, "within_cut": true, "total": 30851, "passed": true}
+{"ops": 157475, "of": 507150, "cut": 62121, "within_cut": true, "total": 31044, "passed": true}
+{"ops": 157627, "of": 507150, "cut": 62181, "within_cut": true, "total": 31074, "passed": true}
+{"ops": 158387, "of": 507150, "cut": 62481, "within_cut": false, "total": 31224, "passed": true}
+{"ops": 158529, "of": 507150, "cut": 62537, "within_cut": false, "total": 31252, "passed": true}
+{"ops": 159601, "of": 507150, "cut": 62961, "within_cut": true, "total": 31464, "passed": true}
+{"ops": 163074, "of": 507150, "cut": 64333, "within_cut": true, "total": 32150, "passed": true}
+{"ops": 163377, "of": 507150, "cut": 64452, "within_cut": false, "total": 32210, "passed": true}
+{"ops": 165326, "of": 507150, "cut": 65222, "within_cut": false, "total": 32595, "passed": true}
+{"ops": 166044, "of": 507150, "cut": 65506, "within_cut": true, "total": 32737, "passed": true}
+{"ops": 166425, "of": 507150, "cut": 65657, "within_cut": true, "total": 32812, "passed": true}
+{"ops": 168595, "of": 507150, "cut": 66514, "within_cut": true, "total": 33241, "passed": true}
+{"ops": 168723, "of": 507150, "cut": 66557, "within_cut": true, "total": 33262, "passed": true}
+{"ops": 168724, "of": 507150, "cut": 66557, "within_cut": true, "total": 33262, "passed": true}
+{"ops": 168725, "of": 507150, "cut": 66557, "within_cut": true, "total": 33262, "passed": true}
+{"ops": 168726, "of": 507150, "cut": 66557, "within_cut": false, "total": 33262, "passed": true}
+{"ops": 168727, "of": 507150, "cut": 66558, "within_cut": true, "total": 33262, "passed": true}
+{"ops": 168728, "of": 507150, "cut": 66558, "within_cut": false, "total": 33262, "passed": true}
+{"ops": 168729, "of": 507150, "cut": 66559, "within_cut": true, "total": 33262, "passed": true}
+{"ops": 169317, "of": 507150, "cut": 66791, "within_cut": false, "total": 33378, "passed": true}
+{"ops": 170288, "of": 507150, "cut": 67175, "within_cut": true, "total": 33570, "passed": true}
+{"ops": 171347, "of": 507150, "cut": 67593, "within_cut": false, "total": 33779, "passed": true}
+{"ops": 171366, "of": 507150, "cut": 67601, "within_cut": true, "total": 33783, "passed": true}
+{"ops": 171610, "of": 507150, "cut": 67697, "within_cut": false, "total": 33831, "passed": true}
+{"ops": 171937, "of": 507150, "cut": 67826, "within_cut": false, "total": 33896, "passed": true}
+{"ops": 172195, "of": 507150, "cut": 67928, "within_cut": false, "total": 33947, "passed": true}
+{"ops": 174079, "of": 507150, "cut": 68672, "within_cut": false, "total": 34319, "passed": true}
+{"ops": 174445, "of": 507150, "cut": 68817, "within_cut": false, "total": 34391, "passed": true}
+{"ops": 174956, "of": 507150, "cut": 69019, "within_cut": false, "total": 34492, "passed": true}
+{"ops": 176112, "of": 507150, "cut": 69476, "within_cut": true, "total": 34720, "passed": true}
+{"ops": 177100, "of": 507150, "cut": 69866, "within_cut": true, "total": 34916, "passed": true}
+{"ops": 177417, "of": 507150, "cut": 69991, "within_cut": false, "total": 34978, "passed": true}
+{"ops": 178319, "of": 507150, "cut": 70348, "within_cut": true, "total": 35156, "passed": true}
+{"ops": 182409, "of": 507150, "cut": 71964, "within_cut": true, "total": 35964, "passed": true}
+{"ops": 184057, "of": 507150, "cut": 72607, "within_cut": true, "total": 36286, "passed": true}
+{"ops": 184058, "of": 507150, "cut": 72607, "within_cut": true, "total": 36286, "passed": true}
+{"ops": 184059, "of": 507150, "cut": 72607, "within_cut": true, "total": 36286, "passed": true}
+{"ops": 184060, "of": 507150, "cut": 72607, "within_cut": false, "total": 36286, "passed": true}
+{"ops": 184061, "of": 507150, "cut": 72608, "within_cut": true, "total": 36286, "passed": true}
+{"ops": 184062, "of": 507150, "cut": 72608, "within_cut": false, "total": 36286, "passed": true}
+{"ops": 184063, "of": 507150, "cut": 72609, "within_cut": true, "total": 36286, "passed": true}
+{"ops": 184287, "of": 507150, "cut": 72698, "within_cut": true, "total": 36330, "passed": true}
+{"ops": 185229, "of": 507150, "cut": 73070, "within_cut": true, "total": 36516, "passed": true}
+{"ops": 185657, "of": 507150, "cut": 73239, "within_cut": true, "total": 36601, "passed": true}
+{"ops": 185723, "of": 507150, "cut": 73265, "within_cut": true, "total": 36614, "passed": true}
+{"ops": 186560, "of": 507150, "cut": 73596, "within_cut": true, "total": 36779, "passed": true}
+{"ops": 190827, "of": 507150, "cut": 75281, "within_cut": false, "total": 37622, "passed": true}
+{"ops": 195370, "of": 507150, "cut": 77076, "within_cut": true, "total": 38520, "passed": true}
+{"ops": 196624, "of": 507150, "cut": 77571, "within_cut": false, "total": 38767, "passed": true}
+{"ops": 196722, "of": 507150, "cut": 77610, "within_cut": true, "total": 38787, "passed": true}
+{"ops": 197365, "of": 507150, "cut": 77864, "within_cut": true, "total": 38914, "passed": true}
+{"ops": 198878, "of": 507150, "cut": 78462, "within_cut": true, "total": 39213, "passed": true}
+{"ops": 199391, "of": 507150, "cut": 78657, "within_cut": true, "total": 39310, "passed": true}
+{"ops": 199392, "of": 507150, "cut": 78657, "within_cut": true, "total": 39310, "passed": true}
+{"ops": 199393, "of": 507150, "cut": 78657, "within_cut": true, "total": 39310, "passed": true}
+{"ops": 199394, "of": 507150, "cut": 78657, "within_cut": false, "total": 39310, "passed": true}
+{"ops": 199395, "of": 507150, "cut": 78658, "within_cut": true, "total": 39310, "passed": true}
+{"ops": 199396, "of": 507150, "cut": 78658, "within_cut": false, "total": 39310, "passed": true}
+{"ops": 199397, "of": 507150, "cut": 78659, "within_cut": true, "total": 39310, "passed": true}
+{"ops": 200572, "of": 507150, "cut": 79123, "within_cut": false, "total": 39542, "passed": true}
+{"ops": 200823, "of": 507150, "cut": 79222, "within_cut": false, "total": 39592, "passed": true}
+{"ops": 201143, "of": 507150, "cut": 79349, "within_cut": true, "total": 39655, "passed": true}
+{"ops": 201298, "of": 507150, "cut": 79410, "within_cut": true, "total": 39686, "passed": true}
+{"ops": 201340, "of": 507150, "cut": 79426, "within_cut": false, "total": 39694, "passed": true}
+{"ops": 202284, "of": 507150, "cut": 79800, "within_cut": true, "total": 39880, "passed": true}
+{"ops": 202615, "of": 507150, "cut": 79930, "within_cut": false, "total": 39946, "passed": true}
+{"ops": 202979, "of": 507150, "cut": 80074, "within_cut": true, "total": 40018, "passed": true}
+{"ops": 203040, "of": 507150, "cut": 80098, "within_cut": true, "total": 40030, "passed": true}
+{"ops": 203368, "of": 507150, "cut": 80228, "within_cut": true, "total": 40094, "passed": true}
+{"ops": 203611, "of": 507150, "cut": 80324, "within_cut": true, "total": 40142, "passed": true}
+{"ops": 203783, "of": 507150, "cut": 80392, "within_cut": true, "total": 40176, "passed": true}
+{"ops": 204730, "of": 507150, "cut": 80766, "within_cut": true, "total": 40364, "passed": true}
+{"ops": 204782, "of": 507150, "cut": 80786, "within_cut": false, "total": 40374, "passed": true}
+{"ops": 206181, "of": 507150, "cut": 81339, "within_cut": false, "total": 40650, "passed": true}
+{"ops": 209726, "of": 507150, "cut": 82740, "within_cut": true, "total": 41350, "passed": true}
+{"ops": 209746, "of": 507150, "cut": 82748, "within_cut": true, "total": 41354, "passed": true}
+{"ops": 209785, "of": 507150, "cut": 82763, "within_cut": true, "total": 41362, "passed": true}
+{"ops": 210447, "of": 507150, "cut": 83024, "within_cut": false, "total": 41493, "passed": true}
+{"ops": 211980, "of": 507150, "cut": 83630, "within_cut": true, "total": 41796, "passed": true}
+{"ops": 213501, "of": 507150, "cut": 84231, "within_cut": true, "total": 42096, "passed": true}
+{"ops": 214725, "of": 507150, "cut": 84707, "within_cut": true, "total": 42334, "passed": true}
+{"ops": 214726, "of": 507150, "cut": 84707, "within_cut": true, "total": 42334, "passed": true}
+{"ops": 214727, "of": 507150, "cut": 84707, "within_cut": true, "total": 42334, "passed": true}
+{"ops": 214728, "of": 507150, "cut": 84707, "within_cut": false, "total": 42334, "passed": true}
+{"ops": 214729, "of": 507150, "cut": 84708, "within_cut": true, "total": 42334, "passed": true}
+{"ops": 214730, "of": 507150, "cut": 84708, "within_cut": false, "total": 42334, "passed": true}
+{"ops": 214731, "of": 507150, "cut": 84709, "within_cut": true, "total": 42334, "passed": true}
+{"ops": 214733, "of": 507150, "cut": 84710, "within_cut": true, "total": 42334, "passed": true}
+{"ops": 215752, "of": 507150, "cut": 85112, "within_cut": false, "total": 42536, "passed": true}
+{"ops": 215952, "of": 507150, "cut": 85191, "within_cut": false, "total": 42575, "passed": true}
+{"ops": 216819, "of": 507150, "cut": 85534, "within_cut": true, "total": 42747, "passed": true}
+{"ops": 217454, "of": 507150, "cut": 85785, "within_cut": true, "total": 42872, "passed": true}
+{"ops": 217865, "of": 507150, "cut": 85947, "within_cut": false, "total": 42953, "passed": true}
+{"ops": 217890, "of": 507150, "cut": 85957, "within_cut": true, "total": 42958, "passed": true}
+{"ops": 217917, "of": 507150, "cut": 85968, "within_cut": true, "total": 42963, "passed": true}
+{"ops": 218469, "of": 507150, "cut": 86186, "within_cut": true, "total": 43072, "passed": true}
+{"ops": 218955, "of": 507150, "cut": 86378, "within_cut": true, "total": 43168, "passed": true}
+{"ops": 219395, "of": 507150, "cut": 86552, "within_cut": true, "total": 43255, "passed": true}
+{"ops": 219709, "of": 507150, "cut": 86676, "within_cut": true, "total": 43317, "passed": true}
+{"ops": 222021, "of": 507150, "cut": 87589, "within_cut": true, "total": 43774, "passed": true}
+{"ops": 222305, "of": 507150, "cut": 87701, "within_cut": false, "total": 43830, "passed": true}
+{"ops": 222456, "of": 507150, "cut": 87761, "within_cut": true, "total": 43860, "passed": true}
+{"ops": 223182, "of": 507150, "cut": 88048, "within_cut": true, "total": 44003, "passed": true}
+{"ops": 223651, "of": 507150, "cut": 88233, "within_cut": true, "total": 44096, "passed": true}
+{"ops": 225348, "of": 507150, "cut": 88903, "within_cut": false, "total": 44431, "passed": true}
+{"ops": 225733, "of": 507150, "cut": 89056, "within_cut": true, "total": 44507, "passed": true}
+{"ops": 226318, "of": 507150, "cut": 89286, "within_cut": false, "total": 44623, "passed": true}
+{"ops": 227253, "of": 507150, "cut": 89656, "within_cut": true, "total": 44808, "passed": true}
+{"ops": 229431, "of": 507150, "cut": 90516, "within_cut": false, "total": 45238, "passed": true}
+{"ops": 230059, "of": 507150, "cut": 90757, "within_cut": true, "total": 45358, "passed": true}
+{"ops": 230060, "of": 507150, "cut": 90757, "within_cut": true, "total": 45358, "passed": true}
+{"ops": 230061, "of": 507150, "cut": 90757, "within_cut": true, "total": 45358, "passed": true}
+{"ops": 230062, "of": 507150, "cut": 90757, "within_cut": false, "total": 45358, "passed": true}
+{"ops": 230063, "of": 507150, "cut": 90758, "within_cut": true, "total": 45358, "passed": true}
+{"ops": 230064, "of": 507150, "cut": 90758, "within_cut": false, "total": 45358, "passed": true}
+{"ops": 230065, "of": 507150, "cut": 90759, "within_cut": true, "total": 45358, "passed": true}
+{"ops": 231432, "of": 507150, "cut": 91299, "within_cut": false, "total": 45628, "passed": true}
+{"ops": 231760, "of": 507150, "cut": 91429, "within_cut": true, "total": 45693, "passed": true}
+{"ops": 232052, "of": 507150, "cut": 91544, "within_cut": true, "total": 45751, "passed": true}
+{"ops": 232269, "of": 507150, "cut": 91630, "within_cut": true, "total": 45793, "passed": true}
+{"ops": 232616, "of": 507150, "cut": 91767, "within_cut": true, "total": 45862, "passed": true}
+{"ops": 232818, "of": 507150, "cut": 91846, "within_cut": false, "total": 45902, "passed": true}
+{"ops": 233610, "of": 507150, "cut": 92160, "within_cut": true, "total": 46058, "passed": true}
+{"ops": 237416, "of": 507150, "cut": 93663, "within_cut": false, "total": 46810, "passed": true}
+{"ops": 237521, "of": 507150, "cut": 93704, "within_cut": false, "total": 46831, "passed": true}
+{"ops": 239567, "of": 507150, "cut": 94513, "within_cut": true, "total": 47235, "passed": true}
+{"ops": 240716, "of": 507150, "cut": 94967, "within_cut": true, "total": 47462, "passed": true}
+{"ops": 240859, "of": 507150, "cut": 95023, "within_cut": false, "total": 47490, "passed": true}
+{"ops": 241799, "of": 507150, "cut": 95395, "within_cut": true, "total": 47676, "passed": true}
+{"ops": 242006, "of": 507150, "cut": 95476, "within_cut": false, "total": 47717, "passed": true}
+{"ops": 242872, "of": 507150, "cut": 95818, "within_cut": false, "total": 47888, "passed": true}
+{"ops": 243561, "of": 507150, "cut": 96091, "within_cut": true, "total": 48024, "passed": true}
+{"ops": 243774, "of": 507150, "cut": 96175, "within_cut": true, "total": 48066, "passed": true}
+{"ops": 243838, "of": 507150, "cut": 96200, "within_cut": true, "total": 48079, "passed": true}
+{"ops": 244673, "of": 507150, "cut": 96530, "within_cut": true, "total": 48244, "passed": true}
+{"ops": 244826, "of": 507150, "cut": 96590, "within_cut": false, "total": 48274, "passed": true}
+{"ops": 245393, "of": 507150, "cut": 96807, "within_cut": true, "total": 48382, "passed": true}
+{"ops": 245394, "of": 507150, "cut": 96807, "within_cut": true, "total": 48382, "passed": true}
+{"ops": 245395, "of": 507150, "cut": 96807, "within_cut": true, "total": 48382, "passed": true}
+{"ops": 245396, "of": 507150, "cut": 96807, "within_cut": false, "total": 48382, "passed": true}
+{"ops": 245397, "of": 507150, "cut": 96808, "within_cut": true, "total": 48382, "passed": true}
+{"ops": 245398, "of": 507150, "cut": 96808, "within_cut": false, "total": 48382, "passed": true}
+{"ops": 245399, "of": 507150, "cut": 96809, "within_cut": true, "total": 48382, "passed": true}
+{"ops": 246029, "of": 507150, "cut": 97058, "within_cut": true, "total": 48507, "passed": true}
+{"ops": 246285, "of": 507150, "cut": 97159, "within_cut": false, "total": 48557, "passed": true}
+{"ops": 246825, "of": 507150, "cut": 97372, "within_cut": false, "total": 48664, "passed": true}
+{"ops": 249299, "of": 507150, "cut": 98350, "within_cut": true, "total": 49152, "passed": true}
+{"ops": 250871, "of": 507150, "cut": 98971, "within_cut": true, "total": 49463, "passed": true}
+{"ops": 250956, "of": 507150, "cut": 99004, "within_cut": false, "total": 49480, "passed": true}
+{"ops": 252714, "of": 507150, "cut": 99699, "within_cut": true, "total": 49827, "passed": true}
+{"ops": 254179, "of": 507150, "cut": 100278, "within_cut": true, "total": 50116, "passed": true}
+{"ops": 254367, "of": 507150, "cut": 100352, "within_cut": true, "total": 50154, "passed": true}
+{"ops": 254776, "of": 507150, "cut": 100514, "within_cut": true, "total": 50234, "passed": true}
+{"ops": 256196, "of": 507150, "cut": 101074, "within_cut": false, "total": 50515, "passed": true}
+{"ops": 256427, "of": 507150, "cut": 101166, "within_cut": true, "total": 50560, "passed": true}
+{"ops": 256540, "of": 507150, "cut": 101210, "within_cut": false, "total": 50583, "passed": true}
+{"ops": 256759, "of": 507150, "cut": 101297, "within_cut": true, "total": 50626, "passed": true}
+{"ops": 256918, "of": 507150, "cut": 101360, "within_cut": true, "total": 50657, "passed": true}
+{"ops": 257201, "of": 507150, "cut": 101472, "within_cut": true, "total": 50713, "passed": true}
+{"ops": 257762, "of": 507150, "cut": 101693, "within_cut": false, "total": 50824, "passed": true}
+{"ops": 259737, "of": 507150, "cut": 102473, "within_cut": false, "total": 51214, "passed": true}
+{"ops": 260727, "of": 507150, "cut": 102857, "within_cut": true, "total": 51406, "passed": true}
+{"ops": 260728, "of": 507150, "cut": 102857, "within_cut": true, "total": 51406, "passed": true}
+{"ops": 260729, "of": 507150, "cut": 102857, "within_cut": true, "total": 51406, "passed": true}
+{"ops": 260730, "of": 507150, "cut": 102857, "within_cut": false, "total": 51406, "passed": true}
+{"ops": 260731, "of": 507150, "cut": 102858, "within_cut": true, "total": 51406, "passed": true}
+{"ops": 260732, "of": 507150, "cut": 102858, "within_cut": false, "total": 51406, "passed": true}
+{"ops": 260733, "of": 507150, "cut": 102859, "within_cut": true, "total": 51406, "passed": true}
+{"ops": 263479, "of": 507150, "cut": 103944, "within_cut": true, "total": 51949, "passed": true}
+{"ops": 264059, "of": 507150, "cut": 104173, "within_cut": true, "total": 52063, "passed": true}
+{"ops": 264288, "of": 507150, "cut": 104264, "within_cut": true, "total": 52108, "passed": true}
+{"ops": 264417, "of": 507150, "cut": 104314, "within_cut": false, "total": 52134, "passed": true}
+{"ops": 264630, "of": 507150, "cut": 104398, "within_cut": false, "total": 52176, "passed": true}
+{"ops": 264798, "of": 507150, "cut": 104465, "within_cut": true, "total": 52209, "passed": true}
+{"ops": 265128, "of": 507150, "cut": 104595, "within_cut": false, "total": 52274, "passed": true}
+{"ops": 265140, "of": 507150, "cut": 104600, "within_cut": true, "total": 52277, "passed": true}
+{"ops": 265312, "of": 507150, "cut": 104668, "within_cut": true, "total": 52311, "passed": true}
+{"ops": 267593, "of": 507150, "cut": 105569, "within_cut": false, "total": 52761, "passed": true}
+{"ops": 267672, "of": 507150, "cut": 105600, "within_cut": false, "total": 52777, "passed": true}
+{"ops": 269280, "of": 507150, "cut": 106236, "within_cut": true, "total": 53094, "passed": true}
+{"ops": 270503, "of": 507150, "cut": 106719, "within_cut": true, "total": 53336, "passed": true}
+{"ops": 270844, "of": 507150, "cut": 106854, "within_cut": true, "total": 53403, "passed": true}
+{"ops": 271392, "of": 507150, "cut": 107070, "within_cut": true, "total": 53512, "passed": true}
+{"ops": 271865, "of": 507150, "cut": 107257, "within_cut": true, "total": 53605, "passed": true}
+{"ops": 272166, "of": 507150, "cut": 107376, "within_cut": true, "total": 53664, "passed": true}
+{"ops": 273010, "of": 507150, "cut": 107709, "within_cut": false, "total": 53831, "passed": true}
+{"ops": 273728, "of": 507150, "cut": 107993, "within_cut": true, "total": 53973, "passed": true}
+{"ops": 274439, "of": 507150, "cut": 108274, "within_cut": true, "total": 54113, "passed": true}
+{"ops": 276061, "of": 507150, "cut": 108907, "within_cut": true, "total": 54430, "passed": true}
+{"ops": 276062, "of": 507150, "cut": 108907, "within_cut": true, "total": 54430, "passed": true}
+{"ops": 276063, "of": 507150, "cut": 108907, "within_cut": true, "total": 54430, "passed": true}
+{"ops": 276064, "of": 507150, "cut": 108907, "within_cut": false, "total": 54430, "passed": true}
+{"ops": 276065, "of": 507150, "cut": 108908, "within_cut": true, "total": 54430, "passed": true}
+{"ops": 276066, "of": 507150, "cut": 108908, "within_cut": false, "total": 54430, "passed": true}
+{"ops": 276067, "of": 507150, "cut": 108909, "within_cut": true, "total": 54430, "passed": true}
+{"ops": 276768, "of": 507150, "cut": 109186, "within_cut": true, "total": 54569, "passed": true}
+{"ops": 278293, "of": 507150, "cut": 109788, "within_cut": false, "total": 54870, "passed": true}
+{"ops": 280994, "of": 507150, "cut": 110856, "within_cut": true, "total": 55403, "passed": true}
+{"ops": 281823, "of": 507150, "cut": 111183, "within_cut": true, "total": 55567, "passed": true}
+{"ops": 283154, "of": 507150, "cut": 111709, "within_cut": true, "total": 55830, "passed": true}
+{"ops": 286127, "of": 507150, "cut": 112883, "within_cut": false, "total": 56417, "passed": true}
+{"ops": 286814, "of": 507150, "cut": 113155, "within_cut": true, "total": 56553, "passed": true}
+{"ops": 287213, "of": 507150, "cut": 113312, "within_cut": false, "total": 56632, "passed": true}
+{"ops": 287701, "of": 507150, "cut": 113505, "within_cut": false, "total": 56728, "passed": true}
+{"ops": 291395, "of": 507150, "cut": 114957, "within_cut": true, "total": 57454, "passed": true}
+{"ops": 291396, "of": 507150, "cut": 114957, "within_cut": true, "total": 57454, "passed": true}
+{"ops": 291397, "of": 507150, "cut": 114957, "within_cut": true, "total": 57454, "passed": true}
+{"ops": 291398, "of": 507150, "cut": 114957, "within_cut": false, "total": 57454, "passed": true}
+{"ops": 291399, "of": 507150, "cut": 114958, "within_cut": true, "total": 57454, "passed": true}
+{"ops": 291400, "of": 507150, "cut": 114958, "within_cut": false, "total": 57454, "passed": true}
+{"ops": 291401, "of": 507150, "cut": 114959, "within_cut": true, "total": 57454, "passed": true}
+{"ops": 292699, "of": 507150, "cut": 115472, "within_cut": true, "total": 57710, "passed": true}
+{"ops": 294132, "of": 507150, "cut": 116038, "within_cut": true, "total": 57994, "passed": true}
+{"ops": 294453, "of": 507150, "cut": 116165, "within_cut": true, "total": 58057, "passed": true}
+{"ops": 294690, "of": 507150, "cut": 116258, "within_cut": false, "total": 58104, "passed": true}
+{"ops": 294767, "of": 507150, "cut": 116289, "within_cut": true, "total": 58119, "passed": true}
+{"ops": 296293, "of": 507150, "cut": 116892, "within_cut": true, "total": 58420, "passed": true}
+{"ops": 298085, "of": 507150, "cut": 117600, "within_cut": true, "total": 58774, "passed": true}
+{"ops": 299766, "of": 507150, "cut": 118264, "within_cut": true, "total": 59106, "passed": true}
+{"ops": 302475, "of": 507150, "cut": 119334, "within_cut": true, "total": 59642, "passed": true}
+{"ops": 302972, "of": 507150, "cut": 119530, "within_cut": false, "total": 59740, "passed": true}
+{"ops": 303126, "of": 507150, "cut": 119591, "within_cut": false, "total": 59770, "passed": true}
+{"ops": 303636, "of": 507150, "cut": 119792, "within_cut": false, "total": 59871, "passed": true}
+{"ops": 306331, "of": 507150, "cut": 120857, "within_cut": false, "total": 60403, "passed": true}
+{"ops": 306662, "of": 507150, "cut": 120988, "within_cut": true, "total": 60469, "passed": true}
+{"ops": 306729, "of": 507150, "cut": 121007, "within_cut": true, "total": 60478, "passed": true}
+{"ops": 306730, "of": 507150, "cut": 121007, "within_cut": true, "total": 60478, "passed": true}
+{"ops": 306731, "of": 507150, "cut": 121007, "within_cut": true, "total": 60478, "passed": true}
+{"ops": 306732, "of": 507150, "cut": 121007, "within_cut": false, "total": 60478, "passed": true}
+{"ops": 306733, "of": 507150, "cut": 121008, "within_cut": true, "total": 60478, "passed": true}
+{"ops": 306734, "of": 507150, "cut": 121008, "within_cut": false, "total": 60478, "passed": true}
+{"ops": 306735, "of": 507150, "cut": 121009, "within_cut": true, "total": 60478, "passed": true}
+{"ops": 307851, "of": 507150, "cut": 121450, "within_cut": true, "total": 60699, "passed": true}
+{"ops": 308921, "of": 507150, "cut": 121872, "within_cut": false, "total": 60910, "passed": true}
+{"ops": 309843, "of": 507150, "cut": 122237, "within_cut": true, "total": 61092, "passed": true}
+{"ops": 310592, "of": 507150, "cut": 122533, "within_cut": true, "total": 61240, "passed": true}
+{"ops": 310969, "of": 507150, "cut": 122682, "within_cut": true, "total": 61314, "passed": true}
+{"ops": 311911, "of": 507150, "cut": 123054, "within_cut": true, "total": 61501, "passed": true}
+{"ops": 312228, "of": 507150, "cut": 123179, "within_cut": false, "total": 61563, "passed": true}
+{"ops": 312767, "of": 507150, "cut": 123392, "within_cut": true, "total": 61670, "passed": true}
+{"ops": 313035, "of": 507150, "cut": 123498, "within_cut": true, "total": 61723, "passed": true}
+{"ops": 313859, "of": 507150, "cut": 123824, "within_cut": true, "total": 61885, "passed": true}
+{"ops": 314186, "of": 507150, "cut": 123952, "within_cut": false, "total": 61950, "passed": true}
+{"ops": 315514, "of": 507150, "cut": 124477, "within_cut": false, "total": 62212, "passed": true}
+{"ops": 315808, "of": 507150, "cut": 124593, "within_cut": false, "total": 62270, "passed": true}
+{"ops": 316476, "of": 507150, "cut": 124857, "within_cut": false, "total": 62402, "passed": true}
+{"ops": 316635, "of": 507150, "cut": 124920, "within_cut": true, "total": 62434, "passed": true}
+{"ops": 318089, "of": 507150, "cut": 125494, "within_cut": false, "total": 62721, "passed": true}
+{"ops": 318135, "of": 507150, "cut": 125513, "within_cut": true, "total": 62730, "passed": true}
+{"ops": 319053, "of": 507150, "cut": 125875, "within_cut": false, "total": 62911, "passed": true}
+{"ops": 319839, "of": 507150, "cut": 126186, "within_cut": true, "total": 63067, "passed": true}
+{"ops": 320036, "of": 507150, "cut": 126264, "within_cut": true, "total": 63105, "passed": true}
+{"ops": 320349, "of": 507150, "cut": 126387, "within_cut": false, "total": 63167, "passed": true}
+{"ops": 321552, "of": 507150, "cut": 126863, "within_cut": true, "total": 63405, "passed": true}
+{"ops": 322063, "of": 507150, "cut": 127057, "within_cut": true, "total": 63502, "passed": true}
+{"ops": 322064, "of": 507150, "cut": 127057, "within_cut": true, "total": 63502, "passed": true}
+{"ops": 322065, "of": 507150, "cut": 127057, "within_cut": true, "total": 63502, "passed": true}
+{"ops": 322066, "of": 507150, "cut": 127057, "within_cut": false, "total": 63502, "passed": true}
+{"ops": 322067, "of": 507150, "cut": 127058, "within_cut": true, "total": 63502, "passed": true}
+{"ops": 322068, "of": 507150, "cut": 127058, "within_cut": false, "total": 63502, "passed": true}
+{"ops": 322069, "of": 507150, "cut": 127059, "within_cut": true, "total": 63502, "passed": true}
+{"ops": 322499, "of": 507150, "cut": 127229, "within_cut": true, "total": 63587, "passed": true}
+{"ops": 322806, "of": 507150, "cut": 127350, "within_cut": true, "total": 63648, "passed": true}
+{"ops": 323882, "of": 507150, "cut": 127775, "within_cut": false, "total": 63860, "passed": true}
+{"ops": 323958, "of": 507150, "cut": 127805, "within_cut": false, "total": 63875, "passed": true}
+{"ops": 325801, "of": 507150, "cut": 128533, "within_cut": false, "total": 64239, "passed": true}
+{"ops": 327025, "of": 507150, "cut": 129017, "within_cut": true, "total": 64481, "passed": true}
+{"ops": 327547, "of": 507150, "cut": 129223, "within_cut": false, "total": 64584, "passed": true}
+{"ops": 327913, "of": 507150, "cut": 129368, "within_cut": true, "total": 64656, "passed": true}
+{"ops": 328745, "of": 507150, "cut": 129696, "within_cut": false, "total": 64821, "passed": true}
+{"ops": 331650, "of": 507150, "cut": 130844, "within_cut": true, "total": 65395, "passed": true}
+{"ops": 333746, "of": 507150, "cut": 131672, "within_cut": true, "total": 65809, "passed": true}
+{"ops": 334085, "of": 507150, "cut": 131806, "within_cut": true, "total": 65876, "passed": true}
+{"ops": 334236, "of": 507150, "cut": 131866, "within_cut": true, "total": 65905, "passed": true}
+{"ops": 334440, "of": 507150, "cut": 131946, "within_cut": false, "total": 65946, "passed": true}
+{"ops": 336891, "of": 507150, "cut": 132914, "within_cut": false, "total": 66430, "passed": true}
+{"ops": 337397, "of": 507150, "cut": 133107, "within_cut": true, "total": 66526, "passed": true}
+{"ops": 337398, "of": 507150, "cut": 133107, "within_cut": true, "total": 66526, "passed": true}
+{"ops": 337399, "of": 507150, "cut": 133107, "within_cut": true, "total": 66526, "passed": true}
+{"ops": 337400, "of": 507150, "cut": 133107, "within_cut": false, "total": 66526, "passed": true}
+{"ops": 337401, "of": 507150, "cut": 133108, "within_cut": true, "total": 66526, "passed": true}
+{"ops": 337402, "of": 507150, "cut": 133108, "within_cut": false, "total": 66526, "passed": true}
+{"ops": 337403, "of": 507150, "cut": 133109, "within_cut": true, "total": 66526, "passed": true}
+{"ops": 338285, "of": 507150, "cut": 133458, "within_cut": true, "total": 66700, "passed": true}
+{"ops": 339253, "of": 507150, "cut": 133840, "within_cut": true, "total": 66892, "passed": true}
+{"ops": 340275, "of": 507150, "cut": 134244, "within_cut": true, "total": 67093, "passed": true}
+{"ops": 342630, "of": 507150, "cut": 135174, "within_cut": true, "total": 67559, "passed": true}
+{"ops": 343344, "of": 507150, "cut": 135456, "within_cut": true, "total": 67700, "passed": true}
+{"ops": 343375, "of": 507150, "cut": 135468, "within_cut": false, "total": 67706, "passed": true}
+{"ops": 344534, "of": 507150, "cut": 135926, "within_cut": true, "total": 67935, "passed": true}
+{"ops": 345836, "of": 507150, "cut": 136440, "within_cut": false, "total": 68192, "passed": true}
+{"ops": 346085, "of": 507150, "cut": 136539, "within_cut": true, "total": 68241, "passed": true}
+{"ops": 346351, "of": 507150, "cut": 136644, "within_cut": true, "total": 68294, "passed": true}
+{"ops": 346657, "of": 507150, "cut": 136765, "within_cut": true, "total": 68354, "passed": true}
+{"ops": 346735, "of": 507150, "cut": 136796, "within_cut": true, "total": 68369, "passed": true}
+{"ops": 348328, "of": 507150, "cut": 137425, "within_cut": false, "total": 68684, "passed": true}
+{"ops": 348882, "of": 507150, "cut": 137644, "within_cut": true, "total": 68794, "passed": true}
+{"ops": 349516, "of": 507150, "cut": 137894, "within_cut": false, "total": 68919, "passed": true}
+{"ops": 350304, "of": 507150, "cut": 138206, "within_cut": true, "total": 69074, "passed": true}
+{"ops": 352731, "of": 507150, "cut": 139157, "within_cut": true, "total": 69550, "passed": true}
+{"ops": 352732, "of": 507150, "cut": 139157, "within_cut": true, "total": 69550, "passed": true}
+{"ops": 352733, "of": 507150, "cut": 139157, "within_cut": true, "total": 69550, "passed": true}
+{"ops": 352734, "of": 507150, "cut": 139157, "within_cut": false, "total": 69550, "passed": true}
+{"ops": 352735, "of": 507150, "cut": 139158, "within_cut": true, "total": 69550, "passed": true}
+{"ops": 352736, "of": 507150, "cut": 139158, "within_cut": false, "total": 69550, "passed": true}
+{"ops": 352737, "of": 507150, "cut": 139159, "within_cut": true, "total": 69550, "passed": true}
+{"ops": 352749, "of": 507150, "cut": 139164, "within_cut": true, "total": 69552, "passed": true}
+{"ops": 353586, "of": 507150, "cut": 139494, "within_cut": false, "total": 69718, "passed": true}
+{"ops": 353926, "of": 507150, "cut": 139629, "within_cut": true, "total": 69785, "passed": true}
+{"ops": 355508, "of": 507150, "cut": 140254, "within_cut": true, "total": 70097, "passed": true}
+{"ops": 355618, "of": 507150, "cut": 140297, "within_cut": false, "total": 70119, "passed": true}
+{"ops": 355822, "of": 507150, "cut": 140378, "within_cut": true, "total": 70159, "passed": true}
+{"ops": 356442, "of": 507150, "cut": 140623, "within_cut": true, "total": 70282, "passed": true}
+{"ops": 356829, "of": 507150, "cut": 140776, "within_cut": true, "total": 70358, "passed": true}
+{"ops": 357311, "of": 507150, "cut": 140966, "within_cut": true, "total": 70454, "passed": true}
+{"ops": 357421, "of": 507150, "cut": 141010, "within_cut": true, "total": 70475, "passed": true}
+{"ops": 357503, "of": 507150, "cut": 141042, "within_cut": true, "total": 70492, "passed": true}
+{"ops": 358251, "of": 507150, "cut": 141337, "within_cut": false, "total": 70639, "passed": true}
+{"ops": 358380, "of": 507150, "cut": 141388, "within_cut": false, "total": 70665, "passed": true}
+{"ops": 358773, "of": 507150, "cut": 141544, "within_cut": true, "total": 70742, "passed": true}
+{"ops": 359083, "of": 507150, "cut": 141666, "within_cut": true, "total": 70804, "passed": true}
+{"ops": 360342, "of": 507150, "cut": 142164, "within_cut": true, "total": 71052, "passed": true}
+{"ops": 360385, "of": 507150, "cut": 142180, "within_cut": false, "total": 71061, "passed": true}
+{"ops": 360946, "of": 507150, "cut": 142402, "within_cut": true, "total": 71172, "passed": true}
+{"ops": 361313, "of": 507150, "cut": 142547, "within_cut": false, "total": 71244, "passed": true}
+{"ops": 362612, "of": 507150, "cut": 143060, "within_cut": false, "total": 71501, "passed": true}
+{"ops": 363278, "of": 507150, "cut": 143323, "within_cut": false, "total": 71632, "passed": true}
+{"ops": 364168, "of": 507150, "cut": 143675, "within_cut": true, "total": 71808, "passed": true}
+{"ops": 365754, "of": 507150, "cut": 144302, "within_cut": true, "total": 72121, "passed": true}
+{"ops": 365894, "of": 507150, "cut": 144357, "within_cut": true, "total": 72149, "passed": true}
+{"ops": 366139, "of": 507150, "cut": 144454, "within_cut": true, "total": 72197, "passed": true}
+{"ops": 366269, "of": 507150, "cut": 144505, "within_cut": true, "total": 72223, "passed": true}
+{"ops": 366953, "of": 507150, "cut": 144775, "within_cut": false, "total": 72358, "passed": true}
+{"ops": 366991, "of": 507150, "cut": 144790, "within_cut": true, "total": 72366, "passed": true}
+{"ops": 368065, "of": 507150, "cut": 145207, "within_cut": true, "total": 72574, "passed": true}
+{"ops": 368066, "of": 507150, "cut": 145207, "within_cut": true, "total": 72574, "passed": true}
+{"ops": 368067, "of": 507150, "cut": 145207, "within_cut": true, "total": 72574, "passed": true}
+{"ops": 368068, "of": 507150, "cut": 145207, "within_cut": false, "total": 72574, "passed": true}
+{"ops": 368069, "of": 507150, "cut": 145208, "within_cut": true, "total": 72574, "passed": true}
+{"ops": 368070, "of": 507150, "cut": 145208, "within_cut": false, "total": 72574, "passed": true}
+{"ops": 368071, "of": 507150, "cut": 145209, "within_cut": true, "total": 72574, "passed": true}
+{"ops": 368406, "of": 507150, "cut": 145341, "within_cut": false, "total": 72640, "passed": true}
+{"ops": 368505, "of": 507150, "cut": 145380, "within_cut": false, "total": 72660, "passed": true}
+{"ops": 369710, "of": 507150, "cut": 145856, "within_cut": false, "total": 72898, "passed": true}
+{"ops": 371111, "of": 507150, "cut": 146410, "within_cut": true, "total": 73175, "passed": true}
+{"ops": 372298, "of": 507150, "cut": 146879, "within_cut": true, "total": 73409, "passed": true}
+{"ops": 373539, "of": 507150, "cut": 147369, "within_cut": false, "total": 73654, "passed": true}
+{"ops": 373771, "of": 507150, "cut": 147461, "within_cut": true, "total": 73700, "passed": true}
+{"ops": 374000, "of": 507150, "cut": 147551, "within_cut": false, "total": 73745, "passed": true}
+{"ops": 374065, "of": 507150, "cut": 147577, "within_cut": true, "total": 73758, "passed": true}
+{"ops": 374984, "of": 507150, "cut": 147940, "within_cut": true, "total": 73940, "passed": true}
+{"ops": 375264, "of": 507150, "cut": 148051, "within_cut": true, "total": 73995, "passed": true}
+{"ops": 376277, "of": 507150, "cut": 148451, "within_cut": true, "total": 74195, "passed": true}
+{"ops": 377321, "of": 507150, "cut": 148863, "within_cut": false, "total": 74401, "passed": true}
+{"ops": 380853, "of": 507150, "cut": 150259, "within_cut": true, "total": 75099, "passed": true}
+{"ops": 380964, "of": 507150, "cut": 150302, "within_cut": false, "total": 75121, "passed": true}
+{"ops": 381178, "of": 507150, "cut": 150387, "within_cut": false, "total": 75163, "passed": true}
+{"ops": 381224, "of": 507150, "cut": 150405, "within_cut": false, "total": 75172, "passed": true}
+{"ops": 381228, "of": 507150, "cut": 150407, "within_cut": true, "total": 75173, "passed": true}
+{"ops": 381403, "of": 507150, "cut": 150476, "within_cut": true, "total": 75208, "passed": true}
+{"ops": 383399, "of": 507150, "cut": 151257, "within_cut": true, "total": 75598, "passed": true}
+{"ops": 383400, "of": 507150, "cut": 151257, "within_cut": true, "total": 75598, "passed": true}
+{"ops": 383401, "of": 507150, "cut": 151257, "within_cut": true, "total": 75598, "passed": true}
+{"ops": 383402, "of": 507150, "cut": 151257, "within_cut": false, "total": 75598, "passed": true}
+{"ops": 383403, "of": 507150, "cut": 151258, "within_cut": true, "total": 75598, "passed": true}
+{"ops": 383404, "of": 507150, "cut": 151258, "within_cut": false, "total": 75598, "passed": true}
+{"ops": 383405, "of": 507150, "cut": 151259, "within_cut": true, "total": 75598, "passed": true}
+{"ops": 385593, "of": 507150, "cut": 152123, "within_cut": false, "total": 76030, "passed": true}
+{"ops": 386459, "of": 507150, "cut": 152466, "within_cut": true, "total": 76201, "passed": true}
+{"ops": 387022, "of": 507150, "cut": 152688, "within_cut": true, "total": 76313, "passed": true}
+{"ops": 387679, "of": 507150, "cut": 152948, "within_cut": true, "total": 76442, "passed": true}
+{"ops": 388123, "of": 507150, "cut": 153123, "within_cut": true, "total": 76530, "passed": true}
+{"ops": 390073, "of": 507150, "cut": 153893, "within_cut": false, "total": 76915, "passed": true}
+{"ops": 392903, "of": 507150, "cut": 155011, "within_cut": false, "total": 77474, "passed": true}
+{"ops": 394537, "of": 507150, "cut": 155657, "within_cut": true, "total": 77797, "passed": true}
+{"ops": 398733, "of": 507150, "cut": 157307, "within_cut": true, "total": 78622, "passed": true}
+{"ops": 398734, "of": 507150, "cut": 157307, "within_cut": true, "total": 78622, "passed": true}
+{"ops": 398735, "of": 507150, "cut": 157307, "within_cut": true, "total": 78622, "passed": true}
+{"ops": 398736, "of": 507150, "cut": 157307, "within_cut": false, "total": 78622, "passed": true}
+{"ops": 398737, "of": 507150, "cut": 157308, "within_cut": true, "total": 78622, "passed": true}
+{"ops": 398738, "of": 507150, "cut": 157308, "within_cut": false, "total": 78622, "passed": true}
+{"ops": 398739, "of": 507150, "cut": 157309, "within_cut": true, "total": 78622, "passed": true}
+{"ops": 399378, "of": 507150, "cut": 157562, "within_cut": true, "total": 78748, "passed": true}
+{"ops": 400386, "of": 507150, "cut": 157960, "within_cut": true, "total": 78947, "passed": true}
+{"ops": 403290, "of": 507150, "cut": 159107, "within_cut": true, "total": 79521, "passed": true}
+{"ops": 403356, "of": 507150, "cut": 159133, "within_cut": true, "total": 79534, "passed": true}
+{"ops": 403830, "of": 507150, "cut": 159320, "within_cut": false, "total": 79628, "passed": true}
+{"ops": 404164, "of": 507150, "cut": 159452, "within_cut": true, "total": 79694, "passed": true}
+{"ops": 404237, "of": 507150, "cut": 159481, "within_cut": false, "total": 79708, "passed": true}
+{"ops": 405034, "of": 507150, "cut": 159796, "within_cut": true, "total": 79866, "passed": true}
+{"ops": 407582, "of": 507150, "cut": 160802, "within_cut": false, "total": 80369, "passed": true}
+{"ops": 407734, "of": 507150, "cut": 160862, "within_cut": false, "total": 80399, "passed": true}
+{"ops": 407981, "of": 507150, "cut": 160960, "within_cut": true, "total": 80448, "passed": true}
+{"ops": 407989, "of": 507150, "cut": 160963, "within_cut": false, "total": 80449, "passed": true}
+{"ops": 408191, "of": 507150, "cut": 161043, "within_cut": false, "total": 80489, "passed": true}
+{"ops": 409229, "of": 507150, "cut": 161453, "within_cut": false, "total": 80694, "passed": true}
+{"ops": 409454, "of": 507150, "cut": 161542, "within_cut": true, "total": 80739, "passed": true}
+{"ops": 412228, "of": 507150, "cut": 162638, "within_cut": true, "total": 81287, "passed": true}
+{"ops": 413624, "of": 507150, "cut": 163190, "within_cut": true, "total": 81562, "passed": true}
+{"ops": 413987, "of": 507150, "cut": 163333, "within_cut": true, "total": 81634, "passed": true}
+{"ops": 414020, "of": 507150, "cut": 163346, "within_cut": true, "total": 81641, "passed": true}
+{"ops": 414067, "of": 507150, "cut": 163357, "within_cut": true, "total": 81646, "passed": true}
+{"ops": 414068, "of": 507150, "cut": 163357, "within_cut": true, "total": 81646, "passed": true}
+{"ops": 414069, "of": 507150, "cut": 163357, "within_cut": true, "total": 81646, "passed": true}
+{"ops": 414070, "of": 507150, "cut": 163357, "within_cut": false, "total": 81646, "passed": true}
+{"ops": 414071, "of": 507150, "cut": 163358, "within_cut": true, "total": 81646, "passed": true}
+{"ops": 414072, "of": 507150, "cut": 163358, "within_cut": false, "total": 81646, "passed": true}
+{"ops": 414073, "of": 507150, "cut": 163359, "within_cut": true, "total": 81646, "passed": true}
+{"ops": 415515, "of": 507150, "cut": 163927, "within_cut": true, "total": 81930, "passed": true}
+{"ops": 415516, "of": 507150, "cut": 163927, "within_cut": true, "total": 81930, "passed": true}
+{"ops": 415517, "of": 507150, "cut": 163927, "within_cut": true, "total": 81930, "passed": true}
+{"ops": 415518, "of": 507150, "cut": 163927, "within_cut": false, "total": 81930, "passed": true}
+{"ops": 415519, "of": 507150, "cut": 163928, "within_cut": true, "total": 81930, "passed": true}
+{"ops": 415520, "of": 507150, "cut": 163928, "within_cut": false, "total": 81930, "passed": true}
+{"ops": 415521, "of": 507150, "cut": 163929, "within_cut": true, "total": 81930, "passed": true}
+{"ops": 416336, "of": 507150, "cut": 164251, "within_cut": true, "total": 82091, "passed": true}
+{"ops": 416556, "of": 507150, "cut": 164338, "within_cut": true, "total": 82134, "passed": true}
+{"ops": 419336, "of": 507150, "cut": 165436, "within_cut": true, "total": 82684, "passed": true}
+{"ops": 420063, "of": 507150, "cut": 165723, "within_cut": false, "total": 82827, "passed": true}
+{"ops": 421379, "of": 507150, "cut": 166243, "within_cut": true, "total": 83087, "passed": true}
+{"ops": 423043, "of": 507150, "cut": 166900, "within_cut": false, "total": 83416, "passed": true}
+{"ops": 423176, "of": 507150, "cut": 166953, "within_cut": true, "total": 83442, "passed": true}
+{"ops": 424254, "of": 507150, "cut": 167379, "within_cut": true, "total": 83655, "passed": true}
+{"ops": 424652, "of": 507150, "cut": 167536, "within_cut": true, "total": 83734, "passed": true}
+{"ops": 425821, "of": 507150, "cut": 167998, "within_cut": true, "total": 83965, "passed": true}
+{"ops": 427456, "of": 507150, "cut": 168644, "within_cut": true, "total": 84287, "passed": true}
+{"ops": 427520, "of": 507150, "cut": 168669, "within_cut": false, "total": 84300, "passed": true}
+{"ops": 428320, "of": 507150, "cut": 168985, "within_cut": false, "total": 84458, "passed": true}
+{"ops": 428827, "of": 507150, "cut": 169185, "within_cut": false, "total": 84558, "passed": true}
+{"ops": 428932, "of": 507150, "cut": 169227, "within_cut": true, "total": 84579, "passed": true}
+{"ops": 429412, "of": 507150, "cut": 169409, "within_cut": true, "total": 84670, "passed": true}
+{"ops": 429413, "of": 507150, "cut": 169409, "within_cut": true, "total": 84670, "passed": true}
+{"ops": 429414, "of": 507150, "cut": 169409, "within_cut": true, "total": 84670, "passed": true}
+{"ops": 429415, "of": 507150, "cut": 169409, "within_cut": false, "total": 84670, "passed": true}
+{"ops": 429416, "of": 507150, "cut": 169410, "within_cut": true, "total": 84670, "passed": true}
+{"ops": 429417, "of": 507150, "cut": 169410, "within_cut": false, "total": 84670, "passed": true}
+{"ops": 429418, "of": 507150, "cut": 169411, "within_cut": true, "total": 84670, "passed": true}
+{"ops": 429874, "of": 507150, "cut": 169591, "within_cut": false, "total": 84760, "passed": true}
+{"ops": 430607, "of": 507150, "cut": 169881, "within_cut": true, "total": 84905, "passed": true}
+{"ops": 433798, "of": 507150, "cut": 171141, "within_cut": false, "total": 85535, "passed": true}
+{"ops": 433847, "of": 507150, "cut": 171161, "within_cut": true, "total": 85545, "passed": true}
+{"ops": 434134, "of": 507150, "cut": 171274, "within_cut": true, "total": 85602, "passed": true}
+{"ops": 434951, "of": 507150, "cut": 171597, "within_cut": true, "total": 85763, "passed": true}
+{"ops": 436249, "of": 507150, "cut": 172110, "within_cut": true, "total": 86019, "passed": true}
+{"ops": 436276, "of": 507150, "cut": 172120, "within_cut": false, "total": 86025, "passed": true}
+{"ops": 436868, "of": 507150, "cut": 172354, "within_cut": true, "total": 86142, "passed": true}
+{"ops": 438090, "of": 507150, "cut": 172837, "within_cut": true, "total": 86383, "passed": true}
+{"ops": 438544, "of": 507150, "cut": 173016, "within_cut": false, "total": 86473, "passed": true}
+{"ops": 439084, "of": 507150, "cut": 173230, "within_cut": true, "total": 86579, "passed": true}
+{"ops": 440131, "of": 507150, "cut": 173643, "within_cut": false, "total": 86786, "passed": true}
+{"ops": 441805, "of": 507150, "cut": 174305, "within_cut": true, "total": 87117, "passed": true}
+{"ops": 442624, "of": 507150, "cut": 174628, "within_cut": true, "total": 87279, "passed": true}
+{"ops": 443417, "of": 507150, "cut": 174942, "within_cut": true, "total": 87435, "passed": true}
+{"ops": 443795, "of": 507150, "cut": 175091, "within_cut": true, "total": 87510, "passed": true}
+{"ops": 444746, "of": 507150, "cut": 175459, "within_cut": true, "total": 87694, "passed": true}
+{"ops": 444747, "of": 507150, "cut": 175459, "within_cut": true, "total": 87694, "passed": true}
+{"ops": 444748, "of": 507150, "cut": 175459, "within_cut": true, "total": 87694, "passed": true}
+{"ops": 444749, "of": 507150, "cut": 175459, "within_cut": false, "total": 87694, "passed": true}
+{"ops": 444750, "of": 507150, "cut": 175460, "within_cut": true, "total": 87694, "passed": true}
+{"ops": 444751, "of": 507150, "cut": 175460, "within_cut": false, "total": 87694, "passed": true}
+{"ops": 444752, "of": 507150, "cut": 175461, "within_cut": true, "total": 87694, "passed": true}
+{"ops": 446366, "of": 507150, "cut": 176099, "within_cut": true, "total": 88013, "passed": true}
+{"ops": 447127, "of": 507150, "cut": 176399, "within_cut": false, "total": 88163, "passed": true}
+{"ops": 447369, "of": 507150, "cut": 176495, "within_cut": true, "total": 88211, "passed": true}
+{"ops": 447632, "of": 507150, "cut": 176599, "within_cut": true, "total": 88263, "passed": true}
+{"ops": 448500, "of": 507150, "cut": 176942, "within_cut": true, "total": 88434, "passed": true}
+{"ops": 450334, "of": 507150, "cut": 177666, "within_cut": false, "total": 88797, "passed": true}
+{"ops": 450706, "of": 507150, "cut": 177813, "within_cut": false, "total": 88870, "passed": true}
+{"ops": 451589, "of": 507150, "cut": 178162, "within_cut": true, "total": 89045, "passed": true}
+{"ops": 451608, "of": 507150, "cut": 178170, "within_cut": true, "total": 89048, "passed": true}
+{"ops": 452237, "of": 507150, "cut": 178418, "within_cut": true, "total": 89173, "passed": true}
+{"ops": 453338, "of": 507150, "cut": 178853, "within_cut": true, "total": 89390, "passed": true}
+{"ops": 454963, "of": 507150, "cut": 179495, "within_cut": true, "total": 89711, "passed": true}
+{"ops": 455857, "of": 507150, "cut": 179848, "within_cut": true, "total": 89888, "passed": true}
+{"ops": 456676, "of": 507150, "cut": 180172, "within_cut": true, "total": 90049, "passed": true}
+{"ops": 458457, "of": 507150, "cut": 180875, "within_cut": false, "total": 90401, "passed": true}
+{"ops": 459042, "of": 507150, "cut": 181106, "within_cut": false, "total": 90517, "passed": true}
+{"ops": 459392, "of": 507150, "cut": 181245, "within_cut": true, "total": 90586, "passed": true}
+{"ops": 460080, "of": 507150, "cut": 181509, "within_cut": true, "total": 90718, "passed": true}
+{"ops": 460081, "of": 507150, "cut": 181509, "within_cut": true, "total": 90718, "passed": true}
+{"ops": 460082, "of": 507150, "cut": 181509, "within_cut": true, "total": 90718, "passed": true}
+{"ops": 460083, "of": 507150, "cut": 181509, "within_cut": false, "total": 90718, "passed": true}
+{"ops": 460084, "of": 507150, "cut": 181510, "within_cut": true, "total": 90718, "passed": true}
+{"ops": 460085, "of": 507150, "cut": 181510, "within_cut": false, "total": 90718, "passed": true}
+{"ops": 460086, "of": 507150, "cut": 181511, "within_cut": true, "total": 90718, "passed": true}
+{"ops": 460501, "of": 507150, "cut": 181675, "within_cut": true, "total": 90800, "passed": true}
+{"ops": 462057, "of": 507150, "cut": 182290, "within_cut": true, "total": 91107, "passed": true}
+{"ops": 462559, "of": 507150, "cut": 182488, "within_cut": true, "total": 91207, "passed": true}
+{"ops": 462777, "of": 507150, "cut": 182574, "within_cut": true, "total": 91250, "passed": true}
+{"ops": 462858, "of": 507150, "cut": 182606, "within_cut": true, "total": 91266, "passed": true}
+{"ops": 463329, "of": 507150, "cut": 182792, "within_cut": true, "total": 91359, "passed": true}
+{"ops": 463643, "of": 507150, "cut": 182916, "within_cut": false, "total": 91421, "passed": true}
+{"ops": 464867, "of": 507150, "cut": 183400, "within_cut": true, "total": 91662, "passed": true}
+{"ops": 465337, "of": 507150, "cut": 183586, "within_cut": true, "total": 91755, "passed": true}
+{"ops": 466642, "of": 507150, "cut": 184101, "within_cut": false, "total": 92013, "passed": true}
+{"ops": 467077, "of": 507150, "cut": 184273, "within_cut": true, "total": 92099, "passed": true}
+{"ops": 467593, "of": 507150, "cut": 184477, "within_cut": true, "total": 92201, "passed": true}
+{"ops": 468412, "of": 507150, "cut": 184800, "within_cut": false, "total": 92363, "passed": true}
+{"ops": 469768, "of": 507150, "cut": 185336, "within_cut": true, "total": 92631, "passed": true}
+{"ops": 470450, "of": 507150, "cut": 185606, "within_cut": true, "total": 92765, "passed": true}
+{"ops": 470486, "of": 507150, "cut": 185620, "within_cut": true, "total": 92772, "passed": true}
+{"ops": 470816, "of": 507150, "cut": 185750, "within_cut": true, "total": 92838, "passed": true}
+{"ops": 472018, "of": 507150, "cut": 186225, "within_cut": true, "total": 93075, "passed": true}
+{"ops": 472728, "of": 507150, "cut": 186505, "within_cut": false, "total": 93215, "passed": true}
+{"ops": 472924, "of": 507150, "cut": 186583, "within_cut": true, "total": 93254, "passed": true}
+{"ops": 473720, "of": 507150, "cut": 186897, "within_cut": false, "total": 93411, "passed": true}
+{"ops": 473751, "of": 507150, "cut": 186910, "within_cut": true, "total": 93417, "passed": true}
+{"ops": 474575, "of": 507150, "cut": 187235, "within_cut": false, "total": 93580, "passed": true}
+{"ops": 475037, "of": 507150, "cut": 187418, "within_cut": true, "total": 93671, "passed": true}
+{"ops": 475414, "of": 507150, "cut": 187559, "within_cut": true, "total": 93742, "passed": true}
+{"ops": 475415, "of": 507150, "cut": 187559, "within_cut": true, "total": 93742, "passed": true}
+{"ops": 475416, "of": 507150, "cut": 187559, "within_cut": true, "total": 93742, "passed": true}
+{"ops": 475417, "of": 507150, "cut": 187559, "within_cut": false, "total": 93742, "passed": true}
+{"ops": 475418, "of": 507150, "cut": 187560, "within_cut": true, "total": 93742, "passed": true}
+{"ops": 475419, "of": 507150, "cut": 187560, "within_cut": false, "total": 93742, "passed": true}
+{"ops": 475420, "of": 507150, "cut": 187561, "within_cut": true, "total": 93742, "passed": true}
+{"ops": 475747, "of": 507150, "cut": 187690, "within_cut": true, "total": 93807, "passed": true}
+{"ops": 475847, "of": 507150, "cut": 187730, "within_cut": true, "total": 93826, "passed": true}
+{"ops": 475933, "of": 507150, "cut": 187764, "within_cut": true, "total": 93843, "passed": true}
+{"ops": 476519, "of": 507150, "cut": 187995, "within_cut": false, "total": 93959, "passed": true}
+{"ops": 476997, "of": 507150, "cut": 188184, "within_cut": true, "total": 94054, "passed": true}
+{"ops": 477697, "of": 507150, "cut": 188460, "within_cut": false, "total": 94192, "passed": true}
+{"ops": 478667, "of": 507150, "cut": 188844, "within_cut": true, "total": 94383, "passed": true}
+{"ops": 479679, "of": 507150, "cut": 189244, "within_cut": true, "total": 94583, "passed": true}
+{"ops": 479687, "of": 507150, "cut": 189247, "within_cut": true, "total": 94585, "passed": true}
+{"ops": 479800, "of": 507150, "cut": 189291, "within_cut": false, "total": 94607, "passed": true}
+{"ops": 480699, "of": 507150, "cut": 189646, "within_cut": false, "total": 94785, "passed": true}
+{"ops": 481090, "of": 507150, "cut": 189801, "within_cut": true, "total": 94862, "passed": true}
+{"ops": 481788, "of": 507150, "cut": 190077, "within_cut": true, "total": 95000, "passed": true}
+{"ops": 482691, "of": 507150, "cut": 190434, "within_cut": true, "total": 95178, "passed": true}
+{"ops": 486940, "of": 507150, "cut": 192112, "within_cut": true, "total": 96018, "passed": true}
+{"ops": 487086, "of": 507150, "cut": 192170, "within_cut": true, "total": 96046, "passed": true}
+{"ops": 487362, "of": 507150, "cut": 192279, "within_cut": true, "total": 96101, "passed": true}
+{"ops": 487375, "of": 507150, "cut": 192284, "within_cut": true, "total": 96104, "passed": true}
+{"ops": 488206, "of": 507150, "cut": 192612, "within_cut": false, "total": 96268, "passed": true}
+{"ops": 488838, "of": 507150, "cut": 192862, "within_cut": true, "total": 96393, "passed": true}
+{"ops": 488890, "of": 507150, "cut": 192882, "within_cut": false, "total": 96403, "passed": true}
+{"ops": 489947, "of": 507150, "cut": 193300, "within_cut": true, "total": 96612, "passed": true}
+{"ops": 490455, "of": 507150, "cut": 193501, "within_cut": true, "total": 96712, "passed": true}
+{"ops": 490748, "of": 507150, "cut": 193609, "within_cut": true, "total": 96766, "passed": true}
+{"ops": 490749, "of": 507150, "cut": 193609, "within_cut": true, "total": 96766, "passed": true}
+{"ops": 490750, "of": 507150, "cut": 193609, "within_cut": true, "total": 96766, "passed": true}
+{"ops": 490751, "of": 507150, "cut": 193609, "within_cut": false, "total": 96766, "passed": true}
+{"ops": 490752, "of": 507150, "cut": 193610, "within_cut": true, "total": 96766, "passed": true}
+{"ops": 490753, "of": 507150, "cut": 193610, "within_cut": false, "total": 96766, "passed": true}
+{"ops": 490754, "of": 507150, "cut": 193611, "within_cut": true, "total": 96766, "passed": true}
+{"ops": 490998, "of": 507150, "cut": 193707, "within_cut": false, "total": 96814, "passed": true}
+{"ops": 491337, "of": 507150, "cut": 193841, "within_cut": false, "total": 96881, "passed": true}
+{"ops": 491556, "of": 507150, "cut": 193928, "within_cut": true, "total": 96925, "passed": true}
+{"ops": 493270, "of": 507150, "cut": 194605, "within_cut": true, "total": 97263, "passed": true}
+{"ops": 495662, "of": 507150, "cut": 195550, "within_cut": true, "total": 97736, "passed": true}
+{"ops": 496403, "of": 507150, "cut": 195843, "within_cut": true, "total": 97882, "passed": true}
+{"ops": 497373, "of": 507150, "cut": 196226, "within_cut": true, "total": 98074, "passed": true}
+{"ops": 498060, "of": 507150, "cut": 196497, "within_cut": false, "total": 98209, "passed": true}
+{"ops": 498159, "of": 507150, "cut": 196536, "within_cut": false, "total": 98229, "passed": true}
+{"ops": 498426, "of": 507150, "cut": 196642, "within_cut": true, "total": 98282, "passed": true}
+{"ops": 499364, "of": 507150, "cut": 197012, "within_cut": false, "total": 98467, "passed": true}
+{"ops": 500817, "of": 507150, "cut": 197586, "within_cut": false, "total": 98754, "passed": true}
+{"ops": 500970, "of": 507150, "cut": 197647, "within_cut": true, "total": 98784, "passed": true}
+{"ops": 502870, "of": 507150, "cut": 198398, "within_cut": true, "total": 99159, "passed": true}
+{"ops": 502918, "of": 507150, "cut": 198416, "within_cut": false, "total": 99169, "passed": true}
+{"ops": 504453, "of": 507150, "cut": 199023, "within_cut": true, "total": 99472, "passed": true}
+{"ops": 506077, "of": 507150, "cut": 199659, "within_cut": true, "total": 99790, "passed": true}
+{"ops": 506082, "of": 507150, "cut": 199659, "within_cut": true, "total": 99790, "passed": true}
+{"ops": 506083, "of": 507150, "cut": 199659, "within_cut": true, "total": 99790, "passed": true}
+{"ops": 506084, "of": 507150, "cut": 199659, "within_cut": true, "total": 99790, "passed": true}
+{"ops": 506085, "of": 507150, "cut": 199659, "within_cut": false, "total": 99790, "passed": true}
+{"ops": 506086, "of": 507150, "cut": 199660, "within_cut": true, "total": 99790, "passed": true}
+{"ops": 506087, "of": 507150, "cut": 199660, "within_cut": false, "total": 99790, "passed": true}
+{"ops": 506088, "of": 507150, "cut": 199661, "within_cut": true, "total": 99790, "passed": true}
+{"ops": 506896, "of": 507150, "cut": 199980, "within_cut": true, "total": 99950, "passed": true}
+{"ops": 507150, "of": 507150, "cut": 200080, "within_cut": false, "total": 100000, "passed": true}
+{"run": "prefixes", "events": 100000, "ops": 507150, "journal_bytes": 90258606, "renamed_to": {"pure.tree": 34, "image-entries": 2, "image-0heard": 1, "image-0sent": 1}, "samples": 867, "near_renames": 266, "within_cuts": 568, "failed": 0, "failures": [], "seconds": 22.8}
diff --git a/research/experiments/046-commit-replica/2026-10-19-prefixes.jsonl b/research/experiments/046-commit-replica/2026-10-19-prefixes.jsonl
new file mode 100644
index 0000000..d552f5b
--- /dev/null
+++ b/research/experiments/046-commit-replica/2026-10-19-prefixes.jsonl
@@ -0,0 +1,2 @@
+{"run": "prefixes", "events": 20000, "ops": 101464, "journal_bytes": 18144281, "samples": 301, "within_cuts": 195, "failed": 0, "failures": [], "seconds": 3.1}
+{"run": "prefixes", "events": 100000, "ops": 507150, "journal_bytes": 90258606, "renamed_to": {"pure.tree": 34, "image-entries": 2, "image-0heard": 1, "image-0sent": 1}, "samples": 867, "near_renames": 266, "within_cuts": 568, "failed": 0, "failures": [], "seconds": 22.8}
diff --git a/research/experiments/046-commit-replica/2026-10-19-price.jsonl b/research/experiments/046-commit-replica/2026-10-19-price.jsonl
new file mode 100644
index 0000000..385b3cb
--- /dev/null
+++ b/research/experiments/046-commit-replica/2026-10-19-price.jsonl
@@ -0,0 +1,2 @@
+{"run": "price", "events": 100000, "without": {"seconds": 20.453, "us_per_event": 204.5, "done": 100000}, "with_shim": {"seconds": 40.164, "us_per_event": 401.6, "done": 100000}, "shim": {"cuts": 200081, "shipped_bytes": 90258606, "waited_ms": 15494.9, "create": [40, 1149], "write": [306989, 88255228], "truncate": [0, 0], "allocate": [1, 24], "rename": [38, 1237], "unlink": [0, 0], "mkdir": [1, 7], "sync": [200081, 2000961], "renamed_to": {"pure.tree": 34, "image-entries": 2, "image-0heard": 1, "image-0sent": 1}}, "shipper": {"cuts": 200081, "records": 200114, "record_bytes": 92059632, "waited_ms": 12284.0, "packets": 228164, "resent": 0}}
+{"run": "price", "events": 100000, "without": {"seconds": 20.414, "us_per_event": 204.1, "done": 100000}, "with_shim": {"seconds": 39.992, "us_per_event": 399.9, "done": 100000}, "shim": {"cuts": 200081, "shipped_bytes": 90258606, "waited_ms": 15418.9, "create": [40, 1149], "write": [306989, 88255228], "truncate": [0, 0], "allocate": [1, 24], "rename": [38, 1237], "unlink": [0, 0], "mkdir": [1, 7], "sync": [200081, 2000961], "renamed_to": {"pure.tree": 34, "image-entries": 2, "image-0heard": 1, "image-0sent": 1}}, "shipper": {"cuts": 200081, "records": 200114, "record_bytes": 92059632, "waited_ms": 12271.7, "packets": 228164, "resent": 0}}
diff --git a/research/experiments/046-commit-replica/2026-10-19-takeover.jsonl b/research/experiments/046-commit-replica/2026-10-19-takeover.jsonl
new file mode 100644
index 0000000..d800b69
--- /dev/null
+++ b/research/experiments/046-commit-replica/2026-10-19-takeover.jsonl
@@ -0,0 +1,70 @@
+{"run": "takeover", "k": 0, "whole_node": false, "sent": 5087, "owner_said_done": 2563, "follower_took": {"opened": true, "fault": "none", "total": 2588, "summed": 1172225}, "follower": {"heard": 5190, "cuts": 5190, "ops": 13164, "op_bytes": 2367334, "received": 5958, "deliveries": 5190, "stored": 5190}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 2588, "summed": 1172225}}
+{"run": "takeover", "k": 1, "whole_node": true, "sent": 1545, "owner_said_done": 799, "follower_took": {"opened": true, "fault": "none", "total": 868, "summed": 376495}, "follower": {"heard": 1749, "cuts": 1749, "ops": 4443, "op_bytes": 902163, "received": 2088, "deliveries": 1749, "stored": 1749}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 868, "summed": 376495}}
+{"run": "takeover", "k": 2, "whole_node": false, "sent": 5372, "owner_said_done": 2843, "follower_took": {"opened": true, "fault": "none", "total": 2860, "summed": 1369085}, "follower": {"heard": 5733, "cuts": 5733, "ops": 14543, "op_bytes": 2702399, "received": 6644, "deliveries": 5733, "stored": 5733}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 2860, "summed": 1369085}}
+{"run": "takeover", "k": 3, "whole_node": true, "sent": 10931, "owner_said_done": 5504, "follower_took": {"opened": true, "fault": "none", "total": 5545, "summed": 2647126.25}, "follower": {"heard": 11106, "cuts": 11105, "ops": 28160, "op_bytes": 5183815, "received": 12825, "deliveries": 11106, "stored": 11106}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 5545, "summed": 2647126.25}}
+{"run": "takeover", "k": 4, "whole_node": false, "sent": 18671, "owner_said_done": 9985, "follower_took": {"opened": true, "fault": "none", "total": 10003, "summed": 4997503.75}, "follower": {"heard": 20028, "cuts": 20025, "ops": 50779, "op_bytes": 9683199, "received": 23363, "deliveries": 20028, "stored": 20028}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 10003, "summed": 4997503.75}}
+{"run": "takeover", "k": 5, "whole_node": true, "sent": 10558, "owner_said_done": 5294, "follower_took": {"opened": true, "fault": "none", "total": 5306, "summed": 2545491.5}, "follower": {"heard": 10628, "cuts": 10627, "ops": 26950, "op_bytes": 5062274, "received": 12347, "deliveries": 10628, "stored": 10628}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 5306, "summed": 2545491.5}}
+{"run": "takeover", "k": 6, "whole_node": false, "sent": 3605, "owner_said_done": 1932, "follower_took": {"opened": true, "fault": "none", "total": 1998, "summed": 997502.5}, "follower": {"heard": 4010, "cuts": 4010, "ops": 10173, "op_bytes": 1870455, "received": 4635, "deliveries": 4010, "stored": 4010}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 1998, "summed": 997502.5}}
+{"run": "takeover", "k": 7, "whole_node": true, "sent": 18329, "owner_said_done": 9425, "follower_took": {"opened": true, "fault": "none", "total": 9466, "summed": 4606211.5}, "follower": {"heard": 18954, "cuts": 18951, "ops": 48060, "op_bytes": 9410068, "received": 22289, "deliveries": 18954, "stored": 18954}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 9466, "summed": 4606211.5}}
+{"run": "takeover", "k": 8, "whole_node": false, "sent": 12230, "owner_said_done": 6274, "follower_took": {"opened": true, "fault": "none", "total": 6327, "summed": 3051882.75}, "follower": {"heard": 12673, "cuts": 12671, "ops": 32144, "op_bytes": 6697698, "received": 15200, "deliveries": 12673, "stored": 12673}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 6327, "summed": 3051882.75}}
+{"run": "takeover", "k": 9, "whole_node": true, "sent": 2120, "owner_said_done": 1155, "follower_took": {"opened": true, "fault": "none", "total": 1178, "summed": 515547.5}, "follower": {"heard": 2369, "cuts": 2369, "ops": 6016, "op_bytes": 1256586, "received": 2851, "deliveries": 2369, "stored": 2369}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 1178, "summed": 515547.5}}
+{"run": "takeover", "k": 10, "whole_node": false, "sent": 1420, "owner_said_done": 727, "follower_took": {"opened": true, "fault": "none", "total": 762, "summed": 290131.5}, "follower": {"heard": 1538, "cuts": 1538, "ops": 3908, "op_bytes": 848297, "received": 1877, "deliveries": 1538, "stored": 1538}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 762, "summed": 290131.5}}
+{"run": "takeover", "k": 11, "whole_node": true, "sent": 2759, "owner_said_done": 1579, "follower_took": {"opened": true, "fault": "none", "total": 1595, "summed": 676613.75}, "follower": {"heard": 3204, "cuts": 3204, "ops": 8129, "op_bytes": 1468713, "received": 3686, "deliveries": 3204, "stored": 3204}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 1595, "summed": 676613.75}}
+{"run": "takeover", "k": 12, "whole_node": false, "sent": 18767, "owner_said_done": 9985, "follower_took": {"opened": true, "fault": "none", "total": 10003, "summed": 4997503.75}, "follower": {"heard": 20029, "cuts": 20026, "ops": 50781, "op_bytes": 9683291, "received": 23364, "deliveries": 20029, "stored": 20029}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 10003, "summed": 4997503.75}}
+{"run": "takeover", "k": 13, "whole_node": true, "sent": 9496, "owner_said_done": 4944, "follower_took": {"opened": true, "fault": "none", "total": 4977, "summed": 2476020.25}, "follower": {"heard": 9970, "cuts": 9969, "ops": 25285, "op_bytes": 4895063, "received": 11689, "deliveries": 9970, "stored": 9970}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 4977, "summed": 2476020.25}}
+{"run": "takeover", "k": 14, "whole_node": false, "sent": 2116, "owner_said_done": 1226, "follower_took": {"opened": true, "fault": "none", "total": 1273, "summed": 536946.25}, "follower": {"heard": 2559, "cuts": 2559, "ops": 6497, "op_bytes": 1304903, "received": 3041, "deliveries": 2559, "stored": 2559}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 1273, "summed": 536946.25}}
+{"run": "takeover", "k": 15, "whole_node": true, "sent": 3902, "owner_said_done": 2143, "follower_took": {"opened": true, "fault": "none", "total": 2198, "summed": 1019052.5}, "follower": {"heard": 4410, "cuts": 4410, "ops": 11186, "op_bytes": 1972231, "received": 5035, "deliveries": 4410, "stored": 4410}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 2198, "summed": 1019052.5}}
+{"run": "takeover", "k": 16, "whole_node": false, "sent": 4442, "owner_said_done": 2283, "follower_took": {"opened": true, "fault": "none", "total": 2299, "summed": 1044125.75}, "follower": {"heard": 4611, "cuts": 4611, "ops": 11699, "op_bytes": 2220295, "received": 5379, "deliveries": 4611, "stored": 4611}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 2299, "summed": 1044125.75}}
+{"run": "takeover", "k": 17, "whole_node": true, "sent": 16943, "owner_said_done": 8584, "follower_took": {"opened": true, "fault": "none", "total": 8613, "summed": 4185731.25}, "follower": {"heard": 17245, "cuts": 17243, "ops": 43717, "op_bytes": 7860148, "received": 19772, "deliveries": 17245, "stored": 17245}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 8613, "summed": 4185731.25}}
+{"run": "takeover", "k": 18, "whole_node": false, "sent": 17952, "owner_said_done": 9005, "follower_took": {"opened": true, "fault": "none", "total": 9034, "summed": 4498319.5}, "follower": {"heard": 18088, "cuts": 18086, "ops": 45850, "op_bytes": 8074271, "received": 20615, "deliveries": 18088, "stored": 18088}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 9034, "summed": 4498319.5}}
+{"run": "takeover", "k": 19, "whole_node": true, "sent": 15451, "owner_said_done": 7884, "follower_took": {"opened": true, "fault": "none", "total": 7927, "summed": 3927682.75}, "follower": {"heard": 15874, "cuts": 15872, "ops": 40246, "op_bytes": 7511390, "received": 18401, "deliveries": 15874, "stored": 15874}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 7927, "summed": 3927682.75}}
+{"run": "takeover", "k": 0, "whole_node": true, "record": "512", "sent": 16303, "owner_said_done": 8304, "follower_took": {"opened": true, "fault": "none", "total": 8338, "summed": 4055037.5}, "follower": {"heard": 17276, "cuts": 16694, "ops": 42327, "op_bytes": 7720431, "received": 19224, "deliveries": 16726, "stored": 17276}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 8338, "summed": 4055037.5}}
+{"run": "takeover", "k": 1, "whole_node": true, "record": "512", "sent": 4981, "owner_said_done": 2563, "follower_took": {"opened": true, "fault": "none", "total": 2605, "summed": 1182361.25}, "follower": {"heard": 5405, "cuts": 5223, "ops": 13248, "op_bytes": 2375877, "received": 5992, "deliveries": 5231, "stored": 5405}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 2605, "summed": 1182361.25}}
+{"run": "takeover", "k": 2, "whole_node": true, "record": "512", "sent": 896, "owner_said_done": 583, "follower_took": {"opened": true, "fault": "none", "total": 587, "summed": 172137.75}, "follower": {"heard": 1232, "cuts": 1188, "ops": 3022, "op_bytes": 759300, "received": 1528, "deliveries": 1193, "stored": 1232}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 587, "summed": 172137.75}}
+{"run": "takeover", "k": 3, "whole_node": true, "record": "512", "sent": 7052, "owner_said_done": 3753, "follower_took": {"opened": true, "fault": "none", "total": 3781, "summed": 1804035.25}, "follower": {"heard": 7856, "cuts": 7578, "ops": 19232, "op_bytes": 4286951, "received": 9299, "deliveries": 7601, "stored": 7856}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 3781, "summed": 1804035.25}}
+{"run": "takeover", "k": 4, "whole_node": true, "record": "512", "sent": 13334, "owner_said_done": 6694, "follower_took": {"opened": true, "fault": "none", "total": 6732, "summed": 3266229}, "follower": {"heard": 13962, "cuts": 13481, "ops": 34194, "op_bytes": 6903593, "received": 16011, "deliveries": 13516, "stored": 13962}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 6732, "summed": 3266229}}
+{"run": "takeover", "k": 5, "whole_node": true, "record": "512", "sent": 7832, "owner_said_done": 4033, "follower_took": {"opened": true, "fault": "none", "total": 4072, "summed": 2001574}, "follower": {"heard": 8455, "cuts": 8159, "ops": 20703, "op_bytes": 4434804, "received": 9880, "deliveries": 8182, "stored": 8455}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 4072, "summed": 2001574}}
+{"run": "takeover", "k": 6, "whole_node": true, "record": "512", "sent": 8014, "owner_said_done": 4103, "follower_took": {"opened": true, "fault": "none", "total": 4110, "summed": 2005022.5}, "follower": {"heard": 8534, "cuts": 8235, "ops": 20896, "op_bytes": 4454222, "received": 9956, "deliveries": 8257, "stored": 8534}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 4110, "summed": 2005022.5}}
+{"run": "takeover", "k": 7, "whole_node": true, "record": "512", "sent": 9998, "owner_said_done": 5014, "follower_took": {"opened": true, "fault": "none", "total": 5066, "summed": 2500911.5}, "follower": {"heard": 10506, "cuts": 10148, "ops": 25737, "op_bytes": 4940326, "received": 11869, "deliveries": 10170, "stored": 10506}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 5066, "summed": 2500911.5}}
+{"run": "takeover", "k": 8, "whole_node": true, "record": "512", "sent": 8996, "owner_said_done": 4593, "follower_took": {"opened": true, "fault": "none", "total": 4647, "summed": 2208142.75}, "follower": {"heard": 9641, "cuts": 9309, "ops": 23614, "op_bytes": 4727201, "received": 11030, "deliveries": 9331, "stored": 9641}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 4647, "summed": 2208142.75}}
+{"run": "takeover", "k": 9, "whole_node": true, "record": "512", "sent": 679, "owner_said_done": 439, "follower_took": {"opened": true, "fault": "none", "total": 467, "summed": 108927.75}, "follower": {"heard": 981, "cuts": 947, "ops": 2409, "op_bytes": 501523, "received": 1144, "deliveries": 951, "stored": 981}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 467, "summed": 108927.75}}
+{"run": "takeover", "k": 10, "whole_node": true, "record": "512", "sent": 10605, "owner_said_done": 5434, "follower_took": {"opened": true, "fault": "none", "total": 5480, "summed": 2613830}, "follower": {"heard": 11360, "cuts": 10976, "ops": 27833, "op_bytes": 5150864, "received": 12697, "deliveries": 10999, "stored": 11360}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 5480, "summed": 2613830}}
+{"run": "takeover", "k": 11, "whole_node": true, "record": "512", "sent": 19414, "owner_said_done": 10605, "follower_took": {"opened": true, "fault": "none", "total": 10647, "summed": 5206642.75}, "follower": {"heard": 22058, "cuts": 21313, "ops": 54039, "op_bytes": 10010635, "received": 24652, "deliveries": 21363, "stored": 22058}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 10647, "summed": 5206642.75}}
+{"run": "takeover", "k": 12, "whole_node": true, "record": "512", "sent": 13078, "owner_said_done": 6694, "follower_took": {"opened": true, "fault": "none", "total": 6749, "summed": 3278813.25}, "follower": {"heard": 13998, "cuts": 13516, "ops": 34282, "op_bytes": 6912320, "received": 16046, "deliveries": 13550, "stored": 13998}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 6749, "summed": 3278813.25}}
+{"run": "takeover", "k": 13, "whole_node": true, "record": "512", "sent": 14001, "owner_said_done": 7114, "follower_took": {"opened": true, "fault": "none", "total": 7178, "summed": 3514047.5}, "follower": {"heard": 14882, "cuts": 14373, "ops": 36452, "op_bytes": 7130403, "received": 16903, "deliveries": 14408, "stored": 14882}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 7178, "summed": 3514047.5}}
+{"run": "takeover", "k": 14, "whole_node": true, "record": "512", "sent": 12190, "owner_said_done": 6204, "follower_took": {"opened": true, "fault": "none", "total": 6224, "summed": 3023532}, "follower": {"heard": 12915, "cuts": 12465, "ops": 31623, "op_bytes": 6645389, "received": 14995, "deliveries": 12498, "stored": 12915}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 6224, "summed": 3023532}}
+{"run": "takeover", "k": 15, "whole_node": true, "record": "512", "sent": 6462, "owner_said_done": 3403, "follower_took": {"opened": true, "fault": "none", "total": 3438, "summed": 1595062.5}, "follower": {"heard": 7148, "cuts": 6891, "ops": 17494, "op_bytes": 4112510, "received": 8612, "deliveries": 6913, "stored": 7148}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 3438, "summed": 1595062.5}}
+{"run": "takeover", "k": 16, "whole_node": true, "record": "512", "sent": 19376, "owner_said_done": 10467, "follower_took": {"opened": true, "fault": "none", "total": 10536, "summed": 5141014}, "follower": {"heard": 21829, "cuts": 21091, "ops": 53477, "op_bytes": 9954182, "received": 24430, "deliveries": 21142, "stored": 21829}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 10536, "summed": 5141014}}
+{"run": "takeover", "k": 17, "whole_node": true, "record": "512", "sent": 8795, "owner_said_done": 4453, "follower_took": {"opened": true, "fault": "none", "total": 4519, "summed": 2133550.75}, "follower": {"heard": 9377, "cuts": 9053, "ops": 22966, "op_bytes": 4662113, "received": 10774, "deliveries": 9074, "stored": 9377}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 4519, "summed": 2133550.75}}
+{"run": "takeover", "k": 18, "whole_node": true, "record": "512", "sent": 2977, "owner_said_done": 1649, "follower_took": {"opened": true, "fault": "none", "total": 1650, "summed": 710837.5}, "follower": {"heard": 3428, "cuts": 3313, "ops": 8406, "op_bytes": 1496674, "received": 3796, "deliveries": 3319, "stored": 3428}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 1650, "summed": 710837.5}}
+{"run": "takeover", "k": 19, "whole_node": true, "record": "512", "sent": 9394, "owner_said_done": 4733, "follower_took": {"opened": true, "fault": "none", "total": 4772, "summed": 2296799}, "follower": {"heard": 9899, "cuts": 9559, "ops": 24247, "op_bytes": 4790792, "received": 11280, "deliveries": 9582, "stored": 9899}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 4772, "summed": 2296799}}
+{"run": "takeover", "k": 0, "whole_node": true, "record": "64", "sent": 17943, "owner_said_done": 9005, "follower_took": {"opened": true, "fault": "none", "total": 9047, "summed": 4498842.75}, "follower": {"within_cut": false, "heard": 45905, "cuts": 18111, "ops": 45914, "op_bytes": 8080818, "received": 20641, "deliveries": 18146, "stored": 45905}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 9047, "summed": 4498842.75}}
+{"run": "takeover", "k": 1, "whole_node": true, "record": "64", "sent": 3302, "owner_said_done": 1861, "follower_took": {"opened": true, "fault": "none", "total": 1885, "summed": 891141.25}, "follower": {"within_cut": false, "heard": 9592, "cuts": 3783, "ops": 9599, "op_bytes": 1812912, "received": 4409, "deliveries": 3790, "stored": 9592}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 1885, "summed": 891141.25}}
+{"run": "takeover", "k": 2, "whole_node": true, "record": "64", "sent": 15469, "owner_said_done": 7744, "follower_took": {"opened": true, "fault": "none", "total": 7779, "summed": 3801475.75}, "follower": {"within_cut": false, "heard": 39488, "cuts": 15576, "ops": 39497, "op_bytes": 7436170, "received": 18106, "deliveries": 15603, "stored": 39488}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 7779, "summed": 3801475.75}}
+{"run": "takeover", "k": 3, "whole_node": true, "record": "64", "sent": 9678, "owner_said_done": 5014, "follower_took": {"opened": true, "fault": "none", "total": 5057, "summed": 2500360.25}, "follower": {"within_cut": false, "heard": 25684, "cuts": 10130, "ops": 25692, "op_bytes": 4935835, "received": 11851, "deliveries": 10151, "stored": 25684}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 5057, "summed": 2500360.25}}
+{"run": "takeover", "k": 4, "whole_node": true, "record": "64", "sent": 16439, "owner_said_done": 8234, "follower_took": {"opened": true, "fault": "none", "total": 8273, "summed": 4035196.25}, "follower": {"within_cut": false, "heard": 41987, "cuts": 16563, "ops": 41996, "op_bytes": 7687296, "received": 19093, "deliveries": 16596, "stored": 41987}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 8273, "summed": 4035196.25}}
+{"run": "takeover", "k": 5, "whole_node": true, "record": "64", "sent": 14529, "owner_said_done": 7464, "follower_took": {"opened": true, "fault": "none", "total": 7476, "summed": 3611419}, "follower": {"within_cut": false, "heard": 37952, "cuts": 14969, "ops": 37961, "op_bytes": 7281993, "received": 17499, "deliveries": 15006, "stored": 37952}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 7476, "summed": 3611419}}
+{"run": "takeover", "k": 6, "whole_node": true, "record": "64", "sent": 2660, "owner_said_done": 1508, "follower_took": {"opened": true, "fault": "none", "total": 1551, "summed": 651412.75}, "follower": {"within_cut": false, "heard": 7900, "cuts": 3116, "ops": 7907, "op_bytes": 1446453, "received": 3599, "deliveries": 3122, "stored": 7900}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 1551, "summed": 651412.75}}
+{"run": "takeover", "k": 7, "whole_node": true, "record": "64", "sent": 4570, "owner_said_done": 2493, "follower_took": {"opened": true, "fault": "none", "total": 2535, "summed": 1142478.75}, "follower": {"within_cut": false, "heard": 12889, "cuts": 5084, "ops": 12896, "op_bytes": 2340431, "received": 5853, "deliveries": 5092, "stored": 12889}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 2535, "summed": 1142478.75}}
+{"run": "takeover", "k": 8, "whole_node": true, "record": "64", "sent": 8821, "owner_said_done": 4523, "follower_took": {"opened": true, "fault": "none", "total": 4547, "summed": 2148467.75}, "follower": {"within_cut": false, "heard": 23100, "cuts": 9109, "ops": 23108, "op_bytes": 4676389, "received": 10830, "deliveries": 9130, "stored": 23100}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 4547, "summed": 2148467.75}}
+{"run": "takeover", "k": 9, "whole_node": true, "record": "64", "sent": 9070, "owner_said_done": 4663, "follower_took": {"opened": true, "fault": "none", "total": 4686, "summed": 2234126.5}, "follower": {"within_cut": false, "heard": 23806, "cuts": 9388, "ops": 23814, "op_bytes": 4747210, "received": 11109, "deliveries": 9408, "stored": 23806}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 4686, "summed": 2234126.5}}
+{"run": "takeover", "k": 10, "whole_node": true, "record": "64", "sent": 2843, "owner_said_done": 1438, "follower_took": {"opened": true, "fault": "none", "total": 1502, "summed": 625626.5}, "follower": {"within_cut": false, "heard": 7651, "cuts": 3018, "ops": 7658, "op_bytes": 1421394, "received": 3501, "deliveries": 3024, "stored": 7651}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 1502, "summed": 625626.5}}
+{"run": "takeover", "k": 11, "whole_node": true, "record": "64", "sent": 14007, "owner_said_done": 7114, "follower_took": {"opened": true, "fault": "none", "total": 7149, "summed": 3509313.25}, "follower": {"within_cut": false, "heard": 36296, "cuts": 14315, "ops": 36305, "op_bytes": 7115628, "received": 16845, "deliveries": 14350, "stored": 36296}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 7149, "summed": 3509313.25}}
+{"run": "takeover", "k": 12, "whole_node": true, "record": "64", "sent": 9021, "owner_said_done": 4593, "follower_took": {"opened": true, "fault": "none", "total": 4619, "summed": 2190425.75}, "follower": {"within_cut": false, "heard": 23464, "cuts": 9253, "ops": 23472, "op_bytes": 4712925, "received": 10973, "deliveries": 9275, "stored": 23464}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 4619, "summed": 2190425.75}}
+{"run": "takeover", "k": 13, "whole_node": true, "record": "64", "sent": 4093, "owner_said_done": 2143, "follower_took": {"opened": true, "fault": "none", "total": 2176, "summed": 1014944}, "follower": {"within_cut": false, "heard": 11066, "cuts": 4365, "ops": 11073, "op_bytes": 1961009, "received": 4991, "deliveries": 4372, "stored": 11066}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 2176, "summed": 1014944}}
+{"run": "takeover", "k": 14, "whole_node": true, "record": "64", "sent": 6506, "owner_said_done": 3403, "follower_took": {"opened": true, "fault": "none", "total": 3428, "summed": 1590735}, "follower": {"within_cut": false, "heard": 17435, "cuts": 6871, "ops": 17443, "op_bytes": 4107368, "received": 8592, "deliveries": 6888, "stored": 17435}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 3428, "summed": 1590735}}
+{"run": "takeover", "k": 15, "whole_node": true, "record": "64", "sent": 5802, "owner_said_done": 3053, "follower_took": {"opened": true, "fault": "none", "total": 3066, "summed": 1501411.5}, "follower": {"within_cut": false, "heard": 15602, "cuts": 6147, "ops": 15610, "op_bytes": 3923234, "received": 7867, "deliveries": 6169, "stored": 15602}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 3066, "summed": 1501411.5}}
+{"run": "takeover", "k": 16, "whole_node": true, "record": "64", "sent": 2510, "owner_said_done": 1296, "follower_took": {"opened": true, "fault": "none", "total": 1350, "summed": 560912.5}, "follower": {"within_cut": false, "heard": 6882, "cuts": 2714, "ops": 6889, "op_bytes": 1344178, "received": 3197, "deliveries": 2720, "stored": 6882}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 1350, "summed": 560912.5}}
+{"run": "takeover", "k": 17, "whole_node": true, "record": "64", "sent": 18351, "owner_said_done": 9425, "follower_took": {"opened": true, "fault": "none", "total": 9485, "summed": 4615241.25}, "follower": {"within_cut": false, "heard": 48148, "cuts": 18990, "ops": 48158, "op_bytes": 9419793, "received": 22329, "deliveries": 19026, "stored": 48148}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 9485, "summed": 4615241.25}}
+{"run": "takeover", "k": 18, "whole_node": true, "record": "64", "sent": 6024, "owner_said_done": 3193, "follower_took": {"opened": true, "fault": "none", "total": 3248, "summed": 1529940}, "follower": {"within_cut": false, "heard": 16524, "cuts": 6511, "ops": 16532, "op_bytes": 4015876, "received": 8232, "deliveries": 6536, "stored": 16524}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 3248, "summed": 1529940}}
+{"run": "takeover", "k": 19, "whole_node": true, "record": "64", "sent": 12713, "owner_said_done": 6484, "follower_took": {"opened": true, "fault": "none", "total": 6528, "summed": 3137760}, "follower": {"within_cut": false, "heard": 33155, "cuts": 13074, "ops": 33164, "op_bytes": 6800065, "received": 15604, "deliveries": 13109, "stored": 33155}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 6528, "summed": 3137760}}
+{"run": "takeover", "k": 20, "whole_node": true, "record": "64", "sent": 12657, "owner_said_done": 6344, "follower_took": {"opened": true, "fault": "none", "total": 6367, "summed": 3065752.75}, "follower": {"within_cut": false, "heard": 32338, "cuts": 12751, "ops": 32347, "op_bytes": 6718114, "received": 15281, "deliveries": 12784, "stored": 32338}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 6367, "summed": 3065752.75}}
+{"run": "takeover", "k": 21, "whole_node": true, "record": "64", "sent": 1753, "owner_said_done": 1014, "follower_took": {"opened": true, "fault": "none", "total": 1056, "summed": 501304}, "follower": {"within_cut": false, "heard": 5388, "cuts": 2125, "ops": 5395, "op_bytes": 997799, "received": 2465, "deliveries": 2130, "stored": 5388}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 1056, "summed": 501304}}
+{"run": "takeover", "k": 22, "whole_node": true, "record": "64", "sent": 6403, "owner_said_done": 3403, "follower_took": {"opened": true, "fault": "none", "total": 3406, "summed": 1581566.5}, "follower": {"within_cut": false, "heard": 17324, "cuts": 6827, "ops": 17332, "op_bytes": 4096238, "received": 8548, "deliveries": 6852, "stored": 17324}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 3406, "summed": 1581566.5}}
+{"run": "takeover", "k": 23, "whole_node": true, "record": "64", "sent": 15396, "owner_said_done": 7814, "follower_took": {"opened": true, "fault": "none", "total": 7839, "summed": 3850000.75}, "follower": {"within_cut": false, "heard": 39792, "cuts": 15696, "ops": 39801, "op_bytes": 7466718, "received": 18226, "deliveries": 15726, "stored": 39792}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 7839, "summed": 3850000.75}}
+{"run": "takeover", "k": 24, "whole_node": true, "record": "64", "sent": 180, "owner_said_done": 149, "follower_took": {"opened": true, "fault": "none", "total": 180, "summed": 16155}, "follower": {"within_cut": false, "heard": 949, "cuts": 373, "ops": 956, "op_bytes": 355574, "received": 570, "deliveries": 377, "stored": 949}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 180, "summed": 16155}}
+{"run": "takeover", "k": 25, "whole_node": true, "record": "64", "sent": 6721, "owner_said_done": 3543, "follower_took": {"opened": true, "fault": "none", "total": 3558, "summed": 1654792.5}, "follower": {"within_cut": false, "heard": 18093, "cuts": 7131, "ops": 18101, "op_bytes": 4173454, "received": 8852, "deliveries": 7153, "stored": 18093}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 3558, "summed": 1654792.5}}
+{"run": "takeover", "k": 26, "whole_node": true, "record": "64", "sent": 1254, "owner_said_done": 799, "follower_took": {"opened": true, "fault": "none", "total": 826, "summed": 340931.5}, "follower": {"within_cut": false, "heard": 4225, "cuts": 1666, "ops": 4232, "op_bytes": 880841, "received": 2006, "deliveries": 1671, "stored": 4225}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 826, "summed": 340931.5}}
+{"run": "takeover", "k": 27, "whole_node": true, "record": "64", "sent": 8584, "owner_said_done": 4453, "follower_took": {"opened": true, "fault": "none", "total": 4456, "summed": 2102854}, "follower": {"within_cut": false, "heard": 22641, "cuts": 8928, "ops": 22649, "op_bytes": 4630160, "received": 10648, "deliveries": 8947, "stored": 22641}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 4456, "summed": 2102854}}
+{"run": "takeover", "k": 28, "whole_node": true, "record": "64", "sent": 14294, "owner_said_done": 7254, "follower_took": {"opened": true, "fault": "none", "total": 7313, "summed": 3547156.25}, "follower": {"within_cut": false, "heard": 37127, "cuts": 14643, "ops": 37136, "op_bytes": 7199136, "received": 17173, "deliveries": 14675, "stored": 37127}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 7313, "summed": 3547156.25}}
+{"run": "takeover", "k": 29, "whole_node": true, "record": "64", "sent": 3055, "owner_said_done": 1720, "follower_took": {"opened": true, "fault": "none", "total": 1736, "summed": 770414}, "follower": {"within_cut": false, "heard": 8838, "cuts": 3485, "ops": 8845, "op_bytes": 1737193, "received": 4111, "deliveries": 3492, "stored": 8838}, "passed": true, "owner_opened": {"opened": true, "fault": "none", "total": 1736, "summed": 770414}}
diff --git a/research/experiments/046-commit-replica/entries.aup b/research/experiments/046-commit-replica/entries.aup
new file mode 100644
index 0000000..6a95acc
--- /dev/null
+++ b/research/experiments/046-commit-replica/entries.aup
@@ -0,0 +1,12 @@
+record Entry {
+ n = 0
+}
+state entries: list of Entry
+state count = 0
+input add = message { n: number }
+on add {
+ entries.append(Entry { n: add.n })
+ count = count + 1
+}
+view total = count
+view summed = sum(e.n for e in entries)
diff --git a/research/experiments/046-commit-replica/follower.c b/research/experiments/046-commit-replica/follower.c
new file mode 100644
index 0000000..b097c25
--- /dev/null
+++ b/research/experiments/046-commit-replica/follower.c
@@ -0,0 +1,211 @@
+/* Research 046: the follower. Hears the owner's records over pure link (a receiver on a UDP port) and does each op
+ * again under its own directory, in order (ops.h): the same bytes at the same places, the same names created, renamed
+ * and removed. A record that ends its cut is followed by an fsync of every file and directory the cut touched; then the
+ * records are said saved (pure_link_done), which is what the owner's sync waits for. Its heard (the last record done)
+ * is kept in memory: a follower started again is not this experiment's.
+ *
+ * follower keys DIR makes DIR/owner.key and DIR/follower.key, prints both public halves
+ * follower DIR PORT KEY OWNER_PUBLIC_HEX runs until SIGTERM, then one JSON line of counts */
+#define _GNU_SOURCE
+#include "link.h"
+#include "seal.h"
+#include "ops.h"
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <pthread.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+static int directory = -1;
+static PureLinkListener *listener;
+static uint64_t heard, cuts, applied_ops, applied_bytes;
+static bool within_cut; /* the last record done did not end its cut: the store holds part of one */
+static volatile sig_atomic_t stopping;
+
+typedef struct Job { struct Job *next; void *token; uint64_t first; unsigned count; unsigned char *records; size_t size; } Job;
+static Job *head, *tail;
+static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t waiting = PTHREAD_COND_INITIALIZER;
+
+static void fail(const char *what, const char *path) {
+ fprintf(stderr, "follower: %s %s: %s\n", what, path, strerror(errno));
+ exit(1);
+}
+
+/* The paths a cut touched, to sync at its end. */
+static char *touched[4096];
+static unsigned touched_count;
+static void touch(const char *path) {
+ for (unsigned i = 0; i < touched_count; ++i) if (!strcmp(touched[i], path)) return;
+ if (touched_count < 4096) touched[touched_count++] = strdup(path);
+}
+static void sync_touched(void) {
+ for (unsigned i = 0; i < touched_count; ++i) {
+ int fd = openat(directory, touched[i][0] ? touched[i] : ".", O_RDONLY | O_CLOEXEC);
+ if (fd >= 0) fsync(fd), close(fd); /* one renamed or removed since is synced as its directory is */
+ free(touched[i]);
+ }
+ touched_count = 0;
+ fsync(directory);
+}
+
+static const char *name_of(const unsigned char *p, char *out) {
+ uint16_t n = get16(p + 1);
+ memcpy(out, p + 3, n);
+ out[n] = 0;
+ return out[0] ? out : ".";
+}
+
+static void apply(const unsigned char *p, size_t size) {
+ char path[PATH_MAX], other[PATH_MAX];
+ const char *at = name_of(p, path);
+ const unsigned char *rest = p + 3 + get16(p + 1);
+ int fd;
+ switch (p[0]) {
+ case OP_CREATE: {
+ uint32_t flags = get32(rest), mode = get32(rest + 4);
+ if ((fd = openat(directory, at, O_WRONLY | O_CLOEXEC | (int)flags, (mode_t)mode)) < 0) fail("create", at);
+ close(fd);
+ break;
+ }
+ case OP_WRITE: {
+ uint64_t offset = get64(rest);
+ uint32_t length = get32(rest + 8);
+ if ((fd = openat(directory, at, O_WRONLY | O_CLOEXEC)) < 0) fail("open", at);
+ for (const unsigned char *b = rest + 12; length;) {
+ ssize_t n = pwrite(fd, b, length, (off_t)offset);
+ if (n <= 0) fail("write", at);
+ b += n, offset += (uint64_t)n, length -= (uint32_t)n;
+ }
+ close(fd);
+ break;
+ }
+ case OP_TRUNCATE:
+ if ((fd = openat(directory, at, O_WRONLY | O_CLOEXEC)) < 0 || ftruncate(fd, (off_t)get64(rest))) fail("truncate", at);
+ close(fd);
+ break;
+ case OP_ALLOCATE:
+ if ((fd = openat(directory, at, O_WRONLY | O_CLOEXEC)) < 0 || posix_fallocate(fd, (off_t)get64(rest), (off_t)get64(rest + 8)))
+ fail("allocate", at);
+ close(fd);
+ break;
+ case OP_RENAME: {
+ uint16_t n = get16(rest);
+ memcpy(other, rest + 2, n);
+ other[n] = 0;
+ if (renameat(directory, at, directory, other)) fail("rename", at);
+ touch(other);
+ break;
+ }
+ case OP_UNLINK:
+ if (unlinkat(directory, at, (int)get32(rest))) fail("unlink", at);
+ break;
+ case OP_MKDIR:
+ if (path[0] && mkdirat(directory, at, (mode_t)get32(rest)) && errno != EEXIST) fail("mkdir", at);
+ break;
+ case OP_SYNC: break;
+ }
+ if (p[0] != OP_UNLINK && p[0] != OP_RENAME) touch(path);
+ ++applied_ops, applied_bytes += size;
+}
+
+static void *work(void *unused) {
+ (void)unused;
+ for (;;) {
+ pthread_mutex_lock(&lock);
+ while (!head) pthread_cond_wait(&waiting, &lock);
+ Job *job = head;
+ if (!(head = job->next)) tail = NULL;
+ pthread_mutex_unlock(&lock);
+ const unsigned char *p = job->records;
+ for (unsigned i = 0; i < job->count; ++i) {
+ uint32_t size = get32(p);
+ const unsigned char *r = p + 4;
+ uint64_t seq = job->first + i;
+ p += 4 + size;
+ if (seq <= heard) continue; /* heard already */
+ if (seq != heard + 1) break; /* a gap: the link gives it again */
+ for (size_t at = 9; at < size;) {
+ size_t n = op_size(r + at, size - at);
+ if (!n) { fprintf(stderr, "follower: a torn op in record %llu\n", (unsigned long long)seq); exit(1); }
+ apply(r + at, n);
+ at += n;
+ }
+ if (r[0]) sync_touched(), ++cuts; /* the cut's end: what it touched is durable before it is said saved */
+ within_cut = !r[0];
+ heard = seq;
+ }
+ pure_link_done(listener, (PureLinkDone){job->token, heard, true, false, false});
+ free(job->records);
+ free(job);
+ }
+ return NULL;
+}
+
+static int input(void *context, const char *name, uint32_t shape, const unsigned char *fields, size_t size) {
+ (void)context, (void)shape, (void)fields, (void)size;
+ return strcmp(name, "store") ? -1 : 0;
+}
+
+static bool deliver(void *context, const PureLinkDelivery *d) {
+ (void)context;
+ Job *job = malloc(sizeof(*job));
+ unsigned char *copy = malloc(d->size ? d->size : 1);
+ if (!job || !copy) return false;
+ memcpy(copy, d->records, d->size);
+ *job = (Job){NULL, d->token, d->first, d->count, copy, d->size};
+ pthread_mutex_lock(&lock);
+ if (tail) tail->next = job;
+ else head = job;
+ tail = job;
+ pthread_cond_signal(&waiting);
+ pthread_mutex_unlock(&lock);
+ return true;
+}
+
+static void on_term(int signal) { (void)signal; stopping = 1; }
+
+int main(int argc, char **argv) {
+ char error[256], hex[2 * PURE_SEAL_KEY + 1], other_hex[2 * PURE_SEAL_KEY + 1];
+ if (argc == 3 && !strcmp(argv[1], "keys")) {
+ char a[PATH_MAX], b[PATH_MAX];
+ snprintf(a, sizeof(a), "%s/owner.key", argv[2]), snprintf(b, sizeof(b), "%s/follower.key", argv[2]);
+ PureSealKey *x = pure_seal_key(a, hex, error, sizeof(error)), *y = pure_seal_key(b, other_hex, error, sizeof(error));
+ if (!x || !y) { fprintf(stderr, "follower: %s\n", error); return 1; }
+ printf("{\"owner\":\"%s\",\"follower\":\"%s\"}\n", hex, other_hex);
+ return 0;
+ }
+ if (argc != 5) { fprintf(stderr, "usage: %s DIR PORT KEY OWNER_PUBLIC_HEX | keys DIR\n", argv[0]); return 2; }
+ mkdir(argv[1], 0700);
+ if ((directory = open(argv[1], O_RDONLY | O_DIRECTORY | O_CLOEXEC)) < 0) fail("open", argv[1]);
+ unsigned char own_public[PURE_SEAL_KEY], owner[PURE_SEAL_KEY];
+ PureSealKey *key = pure_seal_key(argv[3], hex, error, sizeof(error));
+ if (!key || !pure_seal_peer(hex, own_public) || !pure_seal_peer(argv[4], owner)) { fprintf(stderr, "follower: %s\n", error); return 1; }
+ PureLinkReceiver *receiver = pure_link_receiver(key, own_public, &(PureLinkHost){input, deliver, NULL}, error, sizeof(error));
+ if (!receiver || !pure_link_allow(receiver, "owner", owner, error, sizeof(error)) ||
+ !(listener = pure_link_listen(receiver, (unsigned)atoi(argv[2]), error, sizeof(error)))) {
+ fprintf(stderr, "follower: %s\n", error);
+ return 1;
+ }
+ pthread_t worker;
+ pthread_create(&worker, NULL, work, NULL);
+ if (!pure_link_serve(listener, error, sizeof(error))) { fprintf(stderr, "follower: %s\n", error); return 1; }
+ signal(SIGTERM, on_term), signal(SIGINT, on_term);
+ printf("{\"ready\":true}\n");
+ fflush(stdout);
+ while (!stopping) pause();
+ pthread_mutex_lock(&lock); /* the worker between records: what it did is whole */
+ PureLinkCounts counts;
+ pure_link_listener_close(listener, &counts);
+ printf("{\"within_cut\":%s,\"heard\":%llu,\"cuts\":%llu,\"ops\":%llu,\"op_bytes\":%llu,\"received\":%llu,\"deliveries\":%llu,\"stored\":%llu}\n",
+ within_cut ? "true" : "false", (unsigned long long)heard, (unsigned long long)cuts, (unsigned long long)applied_ops,
+ (unsigned long long)applied_bytes, (unsigned long long)counts.received, (unsigned long long)counts.deliveries,
+ (unsigned long long)counts.stored);
+ fflush(stdout);
+ _exit(0);
+}
diff --git a/research/experiments/046-commit-replica/ops.h b/research/experiments/046-commit-replica/ops.h
new file mode 100644
index 0000000..dcf467e
--- /dev/null
+++ b/research/experiments/046-commit-replica/ops.h
@@ -0,0 +1,45 @@
+/* Research 046: what a store did to its files, as the shim (shim.c) saw it and the follower (follower.c) does it again.
+ * An op is a u8 kind, its path (u16le length, bytes; relative to the store's directory, "" the directory itself), then:
+ * OP_CREATE u32le the open's flags among O_CREAT, O_EXCL, O_TRUNC; u32le mode
+ * OP_WRITE u64le offset, u32le length, the bytes
+ * OP_TRUNCATE u64le length
+ * OP_ALLOCATE u64le offset, u64le length (posix_fallocate)
+ * OP_RENAME the second path (u16le length, bytes)
+ * OP_UNLINK u32le flags (AT_REMOVEDIR)
+ * OP_MKDIR u32le mode
+ * OP_SYNC (an fsync or fdatasync of that path: where a cut ends)
+ * A cut is the ops since the last, ending in one OP_SYNC. On the link a record is u8 1 when it ends its cut (else 0),
+ * u64le the cut's number, then whole ops. */
+#ifndef OPS_H
+#define OPS_H
+#include <stdint.h>
+#include <string.h>
+
+enum { OP_CREATE = 1, OP_WRITE, OP_TRUNCATE, OP_ALLOCATE, OP_RENAME, OP_UNLINK, OP_MKDIR, OP_SYNC, OP_KINDS };
+static const char *const op_names[OP_KINDS] = {"", "create", "write", "truncate", "allocate", "rename", "unlink", "mkdir", "sync"};
+
+static inline void put16(unsigned char *p, uint16_t v) { p[0] = (unsigned char)v, p[1] = (unsigned char)(v >> 8); }
+static inline void put32(unsigned char *p, uint32_t v) { for (int i = 0; i < 4; ++i) p[i] = (unsigned char)(v >> (8 * i)); }
+static inline void put64(unsigned char *p, uint64_t v) { for (int i = 0; i < 8; ++i) p[i] = (unsigned char)(v >> (8 * i)); }
+static inline uint16_t get16(const unsigned char *p) { return (uint16_t)(p[0] | p[1] << 8); }
+static inline uint32_t get32(const unsigned char *p) { uint32_t v = 0; for (int i = 3; i >= 0; --i) v = v << 8 | p[i]; return v; }
+static inline uint64_t get64(const unsigned char *p) { uint64_t v = 0; for (int i = 7; i >= 0; --i) v = v << 8 | p[i]; return v; }
+
+/* An op's size from its start (at most size bytes there), or 0 when it is not whole. */
+static inline size_t op_size(const unsigned char *p, size_t size) {
+ if (size < 3) return 0;
+ size_t at = 3 + get16(p + 1);
+ if (at > size) return 0;
+ switch (p[0]) {
+ case OP_CREATE: at += 8; break;
+ case OP_WRITE: if (at + 12 > size) return 0; at += 12 + get32(p + at + 8); break;
+ case OP_TRUNCATE: at += 8; break;
+ case OP_ALLOCATE: at += 16; break;
+ case OP_RENAME: if (at + 2 > size) return 0; at += 2 + get16(p + at); break;
+ case OP_UNLINK: case OP_MKDIR: at += 4; break;
+ case OP_SYNC: break;
+ default: return 0;
+ }
+ return at <= size ? at : 0;
+}
+#endif
diff --git a/research/experiments/046-commit-replica/prefixes.py b/research/experiments/046-commit-replica/prefixes.py
new file mode 100644
index 0000000..ab228aa
--- /dev/null
+++ b/research/experiments/046-commit-replica/prefixes.py
@@ -0,0 +1,119 @@
+#!/usr/bin/env python3
+"""Research 046: what a follower may hold when the owner's whole machine dies (run.py's kills seldom leave one with
+part of a cut: a cut's records travel together). The owner takes EVENTS messages with the shim keeping every op it
+shipped (SHIM_JOURNAL); then the ops are done again in order into a fresh directory, and at SAMPLES points (op
+boundaries drawn at random, within cuts and at their ends, and the whole stream) a copy of what is there is opened by
+pure-run as the owner (and around every rename: a compaction's or an image's install). Each must open without a fault, hold the first `total` messages' entries exactly (summed), hold
+no fewer than at the sample before (a prefix never loses what a shorter one held), and the whole stream every message.
+
+ prefixes.py EVENTS SAMPLES one JSON line a sample, then one of the totals"""
+import json
+import os
+import random
+import shutil
+import sys
+import time
+from pathlib import Path
+
+import run as harness
+
+OP_CREATE, OP_WRITE, OP_TRUNCATE, OP_ALLOCATE, OP_RENAME, OP_UNLINK, OP_MKDIR, OP_SYNC = range(1, 9)
+
+
+def ops_of(journal):
+ """The ops in order: (kind, path, rest) as bytes, and how many syncs (cuts) came before each."""
+ out, at, cuts = [], 0, 0
+ while at < len(journal):
+ kind, n = journal[at], int.from_bytes(journal[at + 1:at + 3], 'little')
+ path = journal[at + 3:at + 3 + n].decode()
+ p = at + 3 + n
+ if kind == OP_CREATE: end = p + 8
+ elif kind == OP_WRITE: end = p + 12 + int.from_bytes(journal[p + 8:p + 12], 'little')
+ elif kind == OP_TRUNCATE: end = p + 8
+ elif kind == OP_ALLOCATE: end = p + 16
+ elif kind == OP_RENAME: end = p + 2 + int.from_bytes(journal[p:p + 2], 'little')
+ elif kind in (OP_UNLINK, OP_MKDIR): end = p + 4
+ elif kind == OP_SYNC: end = p
+ else: raise SystemExit(f'unknown op {kind} at {at}')
+ out.append((kind, path, journal[p:end], cuts))
+ cuts += kind == OP_SYNC
+ at = end
+ return out
+
+
+def apply(root, op):
+ kind, path, rest, _ = op
+ target = root / path if path else root
+ if kind == OP_CREATE:
+ flags = int.from_bytes(rest[:4], 'little')
+ fd = os.open(target, os.O_WRONLY | flags, int.from_bytes(rest[4:8], 'little'))
+ os.close(fd)
+ elif kind == OP_WRITE:
+ offset, length = int.from_bytes(rest[:8], 'little'), int.from_bytes(rest[8:12], 'little')
+ fd = os.open(target, os.O_WRONLY)
+ os.pwrite(fd, rest[12:12 + length], offset)
+ os.close(fd)
+ elif kind == OP_TRUNCATE:
+ os.truncate(target, int.from_bytes(rest, 'little'))
+ elif kind == OP_ALLOCATE:
+ fd = os.open(target, os.O_WRONLY)
+ os.posix_fallocate(fd, int.from_bytes(rest[:8], 'little'), int.from_bytes(rest[8:16], 'little'))
+ os.close(fd)
+ elif kind == OP_RENAME:
+ n = int.from_bytes(rest[:2], 'little')
+ os.rename(target, root / rest[2:2 + n].decode())
+ elif kind == OP_UNLINK:
+ (os.rmdir if int.from_bytes(rest, 'little') & 0x200 else os.unlink)(target)
+ elif kind == OP_MKDIR:
+ target.mkdir(mode=int.from_bytes(rest, 'little'), exist_ok=True)
+
+
+def main():
+ events, samples = int(sys.argv[1]), int(sys.argv[2])
+ keys = harness.build()
+ journal = harness.WORK / 'journal'
+ harness.ENV['SHIM_JOURNAL'] = str(journal)
+ r = harness.Run(keys)
+ r.feed(events)
+ r.owner.wait()
+ r.reader.join(timeout=10)
+ r.shipper.communicate(timeout=60)
+ r.stop_follower()
+ del harness.ENV['SHIM_JOURNAL']
+ ops = ops_of(journal.read_bytes())
+ near = {i + d for i, op in enumerate(ops) if op[0] == OP_RENAME for d in range(-3, 4) if 0 < i + d <= len(ops)}
+ picks = sorted(set(random.sample(range(1, len(ops)), min(samples, len(ops) - 1))) | near | {len(ops)})
+ root, copy = harness.WORK / 'prefix', harness.WORK / 'prefix-open'
+ shutil.rmtree(root, ignore_errors=True)
+ root.mkdir()
+ done, last_total, failures, within = 0, -1, [], 0
+ started = time.time()
+ for pick in picks:
+ while done < pick:
+ apply(root, ops[done])
+ done += 1
+ mid = ops[pick - 1][0] != OP_SYNC # the prefix ends inside a cut
+ within += mid
+ shutil.rmtree(copy, ignore_errors=True)
+ shutil.copytree(root, copy)
+ took = harness.opened(copy)
+ total = int(took.get('total', -1)) if took.get('opened') else -1
+ good = (took.get('opened') and took.get('fault') == 'none' and took.get('summed') == harness.summed(total) and
+ total >= last_total and (pick < len(ops) or total == events))
+ if not good:
+ failures.append({'ops': pick, 'cut': ops[pick - 1][3], 'within_cut': mid, 'took': took, 'before': last_total})
+ print(json.dumps({'ops': pick, 'of': len(ops), 'cut': ops[pick - 1][3], 'within_cut': mid, 'total': total,
+ 'passed': bool(good)}), flush=True)
+ last_total = max(last_total, total)
+ renamed = {}
+ for op in ops:
+ if op[0] == OP_RENAME:
+ to = op[2][2:].decode()
+ renamed[to] = renamed.get(to, 0) + 1
+ print(json.dumps({'run': 'prefixes', 'events': events, 'ops': len(ops), 'journal_bytes': journal.stat().st_size,
+ 'renamed_to': renamed, 'samples': len(picks), 'near_renames': len(near), 'within_cuts': within, 'failed': len(failures), 'failures': failures[:5],
+ 'seconds': round(time.time() - started, 1)}), flush=True)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/research/experiments/046-commit-replica/run.py b/research/experiments/046-commit-replica/run.py
new file mode 100644
index 0000000..1e4f4b8
--- /dev/null
+++ b/research/experiments/046-commit-replica/run.py
@@ -0,0 +1,261 @@
+#!/usr/bin/env python3
+"""Research 046: 029's principle 2 ("the commit is the replica") put to its breaking experiment on one Pi.
+
+An owner (pure-run --store, with shim.so preloaded) takes `add` messages of entries.aup; every sync of its store ends a
+cut that the shipper sends over pure link to the follower, which does the same ops under its own directory; the
+owner's sync returns only once the follower saved the cut (synchronous). Both stores on /dev/shm (what is tested is
+identity and taking over, not the medium).
+
+ run.py identity EVENTS EVERY the owner takes EVENTS messages; every EVERY cuts it pauses and the two stores are
+ compared byte for byte (names and contents), and once more at the end
+ run.py takeover RUNS EVENTS RUNS times: the owner (and in every other run its shipper too, as when its machine
+ dies) killed with SIGKILL after a random number of messages up to EVENTS; the
+ follower's store opened by pure-run as the owner: it must open, hold every message
+ the owner said done, none it was not sent, and the entries in order
+ run.py torn RUNS EVENTS [B] as takeover, the whole node killed every time, the cuts sent as records of at most B
+ bytes (512): a kill leaves the follower part of a cut, as a crash leaves a disk
+ run.py price EVENTS the owner's time for EVENTS messages with and without the shim, and what went on the link
+
+One JSON line a run (or a sample)."""
+import json
+import os
+import random
+import select
+import shutil
+import signal
+import socket
+import struct
+import subprocess
+import sys
+import threading
+import time
+from pathlib import Path
+
+HERE = Path(__file__).resolve().parent
+PURE = HERE.parents[2]
+AUP = Path('/home/eunhhu/work/aup/build/aup')
+WORK = Path(os.environ.get('RUN_WORK', '/dev/shm/pure-046'))
+RUN = PURE / 'build' / 'pure-run'
+ENV = dict(os.environ, PURE_CRYPTO=str(PURE / 'build' / 'pure-crypto.so'))
+
+
+def build():
+ WORK.mkdir(parents=True, exist_ok=True)
+ cc = ['cc', '-O2', '-std=gnu17', '-Wall', '-Wextra']
+ subprocess.run(cc + ['-fPIC', '-shared', str(HERE / 'shim.c'), '-ldl', '-pthread', '-o', str(WORK / 'shim.so')], check=True)
+ for name in ('shipper', 'follower'):
+ subprocess.run(cc + [f'-I{PURE / "link"}', str(HERE / f'{name}.c'), str(PURE / 'build' / 'libpure-link.a'),
+ '-lm', '-pthread', '-ldl', '-o', str(WORK / name)], check=True)
+ subprocess.run([str(AUP), 'build', str(HERE / 'entries.aup'), '-o', str(WORK / 'entries.pmod')], check=True)
+ keys = json.loads(subprocess.run([str(WORK / 'follower'), 'keys', str(WORK)], capture_output=True, text=True,
+ check=True, env=ENV).stdout)
+ return keys
+
+
+def free_port():
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ s.bind(('127.0.0.1', 0))
+ port = s.getsockname()[1]
+ s.close()
+ return port
+
+
+def message(i): # not whole: a logged change takes its 8 bytes, so the log outgrows the list's items within the run
+ return 'message add ' + struct.pack('<d', i % 1000 + 0.25).hex() + '\n'
+
+
+def stores_differ(a, b):
+ """Differences between two store directories: names in one only, and files whose bytes differ (the first offset)."""
+ names_a = {p.relative_to(a) for p in a.rglob('*')}
+ names_b = {p.relative_to(b) for p in b.rglob('*')}
+ out = [f'only owner: {n}' for n in sorted(names_a - names_b)] + [f'only follower: {n}' for n in sorted(names_b - names_a)]
+ for n in sorted(names_a & names_b):
+ x, y = a / n, b / n
+ if x.is_dir() or y.is_dir():
+ if x.is_dir() != y.is_dir():
+ out.append(f'kind: {n}')
+ continue
+ p, q = x.read_bytes(), y.read_bytes()
+ if p != q:
+ first = next((i for i in range(min(len(p), len(q))) if p[i] != q[i]), min(len(p), len(q)))
+ out.append(f'bytes: {n} sizes {len(p)} {len(q)} first difference at {first}')
+ return out
+
+
+class Run:
+ """A follower, a shipper and an owner, started in that order on fresh stores."""
+
+ def __init__(self, keys, every=0, shim=True):
+ self.owner_dir, self.follower_dir = WORK / 'owner-store', WORK / 'follower-store'
+ for d in (self.owner_dir, self.follower_dir):
+ shutil.rmtree(d, ignore_errors=True)
+ port = free_port()
+ self.follower = subprocess.Popen([str(WORK / 'follower'), str(self.follower_dir), str(port), str(WORK / 'follower.key'),
+ keys['owner']], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, env=ENV)
+ assert json.loads(self.follower.stdout.readline())['ready']
+ sock = WORK / 'ship.sock'
+ self.shipper = subprocess.Popen([str(WORK / 'shipper'), str(sock), f'pure://127.0.0.1:{port}/store',
+ str(WORK / 'owner.key'), keys['follower']], stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE, text=True, env=ENV)
+ assert json.loads(self.shipper.stdout.readline())['ready']
+ env = dict(ENV)
+ if shim:
+ env.update(LD_PRELOAD=str(WORK / 'shim.so'), SHIM_STORE=str(self.owner_dir), SHIM_SOCKET=str(sock),
+ SHIM_STATS=str(WORK / 'shim-stats.json'))
+ if every:
+ for f in ('paused', 'resume'):
+ p = WORK / f
+ if p.exists():
+ p.unlink()
+ os.mkfifo(p)
+ self.paused = os.open(WORK / 'paused', os.O_RDWR) # held open both ways: no open waits for the other end
+ self.resume = os.open(WORK / 'resume', os.O_RDWR)
+ env.update(SHIM_PAUSE_EVERY=str(every), SHIM_PAUSE_DIR=str(WORK))
+ self.owner = subprocess.Popen([str(RUN), str(WORK / 'entries.pmod'), '--views', '--store', str(self.owner_dir)],
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True,
+ env=env, bufsize=1)
+ self.done = 0 # messages the owner said done (each line comes after its save, so after the follower's ack)
+ self.reader = threading.Thread(target=self.read, daemon=True)
+ self.reader.start()
+
+ def read(self):
+ for line in self.owner.stdout:
+ if line.startswith('{'):
+ self.done += 1
+
+ def feed(self, events, stop_after=None):
+ sent = 0
+ try:
+ for i in range(events):
+ self.owner.stdin.write(message(i))
+ sent += 1
+ if stop_after is not None and sent >= stop_after:
+ break
+ if stop_after is None:
+ self.owner.stdin.close()
+ except BrokenPipeError:
+ pass
+ return sent
+
+ def stop_follower(self):
+ self.follower.send_signal(signal.SIGTERM)
+ out, err = self.follower.communicate(timeout=60)
+ return json.loads(out.strip().splitlines()[-1]) if out.strip() else {'error': err[-500:]}
+
+
+def opened(store):
+ """The store opened by pure-run as its owner: the views (total, summed) it shows, or why it did not open."""
+ r = subprocess.run([str(RUN), str(WORK / 'entries.pmod'), '--views', '--store', str(store)], input='show\n',
+ capture_output=True, text=True, env=ENV, timeout=120)
+ lines = [l for l in r.stdout.splitlines() if l.startswith('{')]
+ if r.returncode or not lines:
+ return {'opened': False, 'exit': r.returncode, 'stderr': r.stderr[-300:]}
+ shown = json.loads(lines[-1])
+ return {'opened': True, 'fault': shown.get('fault'), **shown['views']}
+
+
+def summed(n): # every partial sum a multiple of 0.25 below 2^50: exact as a binary64
+ return float(sum(i % 1000 for i in range(n))) + 0.25 * n
+
+
+def identity(keys, events, every):
+ run = Run(keys, every=every)
+ feeder = threading.Thread(target=run.feed, args=(events,), daemon=True)
+ feeder.start()
+ samples, differing = 0, []
+ while True:
+ ready, _, _ = select.select([run.paused], [], [], 0.2)
+ if ready:
+ cut = int(os.read(run.paused, 64).split()[0])
+ diff = stores_differ(run.owner_dir, run.follower_dir)
+ samples += 1
+ if diff:
+ differing.append({'cut': cut, 'differences': diff[:5]})
+ os.write(run.resume, b'g')
+ elif run.owner.poll() is not None:
+ break
+ feeder.join()
+ run.reader.join(timeout=10)
+ owner_exit = run.owner.wait()
+ shipper_out = run.shipper.communicate(timeout=60)[0].strip().splitlines()
+ end = stores_differ(run.owner_dir, run.follower_dir)
+ follower = run.stop_follower()
+ stats = json.loads((WORK / 'shim-stats.json').read_text())
+ files = {p.name: p.stat().st_size for p in sorted(run.owner_dir.iterdir())}
+ print(json.dumps({'run': 'identity', 'events': events, 'done': run.done, 'owner_exit': owner_exit, 'every': every,
+ 'samples': samples, 'samples_differing': len(differing), 'first_differing': differing[:3],
+ 'end_differences': end[:5], 'shim': stats, 'shipper': json.loads(shipper_out[-1]) if shipper_out else None,
+ 'follower': follower, 'owner_files': files,
+ 'follower_opened': opened(run.follower_dir)}), flush=True)
+
+
+def takeover(keys, runs, events, torn=False):
+ for k in range(runs):
+ whole_node = torn or k % 2 == 1 # the shipper dies with the owner
+ stop_after = random.randint(1, events)
+ run = Run(keys)
+ sent = run.feed(events, stop_after=stop_after)
+ deadline = time.time() + 120
+ while run.done < max(1, sent // 2) and time.time() < deadline and run.owner.poll() is None:
+ time.sleep(0.001)
+ # the owner is working through what was sent: kill it at a moment it does not choose
+ time.sleep(random.random() * 0.05)
+ run.owner.send_signal(signal.SIGKILL)
+ if whole_node:
+ run.shipper.send_signal(signal.SIGKILL)
+ run.owner.wait()
+ done = run.done
+ if not whole_node:
+ run.shipper.communicate(timeout=60)
+ else:
+ run.shipper.wait()
+ time.sleep(1.0) # what was on the way reaches the follower
+ follower = run.stop_follower()
+ took = opened(run.follower_dir)
+ good = (took.get('opened') and took.get('fault') == 'none' and done <= took.get('total', -1) <= sent and
+ took.get('summed') == summed(int(took.get('total', 0))))
+ print(json.dumps({'run': 'takeover', 'k': k, 'whole_node': whole_node, 'record': os.environ.get('SHIPPER_RECORD'), 'sent': sent, 'owner_said_done': done,
+ 'follower_took': took, 'follower': follower, 'passed': bool(good),
+ 'owner_opened': opened(run.owner_dir)}), flush=True)
+
+
+def price(keys, events):
+ out = {}
+ for shim in (False, True):
+ run = Run(keys, shim=shim)
+ start = time.perf_counter()
+ run.feed(events)
+ run.owner.wait()
+ run.reader.join(timeout=10)
+ seconds = time.perf_counter() - start
+ run.owner.stdin = None
+ shipper = run.shipper
+ if not shim:
+ shipper.terminate()
+ lines = shipper.communicate(timeout=60)[0].strip().splitlines()
+ run.stop_follower()
+ key = 'with_shim' if shim else 'without'
+ out[key] = {'seconds': round(seconds, 3), 'us_per_event': round(1e6 * seconds / events, 1), 'done': run.done}
+ if shim:
+ out['shim'] = json.loads((WORK / 'shim-stats.json').read_text())
+ out['shipper'] = json.loads(lines[-1]) if lines else None
+ print(json.dumps({'run': 'price', 'events': events, **out}), flush=True)
+
+
+def main():
+ keys = build()
+ what = sys.argv[1]
+ if what == 'identity':
+ identity(keys, int(sys.argv[2]), int(sys.argv[3]))
+ elif what == 'takeover':
+ takeover(keys, int(sys.argv[2]), int(sys.argv[3]))
+ elif what == 'torn': # the whole node killed, its cuts sent as small records: the follower left with part of one
+ os.environ['SHIPPER_RECORD'] = sys.argv[4] if len(sys.argv) > 4 else '512'
+ ENV['SHIPPER_RECORD'] = os.environ['SHIPPER_RECORD']
+ takeover(keys, int(sys.argv[2]), int(sys.argv[3]), torn=True)
+ elif what == 'price':
+ price(keys, int(sys.argv[2]))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/research/experiments/046-commit-replica/shim.c b/research/experiments/046-commit-replica/shim.c
new file mode 100644
index 0000000..5ff38a5
--- /dev/null
+++ b/research/experiments/046-commit-replica/shim.c
@@ -0,0 +1,353 @@
+/* Research 046 (029's principle 2, its breaking experiment): what an owner's store does to its files, shipped as it is.
+ * Preloaded into the owner (pure-run --store DIR), it sees every call that changes a file under DIR (SHIM_STORE, an
+ * absolute path) and keeps it as an op (ops.h). Each fsync or fdatasync of such a file or directory ends a cut: the
+ * cut goes to the shipper (SHIM_SOCKET, a unix socket), and the sync returns only once the shipper says the follower
+ * has it (synchronous: the owner holds one cut in flight, no log). A call that would change a file under DIR some way
+ * not shipped (a shared writable mapping, a duplicated descriptor) stops the process: a copy that differs in silence
+ * would be no finding at all.
+ *
+ * SHIM_PAUSE_EVERY=N with SHIM_PAUSE_DIR: after every Nth cut's sync, it writes the cut's number to DIR/paused and
+ * waits for a byte from DIR/resume (the harness compares the two stores meanwhile). SHIM_STATS: a file for counts at
+ * exit (ops and bytes by kind, cuts, the time waited for acks, the names renamed to). SHIM_JOURNAL: a file that gets
+ * every cut's ops as shipped, in order (prefixes.py makes stores of its prefixes).
+ *
+ * cc -O2 -std=gnu17 -fPIC -shared shim.c -ldl -pthread -o shim.so */
+#define _GNU_SOURCE
+#include "ops.h"
+#include <dlfcn.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <pthread.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/un.h>
+#include <time.h>
+#include <unistd.h>
+
+enum { FDS = 65536 };
+static char *paths[FDS]; /* an open descriptor's path relative to the store, when it is under it */
+static char root[PATH_MAX];
+static size_t root_length;
+static bool active;
+static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+static unsigned char *ops;
+static size_t used, room;
+static uint64_t cuts, op_count[OP_KINDS], op_bytes[OP_KINDS], shipped, waited_ns;
+static int link_fd = -1, journal_fd = -1; /* SHIM_JOURNAL: every cut's ops, in order, for prefixes.py */
+static char renamed[32][64]; /* the names renamed to, and how often (in the counts at exit) */
+static uint64_t renamed_count[32];
+static unsigned renamed_names;
+static unsigned pause_every;
+static char pause_dir[PATH_MAX];
+
+static int (*real_open)(const char *, int, ...);
+static int (*real_openat)(int, const char *, int, ...);
+static int (*real_close)(int);
+static ssize_t (*real_pwrite)(int, const void *, size_t, off_t);
+static int (*real_ftruncate)(int, off_t);
+static int (*real_posix_fallocate)(int, off_t, off_t);
+static int (*real_renameat)(int, const char *, int, const char *);
+static int (*real_unlinkat)(int, const char *, int);
+static int (*real_mkdir)(const char *, mode_t);
+static int (*real_fsync)(int);
+static int (*real_fdatasync)(int);
+static void *(*real_mmap)(void *, size_t, int, int, int, off_t);
+static int (*real_fcntl)(int, int, ...);
+static ssize_t (*real_write)(int, const void *, size_t);
+
+static void stop(const char *why, const char *path) {
+ fprintf(stderr, "shim: %s (%s): stopping, the follower would differ\n", why, path ? path : "");
+ abort();
+}
+
+__attribute__((constructor)) static void start(void) {
+ real_open = dlsym(RTLD_NEXT, "open"), real_openat = dlsym(RTLD_NEXT, "openat"), real_close = dlsym(RTLD_NEXT, "close");
+ real_pwrite = dlsym(RTLD_NEXT, "pwrite"), real_ftruncate = dlsym(RTLD_NEXT, "ftruncate");
+ real_posix_fallocate = dlsym(RTLD_NEXT, "posix_fallocate"), real_renameat = dlsym(RTLD_NEXT, "renameat");
+ real_unlinkat = dlsym(RTLD_NEXT, "unlinkat"), real_mkdir = dlsym(RTLD_NEXT, "mkdir");
+ real_fsync = dlsym(RTLD_NEXT, "fsync"), real_fdatasync = dlsym(RTLD_NEXT, "fdatasync");
+ real_mmap = dlsym(RTLD_NEXT, "mmap"), real_fcntl = dlsym(RTLD_NEXT, "fcntl"), real_write = dlsym(RTLD_NEXT, "write");
+ const char *store = getenv("SHIM_STORE");
+ if (!store || store[0] != '/' || strlen(store) >= sizeof(root)) return;
+ strcpy(root, store);
+ root_length = strlen(root);
+ while (root_length > 1 && root[root_length - 1] == '/') root[--root_length] = 0;
+ const char *every = getenv("SHIM_PAUSE_EVERY"), *dir = getenv("SHIM_PAUSE_DIR");
+ if (every && dir && strlen(dir) < sizeof(pause_dir) - 16) pause_every = (unsigned)atoi(every), strcpy(pause_dir, dir);
+ active = true;
+}
+
+__attribute__((destructor)) static void finish(void) {
+ const char *at = getenv("SHIM_STATS");
+ FILE *f = at && active ? fopen(at, "w") : NULL;
+ if (!f) return;
+ fprintf(f, "{\"cuts\":%llu,\"shipped_bytes\":%llu,\"waited_ms\":%.1f", (unsigned long long)cuts,
+ (unsigned long long)shipped, waited_ns / 1e6);
+ for (int k = 1; k < OP_KINDS; ++k)
+ fprintf(f, ",\"%s\":[%llu,%llu]", op_names[k], (unsigned long long)op_count[k], (unsigned long long)op_bytes[k]);
+ fprintf(f, ",\"renamed_to\":{");
+ for (unsigned r = 0; r < renamed_names; ++r) fprintf(f, "%s\"%s\":%llu", r ? "," : "", renamed[r], (unsigned long long)renamed_count[r]);
+ fprintf(f, "}}\n");
+ fclose(f);
+}
+
+/* path made absolute (against dirfd's or the working directory) and without "." parts: relative to the store, or NULL. */
+static char *under(int dirfd, const char *path) {
+ if (!active || !path) return NULL;
+ char whole[2 * PATH_MAX];
+ if (path[0] == '/') snprintf(whole, sizeof(whole), "%s", path);
+ else if (dirfd == AT_FDCWD) {
+ char cwd[PATH_MAX];
+ if (!getcwd(cwd, sizeof(cwd))) return NULL;
+ snprintf(whole, sizeof(whole), "%s/%s", cwd, path);
+ } else if (dirfd >= 0 && dirfd < FDS && paths[dirfd])
+ snprintf(whole, sizeof(whole), "%s%s%s/%s", root, paths[dirfd][0] ? "/" : "", paths[dirfd], path);
+ else return NULL;
+ /* drop "/." parts and a trailing "/" */
+ char clean[2 * PATH_MAX];
+ size_t n = 0;
+ for (const char *p = whole; *p;) {
+ if (p[0] == '/' && p[1] == '.' && (p[2] == '/' || p[2] == 0)) { p += 2; continue; }
+ if (p[0] == '/' && p[1] == '/') { ++p; continue; }
+ clean[n++] = *p++;
+ }
+ while (n > 1 && clean[n - 1] == '/') --n;
+ clean[n] = 0;
+ if (!strncmp(clean, root, root_length) && (clean[root_length] == 0 || clean[root_length] == '/'))
+ return strdup(clean[root_length] ? clean + root_length + 1 : "");
+ return NULL;
+}
+
+static void keep(int fd, char *relative) {
+ if (fd < 0 || fd >= FDS) { free(relative); return; }
+ free(paths[fd]);
+ paths[fd] = relative;
+}
+
+static unsigned char *op(uint8_t kind, const char *path, size_t extra) {
+ size_t length = strlen(path), need = 3 + length + extra;
+ if (used + need > room) {
+ size_t more = room ? room : 1 << 20;
+ while (used + need > more) more *= 2;
+ if (!(ops = realloc(ops, more))) stop("out of memory", path);
+ room = more;
+ }
+ unsigned char *p = ops + used;
+ p[0] = kind;
+ put16(p + 1, (uint16_t)length);
+ memcpy(p + 3, path, length);
+ used += need;
+ ++op_count[kind], op_bytes[kind] += need;
+ return p + 3 + length;
+}
+
+static bool full(int fd, const void *bytes, size_t size) {
+ for (const unsigned char *p = bytes; size;) {
+ ssize_t n = real_write(fd, p, size);
+ if (n <= 0) { if (n < 0 && errno == EINTR) continue; return false; }
+ p += n, size -= (size_t)n;
+ }
+ return true;
+}
+static bool whole_read(int fd, void *bytes, size_t size) {
+ for (unsigned char *p = bytes; size;) {
+ ssize_t n = read(fd, p, size);
+ if (n <= 0) { if (n < 0 && errno == EINTR) continue; return false; }
+ p += n, size -= (size_t)n;
+ }
+ return true;
+}
+
+/* A cut ends with path's sync: shipped, and waited for until the follower has it. */
+static void cut(const char *path) {
+ (void)op(OP_SYNC, path, 0);
+ ++cuts;
+ if (link_fd < 0) {
+ const char *at = getenv("SHIM_SOCKET");
+ struct sockaddr_un address = {.sun_family = AF_UNIX};
+ if (!at || strlen(at) >= sizeof(address.sun_path)) stop("no SHIM_SOCKET", path);
+ strcpy(address.sun_path, at);
+ if ((link_fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0)) < 0 ||
+ connect(link_fd, (struct sockaddr *)&address, sizeof(address)))
+ stop("cannot reach the shipper", at);
+ }
+ unsigned char head[16];
+ put64(head, cuts), put64(head + 8, used);
+ struct timespec a, b;
+ clock_gettime(CLOCK_MONOTONIC, &a);
+ if (!full(link_fd, head, sizeof(head)) || !full(link_fd, ops, used)) stop("the shipper went", path);
+ unsigned char ack[8];
+ if (!whole_read(link_fd, ack, sizeof(ack)) || get64(ack) != cuts) stop("no ack for the cut", path);
+ clock_gettime(CLOCK_MONOTONIC, &b);
+ waited_ns += (uint64_t)((b.tv_sec - a.tv_sec) * 1000000000LL + (b.tv_nsec - a.tv_nsec));
+ if (journal_fd < 0 && getenv("SHIM_JOURNAL")) journal_fd = real_open(getenv("SHIM_JOURNAL"), O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0600);
+ if (journal_fd >= 0 && !full(journal_fd, ops, used)) stop("the journal", getenv("SHIM_JOURNAL"));
+ shipped += used;
+ used = 0;
+}
+
+static void pause_if_due(void) {
+ if (!pause_every || cuts % pause_every) return;
+ char at[PATH_MAX + 16], line[32];
+ snprintf(at, sizeof(at), "%s/paused", pause_dir);
+ int fd = real_open(at, O_WRONLY | O_CLOEXEC);
+ if (fd < 0) stop("no paused fifo", at);
+ int n = snprintf(line, sizeof(line), "%llu\n", (unsigned long long)cuts);
+ full(fd, line, (size_t)n);
+ real_close(fd);
+ snprintf(at, sizeof(at), "%s/resume", pause_dir);
+ if ((fd = real_open(at, O_RDONLY | O_CLOEXEC)) < 0) stop("no resume fifo", at);
+ char go;
+ whole_read(fd, &go, 1);
+ real_close(fd);
+}
+
+static int opened(int fd, char *relative, int flags, mode_t mode) {
+ if (fd < 0 || !relative) { free(relative); return fd; }
+ if (flags & (O_CREAT | O_TRUNC)) {
+ unsigned char *p = op(OP_CREATE, relative, 8);
+ put32(p, (uint32_t)(flags & (O_CREAT | O_EXCL | O_TRUNC))), put32(p + 4, (uint32_t)mode);
+ }
+ keep(fd, relative);
+ return fd;
+}
+
+int open(const char *path, int flags, ...) {
+ mode_t mode = 0;
+ if (flags & (O_CREAT | O_TMPFILE)) { va_list v; va_start(v, flags); mode = va_arg(v, mode_t); va_end(v); }
+ pthread_mutex_lock(&lock);
+ char *relative = under(AT_FDCWD, path);
+ if (relative && (flags & O_TMPFILE) == O_TMPFILE) stop("O_TMPFILE", path);
+ int fd = real_open(path, flags, mode);
+ fd = opened(fd, relative, flags, mode);
+ pthread_mutex_unlock(&lock);
+ return fd;
+}
+
+int openat(int dirfd, const char *path, int flags, ...) {
+ mode_t mode = 0;
+ if (flags & (O_CREAT | O_TMPFILE)) { va_list v; va_start(v, flags); mode = va_arg(v, mode_t); va_end(v); }
+ pthread_mutex_lock(&lock);
+ char *relative = under(dirfd, path);
+ if (relative && (flags & O_TMPFILE) == O_TMPFILE) stop("O_TMPFILE", path);
+ int fd = real_openat(dirfd, path, flags, mode);
+ fd = opened(fd, relative, flags, mode);
+ pthread_mutex_unlock(&lock);
+ return fd;
+}
+
+int close(int fd) {
+ pthread_mutex_lock(&lock);
+ if (fd >= 0 && fd < FDS && paths[fd]) free(paths[fd]), paths[fd] = NULL;
+ pthread_mutex_unlock(&lock);
+ return real_close(fd);
+}
+
+/* A call that changes a file runs under the lock: two threads' ops are kept in the order they happened. */
+ssize_t pwrite(int fd, const void *bytes, size_t size, off_t offset) {
+ pthread_mutex_lock(&lock);
+ ssize_t n = real_pwrite(fd, bytes, size, offset);
+ if (n > 0 && fd >= 0 && fd < FDS && paths[fd]) {
+ unsigned char *p = op(OP_WRITE, paths[fd], 12 + (size_t)n);
+ put64(p, (uint64_t)offset), put32(p + 8, (uint32_t)n);
+ memcpy(p + 12, bytes, (size_t)n);
+ }
+ pthread_mutex_unlock(&lock);
+ return n;
+}
+ssize_t pwrite64(int fd, const void *bytes, size_t size, off_t offset) { return pwrite(fd, bytes, size, offset); }
+
+ssize_t write(int fd, const void *bytes, size_t size) {
+ if (fd >= 0 && fd < FDS && paths[fd] && size) stop("write without an offset", paths[fd]);
+ return real_write(fd, bytes, size);
+}
+
+int ftruncate(int fd, off_t length) {
+ pthread_mutex_lock(&lock);
+ int rc = real_ftruncate(fd, length);
+ if (!rc && fd >= 0 && fd < FDS && paths[fd]) put64(op(OP_TRUNCATE, paths[fd], 8), (uint64_t)length);
+ pthread_mutex_unlock(&lock);
+ return rc;
+}
+
+int posix_fallocate(int fd, off_t offset, off_t length) {
+ pthread_mutex_lock(&lock);
+ int rc = real_posix_fallocate(fd, offset, length);
+ if (!rc && fd >= 0 && fd < FDS && paths[fd]) {
+ unsigned char *p = op(OP_ALLOCATE, paths[fd], 16);
+ put64(p, (uint64_t)offset), put64(p + 8, (uint64_t)length);
+ }
+ pthread_mutex_unlock(&lock);
+ return rc;
+}
+
+int renameat(int from_dir, const char *from, int to_dir, const char *to) {
+ pthread_mutex_lock(&lock);
+ char *a = under(from_dir, from), *b = under(to_dir, to);
+ int rc = real_renameat(from_dir, from, to_dir, to);
+ if (!rc && (a || b)) {
+ if (!a || !b) stop("a rename into or out of the store", a ? a : b);
+ unsigned r = 0;
+ while (r < renamed_names && strcmp(renamed[r], b)) ++r;
+ if (r == renamed_names && r < 32) snprintf(renamed[renamed_names++], sizeof(renamed[0]), "%s", b);
+ if (r < 32) ++renamed_count[r];
+ unsigned char *p = op(OP_RENAME, a, 2 + strlen(b));
+ put16(p, (uint16_t)strlen(b));
+ memcpy(p + 2, b, strlen(b));
+ }
+ free(a), free(b);
+ pthread_mutex_unlock(&lock);
+ return rc;
+}
+
+int unlinkat(int dirfd, const char *path, int flags) {
+ pthread_mutex_lock(&lock);
+ char *relative = under(dirfd, path);
+ int rc = real_unlinkat(dirfd, path, flags);
+ if (!rc && relative) put32(op(OP_UNLINK, relative, 4), (uint32_t)flags);
+ free(relative);
+ pthread_mutex_unlock(&lock);
+ return rc;
+}
+
+int mkdir(const char *path, mode_t mode) {
+ pthread_mutex_lock(&lock);
+ char *relative = under(AT_FDCWD, path);
+ int rc = real_mkdir(path, mode);
+ if (!rc && relative) put32(op(OP_MKDIR, relative, 4), (uint32_t)mode);
+ free(relative);
+ pthread_mutex_unlock(&lock);
+ return rc;
+}
+
+static int synced(int fd, int (*real)(int)) {
+ pthread_mutex_lock(&lock);
+ bool due = false;
+ if (fd >= 0 && fd < FDS && paths[fd]) cut(paths[fd]), due = true;
+ int rc = real(fd);
+ if (due) pause_if_due();
+ pthread_mutex_unlock(&lock);
+ return rc;
+}
+int fsync(int fd) { return synced(fd, real_fsync); }
+int fdatasync(int fd) { return synced(fd, real_fdatasync); }
+
+void *mmap(void *at, size_t size, int protection, int flags, int fd, off_t offset) {
+ if (fd >= 0 && fd < FDS && paths[fd] && protection & PROT_WRITE && flags & MAP_SHARED) stop("a shared writable mapping", paths[fd]);
+ return real_mmap(at, size, protection, flags, fd, offset);
+}
+
+int fcntl(int fd, int command, ...) {
+ va_list v;
+ va_start(v, command);
+ void *argument = va_arg(v, void *);
+ va_end(v);
+ if (fd >= 0 && fd < FDS && paths[fd] && (command == F_DUPFD || command == F_DUPFD_CLOEXEC)) stop("a duplicated descriptor", paths[fd]);
+ return real_fcntl(fd, command, argument);
+}
diff --git a/research/experiments/046-commit-replica/shipper.c b/research/experiments/046-commit-replica/shipper.c
new file mode 100644
index 0000000..57fc877
--- /dev/null
+++ b/research/experiments/046-commit-replica/shipper.c
@@ -0,0 +1,120 @@
+/* Research 046: the owner's side of the link. Takes the shim's cuts on a unix socket (u64le the cut's number, u64le
+ * its size, its ops), sends each over pure link as records of whole ops (ops.h: u8 1 on its last, the cut's number,
+ * the ops; at most RECORD bytes but for an op larger alone; SHIPPER_RECORD sets it), and answers the shim with the cut's number once the
+ * link says the follower saved its last record (pure_link_delivered): the owner's sync waits for that.
+ *
+ * shipper SOCKET pure://127.0.0.1:PORT/store KEY FOLLOWER_PUBLIC_HEX at its end, one JSON line of counts */
+#define _GNU_SOURCE
+#include "link.h"
+#include "seal.h"
+#include "ops.h"
+#include <errno.h>
+#include <pthread.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <time.h>
+#include <unistd.h>
+
+static size_t RECORD = 1 << 20; /* SHIPPER_RECORD: smaller, so a cut is several records (one torn at a kill) */
+static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t saved = PTHREAD_COND_INITIALIZER;
+
+static void notify(void *context) {
+ (void)context;
+ pthread_mutex_lock(&lock);
+ pthread_cond_broadcast(&saved);
+ pthread_mutex_unlock(&lock);
+}
+
+static bool whole_read(int fd, void *bytes, size_t size) {
+ for (unsigned char *p = bytes; size;) {
+ ssize_t n = read(fd, p, size);
+ if (n <= 0) { if (n < 0 && errno == EINTR) continue; return false; }
+ p += n, size -= (size_t)n;
+ }
+ return true;
+}
+
+int main(int argc, char **argv) {
+ if (argc != 5) { fprintf(stderr, "usage: %s SOCKET URL KEY FOLLOWER_PUBLIC_HEX\n", argv[0]); return 2; }
+ if (getenv("SHIPPER_RECORD")) RECORD = (size_t)atol(getenv("SHIPPER_RECORD"));
+ char error[256], public_hex[2 * PURE_SEAL_KEY + 1];
+ unsigned char own_public[PURE_SEAL_KEY], peer[PURE_SEAL_KEY];
+ PureSealKey *key = pure_seal_key(argv[3], public_hex, error, sizeof(error));
+ if (!key || !pure_seal_peer(public_hex, own_public) || !pure_seal_peer(argv[4], peer)) { fprintf(stderr, "shipper: %s\n", error); return 1; }
+ PureLink *link = pure_link_open(argv[2], "owner", 1, key, own_public, error, sizeof(error));
+ if (!link) { fprintf(stderr, "shipper: %s\n", error); return 1; }
+ pure_link_peer(link, peer);
+ if (!pure_link_start(link, notify, NULL, error, sizeof(error))) { fprintf(stderr, "shipper: %s\n", error); return 1; }
+ struct sockaddr_un address = {.sun_family = AF_UNIX};
+ if (strlen(argv[1]) >= sizeof(address.sun_path)) return 1;
+ strcpy(address.sun_path, argv[1]);
+ unlink(argv[1]);
+ int listening = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (listening < 0 || bind(listening, (struct sockaddr *)&address, sizeof(address)) || listen(listening, 1)) {
+ perror("shipper: socket");
+ return 1;
+ }
+ printf("{\"ready\":true}\n");
+ fflush(stdout);
+ int shim = accept(listening, NULL, NULL);
+ if (shim < 0) return 1;
+ uint64_t seq = 0, cuts = 0, bytes = 0, records = 0, waited_ns = 0;
+ unsigned char *cut = NULL, *record = malloc(RECORD + 64);
+ size_t room = 0;
+ for (;;) {
+ unsigned char head[16];
+ if (!whole_read(shim, head, sizeof(head))) break; /* the owner ended (or was killed) */
+ uint64_t number = get64(head), size = get64(head + 8);
+ if (size > room && !(cut = realloc(cut, room = size))) return 1;
+ if (!whole_read(shim, cut, size)) break;
+ /* whole ops into records */
+ for (size_t at = 0; at < size;) {
+ size_t length = 9;
+ size_t end = at;
+ while (end < size) {
+ size_t n = op_size(cut + end, size - end);
+ if (!n) { fprintf(stderr, "shipper: a torn op in cut %llu\n", (unsigned long long)number); return 1; }
+ if (end > at && length + n > RECORD) break;
+ length += n, end += n;
+ }
+ unsigned char *r = length <= RECORD + 64 ? record : malloc(length);
+ r[0] = end == size;
+ put64(r + 1, number);
+ memcpy(r + 9, cut + at, end - at);
+ if (!pure_link_queue(link, ++seq, r, length)) { fprintf(stderr, "shipper: not queued\n"); return 1; }
+ if (r != record) free(r);
+ ++records, bytes += length;
+ at = end;
+ }
+ struct timespec a, b;
+ clock_gettime(CLOCK_MONOTONIC, &a);
+ pure_link_push(link);
+ pthread_mutex_lock(&lock);
+ while (pure_link_delivered(link) < seq) {
+ struct timespec until;
+ clock_gettime(CLOCK_REALTIME, &until);
+ until.tv_nsec += 10 * 1000000;
+ if (until.tv_nsec >= 1000000000) until.tv_sec += 1, until.tv_nsec -= 1000000000;
+ pthread_cond_timedwait(&saved, &lock, &until);
+ }
+ pthread_mutex_unlock(&lock);
+ clock_gettime(CLOCK_MONOTONIC, &b);
+ waited_ns += (uint64_t)((b.tv_sec - a.tv_sec) * 1000000000LL + (b.tv_nsec - a.tv_nsec));
+ ++cuts;
+ unsigned char ack[8];
+ put64(ack, number);
+ if (write(shim, ack, sizeof(ack)) != sizeof(ack)) break;
+ }
+ PureLinkCounts counts;
+ pure_link_counts(link, &counts);
+ printf("{\"cuts\":%llu,\"records\":%llu,\"record_bytes\":%llu,\"waited_ms\":%.1f,\"packets\":%llu,\"resent\":%llu}\n",
+ (unsigned long long)cuts, (unsigned long long)records, (unsigned long long)bytes, waited_ns / 1e6,
+ (unsigned long long)counts.packets, (unsigned long long)counts.resent);
+ pure_link_close(link);
+ pure_seal_key_free(key);
+ return 0;
+}