diff options
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; +} |
