)]}'
{"id":"depot~9329","triplet_id":"depot~canon~Ia0501b606e32c852d0108de9c9016b21c94a3c05","project":"depot","branch":"canon","attention_set":{},"removed_from_attention_set":{"1000066":{"account":{"_account_id":1000066,"name":"Adam Joseph","display_name":"amjoseph","email":"adam@westernsemico.com","username":"amjoseph"},"last_update":"2023-09-18 10:33:30.000000000","reason":"Change was submitted"},"1000001":{"account":{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},"last_update":"2023-09-18 10:33:30.000000000","reason":"Change was submitted"},"1000085":{"account":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"last_update":"2023-09-18 10:33:30.000000000","reason":"Change was submitted"},"1000036":{"account":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"last_update":"2023-09-17 19:37:26.000000000","reason":"\u003cGERRIT_ACCOUNT_1000036\u003e replied on the change","reason_account":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"}},"1000073":{"account":{"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},"last_update":"2023-09-18 10:33:30.000000000","reason":"Change was submitted"}},"hashtags":[],"change_id":"Ia0501b606e32c852d0108de9c9016b21c94a3c05","subject":"refactor(tvix/store/blobsvc): make BlobStore async","status":"MERGED","created":"2023-09-14 22:25:21.000000000","updated":"2023-09-18 10:33:30.000000000","submitted":"2023-09-18 10:33:30.000000000","submitter":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"total_comment_count":50,"unresolved_comment_count":0,"has_review_started":true,"submission_id":"9351","meta_rev_id":"948f946e748498fcfb924566cb0f035ce6b60283","_number":9329,"virtual_id_number":9329,"owner":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"actions":{},"labels":{"Code-Review":{"approved":{"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},"all":[{"tag":"autogenerated:gerrit:merged","value":1,"date":"2023-09-18 10:33:30.000000000","permitted_voting_range":{"min":1,"max":1},"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},{"value":0,"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},{"tag":"autogenerated:gerrit:merged","value":2,"date":"2023-09-18 10:33:30.000000000","_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},{"value":0,"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}],"values":{"-2":"This shall not be merged","-1":"I would prefer this is not merged as is"," 0":"No score","+1":"Looks good to me, but someone else must approve","+2":"Looks good to me, approved"},"description":"","default_value":0},"Verified":{"approved":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"all":[{"value":0,"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},{"value":0,"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},{"value":0,"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},{"tag":"autogenerated:gerrit:merged","value":1,"date":"2023-09-18 10:33:30.000000000","permitted_voting_range":{"min":1,"max":1},"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}],"values":{"-1":"Fails"," 0":"No score","+1":"Verified"},"description":"","default_value":0},"Autosubmit":{"all":[{"value":0,"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},{"value":0,"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},{"value":0,"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},{"value":0,"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}],"values":{" 0":"Submit manually","+1":"Submit automatically"},"description":"","default_value":0,"optional":true},"All-Comments-Resolved":{"approved":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"all":[{"value":0,"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},{"value":0,"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},{"value":0,"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},{"value":0,"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}]},"Conformant-Commit-Message":{"approved":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"all":[{"value":0,"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},{"value":0,"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},{"value":0,"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},{"value":0,"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}]}},"removable_reviewers":[{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"}],"reviewers":{"CC":[{"_account_id":1000066,"name":"Adam Joseph","display_name":"amjoseph","email":"adam@westernsemico.com","username":"amjoseph"}],"REVIEWER":[{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},{"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2023-09-14 22:25:21.000000000","updated_by":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"reviewer":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"state":"REVIEWER"},{"updated":"2023-09-14 22:25:21.000000000","updated_by":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"reviewer":{"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},"state":"REVIEWER"},{"updated":"2023-09-14 22:25:21.000000000","updated_by":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"reviewer":{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},"state":"REVIEWER"},{"updated":"2023-09-14 22:25:22.000000000","updated_by":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"reviewer":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"state":"CC"},{"updated":"2023-09-14 22:30:58.000000000","updated_by":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"reviewer":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"state":"REVIEWER"},{"updated":"2023-09-15 09:25:10.000000000","updated_by":{"_account_id":1000066,"name":"Adam Joseph","display_name":"amjoseph","email":"adam@westernsemico.com","username":"amjoseph"},"reviewer":{"_account_id":1000066,"name":"Adam Joseph","display_name":"amjoseph","email":"adam@westernsemico.com","username":"amjoseph"},"state":"CC"}],"messages":[{"id":"e5c25d4ad0a77ed6edea60f927c6e2cb326b44bf","tag":"autogenerated:gerrit:newWipPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-14 22:25:21.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"5b8d3edfc8509d8042f138ef574b00d75985f320","tag":"autogenerated:gerrit:code-owners:addReviewer","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-14 22:25:21.000000000","message":"\u003cGERRIT_ACCOUNT_1000001\u003e, who was added as reviewer owns the following files:\n* tvix/Cargo.lock\n* tvix/Cargo.nix\n* tvix/cli/Cargo.toml\n* tvix/cli/src/main.rs\n* tvix/cli/src/tvix_store_io.rs\n* tvix/store/Cargo.toml\n* tvix/store/src/bin/tvix-store.rs\n* tvix/store/src/blobservice/dumb_seeker.rs\n* tvix/store/src/blobservice/grpc.rs\n* tvix/store/src/blobservice/memory.rs\n* tvix/store/src/blobservice/mod.rs\n* tvix/store/src/blobservice/sled.rs\n* tvix/store/src/blobservice/tests.rs\n* tvix/store/src/directoryservice/mod.rs\n* tvix/store/src/fuse/mod.rs\n* tvix/store/src/fuse/tests.rs\n* tvix/store/src/import.rs\n* tvix/store/src/nar/renderer.rs\n* tvix/store/src/proto/grpc_blobservice_wrapper.rs\n* tvix/store/src/proto/mod.rs\n* tvix/store/src/proto/sync_read_into_async_read.rs\n* tvix/store/src/tests/import.rs\n* tvix/store/src/tests/nar_renderer.rs\n","accounts_in_message":[{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"}],"_revision_number":1},{"id":"50fe74163440a5e03c020931f04dd45fa23527c0","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-14 22:25:22.000000000","message":"Patch Set 1:\n\nStarted build for patchset #1 on: https://buildkite.com/tvl/depot/builds/26469","accounts_in_message":[],"_revision_number":1},{"id":"e5357551d7ea7bbd06e13c9af71f123bebe1501d","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-14 22:30:58.000000000","message":"Patch Set 1: Verified+1\n\nBuild of patchset 1 passed: https://buildkite.com/tvl/depot/builds/26469","accounts_in_message":[],"_revision_number":1},{"id":"73f725a19fe0d229b6b756772c56eb48af5f3e3a","tag":"autogenerated:gerrit:setReadyForReview","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 08:55:12.000000000","message":"Set Ready For Review","accounts_in_message":[],"_revision_number":1},{"id":"3e9a07e1c1951adc9866769f9df7a747a9a88aea","author":{"_account_id":1000066,"name":"Adam Joseph","display_name":"amjoseph","email":"adam@westernsemico.com","username":"amjoseph"},"date":"2023-09-15 09:25:10.000000000","message":"Patch Set 1:\n\n(2 comments)","accounts_in_message":[],"_revision_number":1},{"id":"0bb4324458724276f91d16aca7e4addb179fbb1e","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 09:46:10.000000000","message":"Patch Set 1:\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"af48519974fa365b8bd7f3d7236f0ee58662c1c1","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 09:46:48.000000000","message":"Patch Set 1:\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"9b2130c03135ac8e1856861e3de643eca0cacdfe","author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"date":"2023-09-15 11:26:41.000000000","message":"Patch Set 1:\n\n(3 comments)","accounts_in_message":[],"_revision_number":1},{"id":"8c23dce61d3dc564611261a09b8933ef2dc8fdd9","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 11:31:40.000000000","message":"Patch Set 1:\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"fd72157a2a0ea824b240bd265d81ed3b758ee140","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 12:05:10.000000000","message":"Patch Set 1:\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"ff96ebea1bd9e02f4ec01f3ed2176d49354f1539","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 12:07:45.000000000","message":"Patch Set 1:\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"63faf94d6be3ea1bacb41a7f545d8c839efc93ec","author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"date":"2023-09-15 12:43:17.000000000","message":"Patch Set 1:\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"0ccd65be19997901aba7ad5dd8ab9ba64d2a1f26","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 12:53:16.000000000","message":"Uploaded patch set 2.\n\nOutdated Votes:\n* Verified+1 (copy condition: \"(is:ANY AND changekind:NO_CODE_CHANGE) OR changekind:NO_CHANGE\")\n","accounts_in_message":[],"_revision_number":2},{"id":"51e8760bc334f9d0888dc0866218c20184bc9624","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 12:53:17.000000000","message":"Patch Set 2:\n\nStarted build for patchset #2 on: https://buildkite.com/tvl/depot/builds/26495","accounts_in_message":[],"_revision_number":2},{"id":"af974f67404a6fb4e4f28dd2fffd5d68d3dacaa5","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 12:54:11.000000000","message":"Patch Set 2: Verified-1\n\nBuild of patchset 2 failed: https://buildkite.com/tvl/depot/builds/26495","accounts_in_message":[],"_revision_number":2},{"id":"bf6ee2c1663d0db63ffc5759d7ca65b6703fcf6c","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 12:57:26.000000000","message":"Uploaded patch set 3.\n\nOutdated Votes:\n* Verified-1 (copy condition: \"(is:ANY AND changekind:NO_CODE_CHANGE) OR changekind:NO_CHANGE\")\n","accounts_in_message":[],"_revision_number":3},{"id":"a9ca6400b77f0bab08e1b4e93ddec15f66ffd9fc","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 12:57:26.000000000","message":"Patch Set 3:\n\n(2 comments)","accounts_in_message":[],"_revision_number":3},{"id":"dd283196da8b747574164e943660303acabdec31","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 12:57:27.000000000","message":"Patch Set 3:\n\nStarted build for patchset #3 on: https://buildkite.com/tvl/depot/builds/26499","accounts_in_message":[],"_revision_number":3},{"id":"f19834ae1397a5502c0549d96ebc94acf70aa16e","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 12:58:15.000000000","message":"Patch Set 3: Verified-1\n\nBuild of patchset 3 failed: https://buildkite.com/tvl/depot/builds/26499","accounts_in_message":[],"_revision_number":3},{"id":"a815052f9a3a517bc288fc019ebd4deb319f99f4","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 12:58:57.000000000","message":"Uploaded patch set 4: Patch Set 3 was rebased.\n\nOutdated Votes:\n* Verified-1 (copy condition: \"(is:ANY AND changekind:NO_CODE_CHANGE) OR changekind:NO_CHANGE\")\n","accounts_in_message":[],"_revision_number":4},{"id":"f408a0eb1e507f4b3e1712b6a7772c6ae0f61f04","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 12:58:58.000000000","message":"Patch Set 4:\n\nStarted build for patchset #4 on: https://buildkite.com/tvl/depot/builds/26501","accounts_in_message":[],"_revision_number":4},{"id":"87f8a4b8625fdde9d64b138aa5d38514e1d5a251","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 12:59:39.000000000","message":"Patch Set 4: Verified-1\n\nBuild of patchset 4 failed: https://buildkite.com/tvl/depot/builds/26501","accounts_in_message":[],"_revision_number":4},{"id":"0b8a6ba1d3d0305dd1dd332e689184c974b36f1c","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 13:00:56.000000000","message":"Uploaded patch set 5: Patch Set 4 was rebased.\n\nOutdated Votes:\n* Verified-1 (copy condition: \"(is:ANY AND changekind:NO_CODE_CHANGE) OR changekind:NO_CHANGE\")\n","accounts_in_message":[],"_revision_number":5},{"id":"b825846d58665290aa1de301dae184d284b72092","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 13:00:57.000000000","message":"Patch Set 5:\n\nStarted build for patchset #5 on: https://buildkite.com/tvl/depot/builds/26503","accounts_in_message":[],"_revision_number":5},{"id":"1cb8e12e889e490812606548da88d1ca9c04de60","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 13:05:03.000000000","message":"Patch Set 5: Verified-1\n\nBuild of patchset 5 failed: https://buildkite.com/tvl/depot/builds/26503","accounts_in_message":[],"_revision_number":5},{"id":"65ffec7aa0774b1d02f9f4c1c101e4e4288cff78","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 13:06:37.000000000","message":"Uploaded patch set 6: Patch Set 5 was rebased.\n\nOutdated Votes:\n* Verified-1 (copy condition: \"(is:ANY AND changekind:NO_CODE_CHANGE) OR changekind:NO_CHANGE\")\n","accounts_in_message":[],"_revision_number":6},{"id":"e0c0006a1c11030336f25e9a1e86327c98256cd4","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 13:06:39.000000000","message":"Patch Set 6:\n\nStarted build for patchset #6 on: https://buildkite.com/tvl/depot/builds/26505","accounts_in_message":[],"_revision_number":6},{"id":"d9e56a87e87a7a2d80a4b7579d3df81b72158fe9","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 13:19:20.000000000","message":"Patch Set 6: Verified+1\n\nBuild of patchset 6 passed: https://buildkite.com/tvl/depot/builds/26505","accounts_in_message":[],"_revision_number":6},{"id":"6f7b0d4088260f3f84912aa50ccedc96162c4178","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 14:28:06.000000000","message":"Uploaded patch set 7.\n\nOutdated Votes:\n* Verified+1 (copy condition: \"(is:ANY AND changekind:NO_CODE_CHANGE) OR changekind:NO_CHANGE\")\n","accounts_in_message":[],"_revision_number":7},{"id":"f0a4fc24e3cf194aa823bc8b0ddd1e74acd33979","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 14:28:07.000000000","message":"Patch Set 7:\n\nStarted build for patchset #7 on: https://buildkite.com/tvl/depot/builds/26506","accounts_in_message":[],"_revision_number":7},{"id":"88002943d0bbaad4b362a19122aaa0d5a79f0765","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 14:39:46.000000000","message":"Patch Set 7: Verified+1\n\nBuild of patchset 7 passed: https://buildkite.com/tvl/depot/builds/26506","accounts_in_message":[],"_revision_number":7},{"id":"2035f3db0966394964a05be9da9c562aac22ac95","author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"date":"2023-09-15 18:40:13.000000000","message":"Patch Set 7:\n\n(1 comment)","accounts_in_message":[],"_revision_number":7},{"id":"63d1f6fa52001d039917894f9c57eb253b779cd0","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 18:58:07.000000000","message":"Patch Set 7:\n\n(1 comment)","accounts_in_message":[],"_revision_number":7},{"id":"e3c5066d689dc449bb600d7d8eedce3b7d1c7260","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 19:38:49.000000000","message":"Patch Set 8: Patch Set 7 was rebased\n\nOutdated Votes:\n* Verified+1 (copy condition: \"(is:ANY AND changekind:NO_CODE_CHANGE) OR changekind:NO_CHANGE\")\n","accounts_in_message":[],"_revision_number":8},{"id":"9c635ee1126ff7b29f153212d0a8e36629f5d924","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 19:38:50.000000000","message":"Patch Set 8:\n\nStarted build for patchset #8 on: https://buildkite.com/tvl/depot/builds/26512","accounts_in_message":[],"_revision_number":8},{"id":"c0b62e0f68aaabece95739e172aaced1651736e6","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 19:45:50.000000000","message":"Patch Set 8: Verified+1\n\nBuild of patchset 8 passed: https://buildkite.com/tvl/depot/builds/26512","accounts_in_message":[],"_revision_number":8},{"id":"aa897b09895a3e23e68b7c6da162f0f39fbd3ea0","author":{"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},"date":"2023-09-15 20:11:00.000000000","message":"Patch Set 8: Code-Review+2\n\n(7 comments)","accounts_in_message":[],"_revision_number":8},{"id":"8386c82edfcc00426baa2a2bf00a6850cb848ed0","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 21:00:44.000000000","message":"Uploaded patch set 9.\n\nOutdated Votes:\n* Code-Review+2 (copy condition: \"((is:ANY AND has:unchanged-files) OR is:MIN) OR changekind:NO_CHANGE\")\n* Verified+1 (copy condition: \"(is:ANY AND changekind:NO_CODE_CHANGE) OR changekind:NO_CHANGE\")\n","accounts_in_message":[],"_revision_number":9},{"id":"1a67f12975bcb909fb6a3d969813bdadfd86e087","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 21:00:44.000000000","message":"Patch Set 9:\n\n(6 comments)","accounts_in_message":[],"_revision_number":9},{"id":"3d8aaadf22b93f6f2221111f2cf22329e7fc7e94","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 21:00:45.000000000","message":"Patch Set 9:\n\nStarted build for patchset #9 on: https://buildkite.com/tvl/depot/builds/26515","accounts_in_message":[],"_revision_number":9},{"id":"01b33ed0fb87911d3d7e4e057a7ecfe3fb468de1","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 21:01:07.000000000","message":"Uploaded patch set 10: New patch set was added with same tree, parent tree, and commit message as Patch Set 9.","accounts_in_message":[],"_revision_number":10},{"id":"ee72a8632ec517d3edb783547e99bda97452f09f","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-15 21:05:20.000000000","message":"Patch Set 9: Verified+1\n\nBuild of patchset 9 passed: https://buildkite.com/tvl/depot/builds/26515","accounts_in_message":[],"_revision_number":9},{"id":"b8c71544b08888932d619b42a245925543c46091","author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"date":"2023-09-15 21:06:45.000000000","message":"Patch Set 10: Code-Review+1\n\n(1 comment)","accounts_in_message":[],"_revision_number":10},{"id":"21b2625894670b53c89509163e9c2468f96b1349","author":{"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},"date":"2023-09-15 21:09:17.000000000","message":"Patch Set 10:\n\n(1 comment)","accounts_in_message":[],"_revision_number":10},{"id":"984326b6aaf3f88c4ce64598f4eed6f494ed653c","author":{"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},"date":"2023-09-15 21:10:17.000000000","message":"Patch Set 10: Code-Review+2\n\n(1 comment)","accounts_in_message":[],"_revision_number":10},{"id":"13772cfc5b20fc6e522f4dc291c0e5a9467e2a65","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-15 21:27:01.000000000","message":"Patch Set 10:\n\n(3 comments)","accounts_in_message":[],"_revision_number":10},{"id":"a694ab66008684f01f9835af36241490f67c180c","author":{"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},"date":"2023-09-16 14:59:21.000000000","message":"Patch Set 10:\n\n(1 comment)","accounts_in_message":[],"_revision_number":10},{"id":"81e4949101b181aa9967126e00d80ab7a44b0942","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-17 11:38:11.000000000","message":"Uploaded patch set 11: Patch Set 10 was rebased.\n\nCopied Votes:\n* Code-Review+1, Code-Review+2 (copy condition: \"((is:ANY AND has:unchanged-files) OR is:MIN) OR changekind:NO_CHANGE\")\n\nOutdated Votes:\n* Verified+1 (copy condition: \"(is:ANY AND changekind:NO_CODE_CHANGE) OR changekind:NO_CHANGE\")\n","accounts_in_message":[],"_revision_number":11},{"id":"6b23bef6b3d78801220a72719707ea5024df67ff","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-17 11:38:12.000000000","message":"Patch Set 11:\n\nStarted build for patchset #11 on: https://buildkite.com/tvl/depot/builds/26532","accounts_in_message":[],"_revision_number":11},{"id":"e52156b7a2c9559d4c5e80b26e92c41c00d7f933","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-17 11:41:16.000000000","message":"Patch Set 11: Verified+1\n\nBuild of patchset 11 passed: https://buildkite.com/tvl/depot/builds/26532","accounts_in_message":[],"_revision_number":11},{"id":"2a7f110118314179e653662afaf991ad4f68d7a0","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-17 12:36:34.000000000","message":"Uploaded patch set 12: Patch Set 11 was rebased.\n\nCopied Votes:\n* Code-Review+1, Code-Review+2 (copy condition: \"((is:ANY AND has:unchanged-files) OR is:MIN) OR changekind:NO_CHANGE\")\n\nOutdated Votes:\n* Verified+1 (copy condition: \"(is:ANY AND changekind:NO_CODE_CHANGE) OR changekind:NO_CHANGE\")\n","accounts_in_message":[],"_revision_number":12},{"id":"06cbda7eeefd5b5a26b7a76e5fcdc1475de1fe1b","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-17 12:36:36.000000000","message":"Patch Set 12:\n\nStarted build for patchset #12 on: https://buildkite.com/tvl/depot/builds/26542","accounts_in_message":[],"_revision_number":12},{"id":"90014a756575c71273763aebe6f799837613721b","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-17 12:40:54.000000000","message":"Patch Set 12: Verified+1\n\nBuild of patchset 12 passed: https://buildkite.com/tvl/depot/builds/26542","accounts_in_message":[],"_revision_number":12},{"id":"a36ad24beb6aee3edcd80591b10b044751c4d533","author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"date":"2023-09-17 12:50:18.000000000","message":"Patch Set 12: Code-Review+1\n\n(1 comment)","accounts_in_message":[],"_revision_number":12},{"id":"89a9eff19ab6f0f2489b4955d1436f4407c698d7","author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"date":"2023-09-17 12:58:36.000000000","message":"Patch Set 12:\n\n(1 comment)","accounts_in_message":[],"_revision_number":12},{"id":"3d0aa3896ccc84f9e9c2b61fba581358732c9893","author":{"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"},"date":"2023-09-17 13:19:54.000000000","message":"Patch Set 12: Code-Review+2\n\n(4 comments)","accounts_in_message":[],"_revision_number":12},{"id":"16950a164f4ab1cdba54616bfcb76fa332b6c375","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-17 15:01:40.000000000","message":"Uploaded patch set 13.\n\nCopied Votes:\n* Code-Review+1, Code-Review+2 (copy condition: \"((is:ANY AND has:unchanged-files) OR is:MIN) OR changekind:NO_CHANGE\")\n\nOutdated Votes:\n* Verified+1 (copy condition: \"(is:ANY AND changekind:NO_CODE_CHANGE) OR changekind:NO_CHANGE\")\n","accounts_in_message":[],"_revision_number":13},{"id":"54e1953d44a9528ea50e2bd77f6f39295be4751f","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-17 15:01:40.000000000","message":"Patch Set 13:\n\n(3 comments)","accounts_in_message":[],"_revision_number":13},{"id":"eeeddc18931055a64964a9a7eebc3e3ceecbd76e","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-17 15:01:42.000000000","message":"Patch Set 13:\n\nStarted build for patchset #13 on: https://buildkite.com/tvl/depot/builds/26556","accounts_in_message":[],"_revision_number":13},{"id":"14eca748a08648fe066e18d92df734b9d2e2c73f","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-17 15:03:39.000000000","message":"Patch Set 13:\n\n(1 comment)","accounts_in_message":[],"_revision_number":13},{"id":"87ecff085edc0028be41a0271bf1ea653ef0fd3b","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-17 15:30:54.000000000","message":"Patch Set 13: Verified-1\n\nBuild of patchset 13 failed: https://buildkite.com/tvl/depot/builds/26556","accounts_in_message":[],"_revision_number":13},{"id":"fef077d62a28d234e1c3fe7fc372ca7b04b80e89","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-17 19:33:21.000000000","message":"Uploaded patch set 14.\n\nCopied Votes:\n* Code-Review+1, Code-Review+2 (copy condition: \"((is:ANY AND has:unchanged-files) OR is:MIN) OR changekind:NO_CHANGE\")\n\nOutdated Votes:\n* Verified-1 (copy condition: \"(is:ANY AND changekind:NO_CODE_CHANGE) OR changekind:NO_CHANGE\")\n","accounts_in_message":[],"_revision_number":14},{"id":"006877c5cbfb4eee823da04b529ddede5cfaa3e2","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-17 19:33:22.000000000","message":"Patch Set 14:\n\nStarted build for patchset #14 on: https://buildkite.com/tvl/depot/builds/26570","accounts_in_message":[],"_revision_number":14},{"id":"4666d000f7611a4284918553d93c6a529ce9b1d5","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-17 19:36:00.000000000","message":"Patch Set 14: Verified+1\n\nBuild of patchset 14 passed: https://buildkite.com/tvl/depot/builds/26570","accounts_in_message":[],"_revision_number":14},{"id":"d43138ebbf3bc0d139278f3b0b2e34f0650f8fd0","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-17 19:37:26.000000000","message":"Patch Set 14:\n\n(3 comments)","accounts_in_message":[],"_revision_number":14},{"id":"9a02a6266c8782a5e0d26bf7b323105f9deb4cf4","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-18 10:23:47.000000000","message":"Uploaded patch set 15.\n\nCopied Votes:\n* Code-Review+1, Code-Review+2 (copy condition: \"((is:ANY AND has:unchanged-files) OR is:MIN) OR changekind:NO_CHANGE\")\n\nOutdated Votes:\n* Verified+1 (copy condition: \"(is:ANY AND changekind:NO_CODE_CHANGE) OR changekind:NO_CHANGE\")\n","accounts_in_message":[],"_revision_number":15},{"id":"f357184335815b19806b19b94d065eba6cce0bce","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-18 10:23:47.000000000","message":"Patch Set 15:\n\n(2 comments)","accounts_in_message":[],"_revision_number":15},{"id":"7eb28febc06ca5cea01861b36d1420a786e05eee","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-18 10:23:48.000000000","message":"Patch Set 15:\n\nStarted build for patchset #15 on: https://buildkite.com/tvl/depot/builds/26580","accounts_in_message":[],"_revision_number":15},{"id":"1e32c5b89208a2327a435f5bdfad9a8a0c68ca23","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2023-09-18 10:28:19.000000000","message":"Patch Set 15: Verified+1\n\nBuild of patchset 15 passed: https://buildkite.com/tvl/depot/builds/26580","accounts_in_message":[],"_revision_number":15},{"id":"948f946e748498fcfb924566cb0f035ce6b60283","tag":"autogenerated:gerrit:merged","author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"date":"2023-09-18 10:33:30.000000000","message":"Change has been successfully rebased and submitted as da6cbb4a459d02111c44a67d3d0dd7e654abff23\n\n12 is the latest approved patch-set.\nThe change was submitted with unreviewed changes in the following files:\n\n```\nThe name of the file: tvix/store/src/blobservice/memory.rs\nInsertions: 1, Deletions: 1.\n\n@@ -108,7 +108,7 @@\n         self: std::pin::Pin\u003c\u0026mut Self\u003e,\n         _cx: \u0026mut std::task::Context\u003c\u0027_\u003e,\n     ) -\u003e std::task::Poll\u003cResult\u003c(), io::Error\u003e\u003e {\n-        // shutdown is \"instantaneous\"\n+        // shutdown is \"instantaneous\", we only write to memory.\n         Poll::Ready(Ok(()))\n     }\n }\n```\n```\nThe name of the file: tvix/store/src/blobservice/grpc.rs\nInsertions: 2, Deletions: 0.\n\n@@ -273,6 +273,8 @@\n         self: std::pin::Pin\u003c\u0026mut Self\u003e,\n         _cx: \u0026mut std::task::Context\u003c\u0027_\u003e,\n     ) -\u003e std::task::Poll\u003cResult\u003c(), io::Error\u003e\u003e {\n+        // TODO(raitobezarius): this might not be a graceful shutdown of the\n+        // channel inside the gRPC connection.\n         Poll::Ready(Ok(()))\n     }\n }\n```\n```\nThe name of the file: tvix/store/src/blobservice/naive_seeker.rs\nInsertions: 125, Deletions: 30.\n\n@@ -9,6 +9,53 @@\n     /// This implements [tokio::io::AsyncSeek] for and [tokio::io::AsyncRead] by\n     /// simply skipping over some bytes, keeping track of the position.\n     /// It fails whenever you try to seek backwards.\n+    ///\n+    /// ## Pinning concerns:\n+    ///\n+    /// [NaiveSeeker] is itself pinned by callers, and we do not need to concern\n+    /// ourselves regarding that.\n+    ///\n+    /// Though, its fields as per\n+    /// \u003chttps://doc.rust-lang.org/std/pin/#pinning-is-not-structural-for-field\u003e\n+    /// can be pinned or unpinned.\n+    ///\n+    /// So we need to go over each field and choose our policy carefully.\n+    ///\n+    /// The obvious cases are the bookkeeping integers we keep in the structure,\n+    /// those are private and not shared to anyone, we never build a\n+    /// `Pin\u003c\u0026mut X\u003e` out of them at any point, therefore, we can safely never\n+    /// mark them as pinned. Of course, it is expected that no developer here\n+    /// attempt to `pin!(self.pos)` to pin them because it makes no sense. If\n+    /// they have to become pinned, they should be marked `#[pin]` and we need\n+    /// to discuss it.\n+    ///\n+    /// So the bookkeeping integers are in the right state with respect to their\n+    /// pinning status. The projection should offer direct access.\n+    ///\n+    /// On the `r` field, i.e. a `BufReader\u003cR\u003e`, given that\n+    /// \u003chttps://docs.rs/tokio/latest/tokio/io/struct.BufReader.html#impl-Unpin-for-BufReader%3CR%3E\u003e\n+    /// is available, even a `Pin\u003c\u0026mut BufReader\u003cR\u003e\u003e` can be safely moved.\n+    ///\n+    /// The only care we should have regards the internal reader itself, i.e.\n+    /// the `R` instance, see that Tokio decided to `#[pin]` it too:\n+    /// \u003chttps://docs.rs/tokio/latest/src/tokio/io/util/buf_reader.rs.html#29\u003e\n+    ///\n+    /// In general, there\u0027s no `Unpin` instance for `R: tokio::io::AsyncRead`\n+    /// (see \u003chttps://docs.rs/tokio/latest/tokio/io/trait.AsyncRead.html\u003e).\n+    ///\n+    /// Therefore, we could keep it unpinned and pin it in every call site\n+    /// whenever we need to call `poll_*` which can be confusing to the non-\n+    /// expert developer and we have a fair share amount of situations where the\n+    /// [BufReader] instance is naked, i.e. in its `\u0026mut BufReader\u003cR\u003e`\n+    /// form, this is annoying because it could lead to expose the naked `R`\n+    /// internal instance somehow and would produce a risk of making it move\n+    /// unexpectedly.\n+    ///\n+    /// We choose the path of the least resistance as we have no reason to have\n+    /// access to the raw `BufReader\u003cR\u003e` instance, we just `#[pin]` it too and\n+    /// enjoy its `poll_*` safe APIs and push the unpinning concerns to the\n+    /// internal implementations themselves, which studied the question longer\n+    /// than us.\n     pub struct NaiveSeeker\u003cR: tokio::io::AsyncRead\u003e {\n         #[pin]\n         r: tokio::io::BufReader\u003cR\u003e,\n@@ -133,42 +180,90 @@\n         // We create a buffer that we\u0027ll discard later on.\n         let mut buf \u003d [0; 1024];\n \n-        // calculate the length we want to skip at most, which is either a max\n-        // buffer size, or the number of remaining bytes to read, whatever is\n-        // smaller.\n-        let bytes_to_skip \u003d std::cmp::min(self.bytes_to_skip as usize, buf.len());\n+        // Loop until we\u0027ve reached the desired seek position. This is done by issuing repeated\n+        // `poll_read` calls. If the data is not available yet, we will yield back to the executor\n+        // and wait to be polled again.\n+        loop {\n+            // calculate the length we want to skip at most, which is either a max\n+            // buffer size, or the number of remaining bytes to read, whatever is\n+            // smaller.\n+            let bytes_to_skip \u003d std::cmp::min(self.bytes_to_skip as usize, buf.len());\n \n-        let mut read_buf \u003d tokio::io::ReadBuf::new(\u0026mut buf[..bytes_to_skip]);\n+            let mut read_buf \u003d tokio::io::ReadBuf::new(\u0026mut buf[..bytes_to_skip]);\n \n-        match self.as_mut().poll_read(cx, \u0026mut read_buf) {\n-            Poll::Ready(_a) \u003d\u003e {\n-                let bytes_read \u003d read_buf.filled().len() as u64;\n+            match self.as_mut().poll_read(cx, \u0026mut read_buf) {\n+                Poll::Ready(_a) \u003d\u003e {\n+                    let bytes_read \u003d read_buf.filled().len() as u64;\n \n-                if bytes_read \u003d\u003d 0 {\n-                    return Poll::Ready(Err(io::Error::new(\n-                        io::ErrorKind::UnexpectedEof,\n-                        format!(\n-                        \"tried to skip {} bytes, but only was able to skip {} until reaching EOF\",\n-                            bytes_to_skip, bytes_read\n-                    ),\n-                    )));\n+                    if bytes_read \u003d\u003d 0 {\n+                        return Poll::Ready(Err(io::Error::new(\n+                            io::ErrorKind::UnexpectedEof,\n+                            format!(\n+                                \"tried to skip {} bytes, but only was able to skip {} until reaching EOF\",\n+                                bytes_to_skip, bytes_read\n+                            ),\n+                        )));\n+                    }\n+\n+                    // calculate bytes to skip\n+                    let bytes_to_skip \u003d self.bytes_to_skip - bytes_read;\n+\n+                    *self.as_mut().project().bytes_to_skip \u003d bytes_to_skip;\n+\n+                    if bytes_to_skip \u003d\u003d 0 {\n+                        return Poll::Ready(Ok(self.pos));\n+                    }\n                 }\n-\n-                // calculate bytes to skip\n-                let bytes_to_skip \u003d self.bytes_to_skip - bytes_read;\n-                let pos \u003d self.pos;\n-\n-                *self.project().bytes_to_skip \u003d bytes_to_skip;\n-\n-                if bytes_to_skip \u003d\u003d 0 {\n-                    Poll::Ready(Ok(pos))\n-                } else {\n-                    Poll::Pending\n-                }\n-            }\n-            Poll::Pending \u003d\u003e Poll::Pending,\n+                Poll::Pending \u003d\u003e return Poll::Pending,\n+            };\n         }\n     }\n }\n \n impl\u003cR: tokio::io::AsyncRead + Send + Unpin + \u0027static\u003e BlobReader for NaiveSeeker\u003cR\u003e {}\n+\n+#[cfg(test)]\n+mod tests {\n+    use super::NaiveSeeker;\n+    use std::io::{Cursor, SeekFrom};\n+    use tokio::io::{AsyncReadExt, AsyncSeekExt};\n+\n+    /// This seek requires multiple `poll_read` as we use a 1024 bytes internal\n+    /// buffer when doing the seek.\n+    /// This ensures we don\u0027t hang indefinitely.\n+    #[tokio::test]\n+    async fn seek() {\n+        let buf \u003d vec![0u8; 4096];\n+        let reader \u003d Cursor::new(\u0026buf);\n+        let mut seeker \u003d NaiveSeeker::new(reader);\n+        seeker.seek(SeekFrom::Start(4000)).await.unwrap();\n+    }\n+\n+    #[tokio::test]\n+    async fn seek_read() {\n+        let mut buf \u003d vec![0u8; 2048];\n+        buf.extend_from_slice(\u0026[1u8; 2048]);\n+        buf.extend_from_slice(\u0026[2u8; 2048]);\n+\n+        let reader \u003d Cursor::new(\u0026buf);\n+        let mut seeker \u003d NaiveSeeker::new(reader);\n+\n+        let mut read_buf \u003d vec![0u8; 1024];\n+        seeker.read_exact(\u0026mut read_buf).await.expect(\"must read\");\n+        assert_eq!(read_buf.as_slice(), \u0026[0u8; 1024]);\n+\n+        seeker\n+            .seek(SeekFrom::Current(1024))\n+            .await\n+            .expect(\"must seek\");\n+        seeker.read_exact(\u0026mut read_buf).await.expect(\"must read\");\n+        assert_eq!(read_buf.as_slice(), \u0026[1u8; 1024]);\n+\n+        seeker\n+            .seek(SeekFrom::Start(2 * 2048))\n+            .await\n+            .expect(\"must seek\");\n+        seeker.read_exact(\u0026mut read_buf).await.expect(\"must read\");\n+        assert_eq!(read_buf.as_slice(), \u0026[2u8; 1024]);\n+    }\n+}\n```\n```\nThe name of the file: tvix/store/src/blobservice/sled.rs\nInsertions: 1, Deletions: 1.\n\n@@ -137,7 +137,7 @@\n         self: std::pin::Pin\u003c\u0026mut Self\u003e,\n         _cx: \u0026mut std::task::Context\u003c\u0027_\u003e,\n     ) -\u003e std::task::Poll\u003cResult\u003c(), io::Error\u003e\u003e {\n-        // shutdown is \"instantaneous\"\n+        // shutdown is \"instantaneous\", we only write to a Vec\u003cu8\u003e as buffer.\n         Poll::Ready(Ok(()))\n     }\n }\n```\n","accounts_in_message":[],"_revision_number":16}],"current_revision_number":16,"current_revision":"da6cbb4a459d02111c44a67d3d0dd7e654abff23","revisions":{"75aeda5f1789cf84f71e4a085ad0d3863565ccf9":{"kind":"REWORK","_number":1,"created":"2023-09-14 22:25:21.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/1","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/1","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/1"}}},"commit":{"parents":[{"commit":"95ee688f0338a080b039de6e971bc91ba133a863","subject":"feat(ops/users): add totikom to users","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d95ee688f0338a080b039de6e971bc91ba133a863"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-14 22:22:11.000000000","tz":120},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which also\n   seemed to be hard to upstream.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d75aeda5f1789cf84f71e4a085ad0d3863565ccf9"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d75aeda5f1789cf84f71e4a085ad0d3863565ccf9"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"95ee688f0338a080b039de6e971bc91ba133a863","is_merged_in_target_branch":true,"change_id":"Id2577449ec0a52f8c16f13150896ec0680f02051","change_number":9325,"patch_set_number":2,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"4bf57c702f75f455b3d134989ead4d0329c115fa":{"kind":"REWORK","_number":2,"created":"2023-09-15 12:53:16.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/2","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/2","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/2"}}},"commit":{"parents":[{"commit":"a9c04371c6ba0abec20f896ecc2009aef1f2bf96","subject":"feat(tvix/store): add simple integration test","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003da9c04371c6ba0abec20f896ecc2009aef1f2bf96"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-15 12:52:19.000000000","tz":120},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which also\n   seemed to be hard to upstream.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d4bf57c702f75f455b3d134989ead4d0329c115fa"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d4bf57c702f75f455b3d134989ead4d0329c115fa"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"a9c04371c6ba0abec20f896ecc2009aef1f2bf96","is_merged_in_target_branch":false,"change_id":"I239ce5b6a07cb962b242142ab716693359b8674c","change_number":9338,"patch_set_number":1,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"574e8c56c7ac2d817f1715f65b152d9525acfb99":{"kind":"REWORK","_number":3,"created":"2023-09-15 12:57:26.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/3","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/3","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/3 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/3 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/3 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/3"}}},"commit":{"parents":[{"commit":"a9c04371c6ba0abec20f896ecc2009aef1f2bf96","subject":"feat(tvix/store): add simple integration test","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003da9c04371c6ba0abec20f896ecc2009aef1f2bf96"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-15 12:55:36.000000000","tz":120},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which also\n   seemed to be hard to upstream.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d574e8c56c7ac2d817f1715f65b152d9525acfb99"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d574e8c56c7ac2d817f1715f65b152d9525acfb99"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"a9c04371c6ba0abec20f896ecc2009aef1f2bf96","is_merged_in_target_branch":false,"change_id":"I239ce5b6a07cb962b242142ab716693359b8674c","change_number":9338,"patch_set_number":1,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"43719d782ac96db9404548f8d21e5933eb617ff0":{"kind":"TRIVIAL_REBASE","_number":4,"created":"2023-09-15 12:58:57.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/4","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/4","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/4 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/4 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/4 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/4"}}},"commit":{"parents":[{"commit":"a6ca2f7ae4db265abfb88d16172c56c3b9ab2a9c","subject":"feat(tvix/store): add simple integration test","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003da6ca2f7ae4db265abfb88d16172c56c3b9ab2a9c"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-15 12:58:35.000000000","tz":120},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which also\n   seemed to be hard to upstream.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d43719d782ac96db9404548f8d21e5933eb617ff0"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d43719d782ac96db9404548f8d21e5933eb617ff0"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"a6ca2f7ae4db265abfb88d16172c56c3b9ab2a9c","is_merged_in_target_branch":false,"change_id":"I239ce5b6a07cb962b242142ab716693359b8674c","change_number":9338,"patch_set_number":2,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"dda45531558616e6082b997f9fc8ab1c4c589c90":{"kind":"TRIVIAL_REBASE","_number":5,"created":"2023-09-15 13:00:56.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/5","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/5","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/5 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/5 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/5 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/5"}}},"commit":{"parents":[{"commit":"f26ee8cf9016cf60b1a78c8869d050fcd4227147","subject":"feat(tvix/store): add simple integration test","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003df26ee8cf9016cf60b1a78c8869d050fcd4227147"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-15 13:00:50.000000000","tz":120},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which also\n   seemed to be hard to upstream.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003ddda45531558616e6082b997f9fc8ab1c4c589c90"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003ddda45531558616e6082b997f9fc8ab1c4c589c90"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"f26ee8cf9016cf60b1a78c8869d050fcd4227147","is_merged_in_target_branch":false,"change_id":"I239ce5b6a07cb962b242142ab716693359b8674c","change_number":9338,"patch_set_number":3,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"384274e9cd907795f125e521c1876c536ba75343":{"kind":"TRIVIAL_REBASE","_number":6,"created":"2023-09-15 13:06:37.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/6","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/6","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/6 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/6 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/6 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/6"}}},"commit":{"parents":[{"commit":"30c3592528305de21e73cd8769fa0ebf1c52dfa1","subject":"feat(tvix/store): add simple integration test","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d30c3592528305de21e73cd8769fa0ebf1c52dfa1"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-15 13:06:27.000000000","tz":120},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which also\n   seemed to be hard to upstream.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d384274e9cd907795f125e521c1876c536ba75343"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d384274e9cd907795f125e521c1876c536ba75343"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"30c3592528305de21e73cd8769fa0ebf1c52dfa1","is_merged_in_target_branch":false,"change_id":"I239ce5b6a07cb962b242142ab716693359b8674c","change_number":9338,"patch_set_number":4,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"81dbd7659f43e795bb0a4758e5fb3fc306b8c5f1":{"kind":"REWORK","_number":7,"created":"2023-09-15 14:28:06.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/7","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/7","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/7 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/7 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/7 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/7"}}},"commit":{"parents":[{"commit":"30c3592528305de21e73cd8769fa0ebf1c52dfa1","subject":"feat(tvix/store): add simple integration test","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d30c3592528305de21e73cd8769fa0ebf1c52dfa1"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-15 14:23:49.000000000","tz":120},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which also\n   seemed to be hard to upstream.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d81dbd7659f43e795bb0a4758e5fb3fc306b8c5f1"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d81dbd7659f43e795bb0a4758e5fb3fc306b8c5f1"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"30c3592528305de21e73cd8769fa0ebf1c52dfa1","is_merged_in_target_branch":false,"change_id":"I239ce5b6a07cb962b242142ab716693359b8674c","change_number":9338,"patch_set_number":4,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"0f234aac3afd912eca9fb109d090470a517368e1":{"kind":"TRIVIAL_REBASE","_number":8,"created":"2023-09-15 19:38:49.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/8","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/8","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/8 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/8 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/8 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/8"}}},"commit":{"parents":[{"commit":"5c72af2159ccc3b5f101177f706d4fb2083fb0d3","subject":"feat(tvix/store): add simple integration test","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d5c72af2159ccc3b5f101177f706d4fb2083fb0d3"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"flokli","email":"flokli@flokli.de","date":"2023-09-15 19:38:49.000000000","tz":0},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which also\n   seemed to be hard to upstream.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d0f234aac3afd912eca9fb109d090470a517368e1"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d0f234aac3afd912eca9fb109d090470a517368e1"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"5c72af2159ccc3b5f101177f706d4fb2083fb0d3","is_merged_in_target_branch":false,"change_id":"I239ce5b6a07cb962b242142ab716693359b8674c","change_number":9338,"patch_set_number":5,"change_status":"MERGED"}],"branch":"refs/heads/canon","description":"Rebase"},"046a69e544f776c4e4c6033200ff7ad1f5f17fa1":{"kind":"REWORK","_number":9,"created":"2023-09-15 21:00:44.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/9","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/9","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/9 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/9 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/9 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/9"}}},"commit":{"parents":[{"commit":"8bfaf0863a425bedd9fc01517185b257050a9d88","subject":"feat(tvix/store): add simple integration test","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d8bfaf0863a425bedd9fc01517185b257050a9d88"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-15 20:59:02.000000000","tz":120},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which already\n   existed in tokio internally, but upstream ia hesitant to expose.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d046a69e544f776c4e4c6033200ff7ad1f5f17fa1"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d046a69e544f776c4e4c6033200ff7ad1f5f17fa1"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"8bfaf0863a425bedd9fc01517185b257050a9d88","is_merged_in_target_branch":false,"change_id":"I239ce5b6a07cb962b242142ab716693359b8674c","change_number":9338,"patch_set_number":6,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"8a62f05cfaefa7158284ab2f2f51c6adc77b9a01":{"kind":"NO_CHANGE","_number":10,"created":"2023-09-15 21:01:07.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/10","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/10","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/10 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/10 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/10 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/10"}}},"commit":{"parents":[{"commit":"3816eaa5e91cf2cffd4f8d04a2faf31c7f646265","subject":"feat(tvix/store): add simple integration test","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d3816eaa5e91cf2cffd4f8d04a2faf31c7f646265"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-15 21:01:03.000000000","tz":120},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which already\n   existed in tokio internally, but upstream ia hesitant to expose.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d8a62f05cfaefa7158284ab2f2f51c6adc77b9a01"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d8a62f05cfaefa7158284ab2f2f51c6adc77b9a01"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"3816eaa5e91cf2cffd4f8d04a2faf31c7f646265","is_merged_in_target_branch":true,"change_id":"I239ce5b6a07cb962b242142ab716693359b8674c","change_number":9338,"patch_set_number":7,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"304943b73cad91695d1ab7cac56d58b15152b54f":{"kind":"TRIVIAL_REBASE","_number":11,"created":"2023-09-17 11:38:11.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/11","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/11","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/11 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/11 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/11 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/11"}}},"commit":{"parents":[{"commit":"5cfda311fa26b4bb2faea9d33d15d7abb427fa2f","subject":"chore(tvix): upgrade workspace.resolver to \"2\"","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d5cfda311fa26b4bb2faea9d33d15d7abb427fa2f"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-17 11:15:48.000000000","tz":180},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which already\n   existed in tokio internally, but upstream ia hesitant to expose.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d304943b73cad91695d1ab7cac56d58b15152b54f"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d304943b73cad91695d1ab7cac56d58b15152b54f"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"5cfda311fa26b4bb2faea9d33d15d7abb427fa2f","is_merged_in_target_branch":false,"change_id":"I6056d95cd5cb793f37ef843ed43009a27ad36367","change_number":9342,"patch_set_number":2,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"8cb7ad4cc70e2307a5b33913acbb7b350361cf70":{"kind":"TRIVIAL_REBASE","_number":12,"created":"2023-09-17 12:36:34.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/12","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/12","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/12 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/12 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/12 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/12"}}},"commit":{"parents":[{"commit":"c31495ed95f4807c8754732adc47726c2423ad09","subject":"chore(tvix): upgrade workspace.resolver to \"2\"","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003dc31495ed95f4807c8754732adc47726c2423ad09"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-17 12:01:43.000000000","tz":180},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which already\n   existed in tokio internally, but upstream ia hesitant to expose.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d8cb7ad4cc70e2307a5b33913acbb7b350361cf70"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d8cb7ad4cc70e2307a5b33913acbb7b350361cf70"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"c31495ed95f4807c8754732adc47726c2423ad09","is_merged_in_target_branch":false,"change_id":"I6056d95cd5cb793f37ef843ed43009a27ad36367","change_number":9342,"patch_set_number":3,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"ccca7cfe5b09e3a5477bd30c545064fddcbe7f99":{"kind":"REWORK","_number":13,"created":"2023-09-17 15:01:40.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/13","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/13","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/13 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/13 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/13 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/13"}}},"commit":{"parents":[{"commit":"4ac6423b26170668f99ef2351091d5e1352b298a","subject":"refactor(tvix/nar-bridge): Clean up directory popping loop","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d4ac6423b26170668f99ef2351091d5e1352b298a"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-17 15:01:28.000000000","tz":180},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which already\n   existed in tokio internally, but upstream ia hesitant to expose.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003dccca7cfe5b09e3a5477bd30c545064fddcbe7f99"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003dccca7cfe5b09e3a5477bd30c545064fddcbe7f99"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"4ac6423b26170668f99ef2351091d5e1352b298a","is_merged_in_target_branch":true,"change_id":"I559e21087630b05e483f768ab59f8067961a2eae","change_number":9352,"patch_set_number":2,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"20d407454a40fc0d66ed6605dc0363e7deac8852":{"kind":"REWORK","_number":14,"created":"2023-09-17 19:33:21.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/14","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/14","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/14 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/14 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/14 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/14"}}},"commit":{"parents":[{"commit":"3de96017640b6dc25f1544a1bafd4b370bb1cea0","subject":"feat(users/Profpatsch/whatcd-resolver): add executable","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d3de96017640b6dc25f1544a1bafd4b370bb1cea0"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-17 19:32:08.000000000","tz":180},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which already\n   existed in tokio internally, but upstream ia hesitant to expose.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nCo-Authored-By: Connor Brewster \u003ccbrewster@hey.com\u003e\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d20d407454a40fc0d66ed6605dc0363e7deac8852"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d20d407454a40fc0d66ed6605dc0363e7deac8852"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"3de96017640b6dc25f1544a1bafd4b370bb1cea0","is_merged_in_target_branch":true,"change_id":"I28f5c26443b9a878f8f374af2c7935831d17ab12","change_number":9355,"patch_set_number":3,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"8c2a9b0e0644d026bf744447192f827a2d091e45":{"kind":"REWORK","_number":15,"created":"2023-09-18 10:23:47.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/15","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/15","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/15 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/15 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/15 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/15"}}},"commit":{"parents":[{"commit":"3de96017640b6dc25f1544a1bafd4b370bb1cea0","subject":"feat(users/Profpatsch/whatcd-resolver): add executable","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d3de96017640b6dc25f1544a1bafd4b370bb1cea0"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-18 10:22:28.000000000","tz":180},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which already\n   existed in tokio internally, but upstream ia hesitant to expose.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nCo-Authored-By: Connor Brewster \u003ccbrewster@hey.com\u003e\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d8c2a9b0e0644d026bf744447192f827a2d091e45"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d8c2a9b0e0644d026bf744447192f827a2d091e45"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"3de96017640b6dc25f1544a1bafd4b370bb1cea0","is_merged_in_target_branch":true,"change_id":"I28f5c26443b9a878f8f374af2c7935831d17ab12","change_number":9355,"patch_set_number":3,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"da6cbb4a459d02111c44a67d3d0dd7e654abff23":{"kind":"NO_CODE_CHANGE","_number":16,"created":"2023-09-18 10:33:30.000000000","uploader":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"ref":"refs/changes/29/9329/16","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/29/9329/16","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/16 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/16 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/29/9329/16 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/29/9329/16"}}},"commit":{"parents":[{"commit":"3de96017640b6dc25f1544a1bafd4b370bb1cea0","subject":"feat(users/Profpatsch/whatcd-resolver): add executable","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d3de96017640b6dc25f1544a1bafd4b370bb1cea0"}]}],"author":{"name":"Florian Klink","email":"flokli@flokli.de","date":"2023-09-13 12:20:21.000000000","tz":120},"committer":{"name":"flokli","email":"flokli@flokli.de","date":"2023-09-18 10:33:30.000000000","tz":0},"subject":"refactor(tvix/store/blobsvc): make BlobStore async","message":"refactor(tvix/store/blobsvc): make BlobStore async\n\nWe previously kept the trait of a BlobService sync.\n\nThis however had some annoying consequences:\n\n - It became more and more complicated to track when we\u0027re in a context\n   with an async runtime in the context or not, producing bugs like\n   https://b.tvl.fyi/issues/304\n - The sync trait shielded away async clients from async worloads,\n   requiring manual block_on code inside the gRPC client code, and\n   spawn_blocking calls in consumers of the trait, even if they were\n   async (like the gRPC server)\n - We had to write our own custom glue code (SyncReadIntoAsyncRead)\n   to convert a sync io::Read into a tokio::io::AsyncRead, which already\n   existed in tokio internally, but upstream ia hesitant to expose.\n\nThis now makes the BlobService trait async (via the async_trait macro,\nlike we already do in various gRPC parts), and replaces the sync readers\nand writers with their async counterparts.\n\nTests interacting with a BlobService now need to have an async runtime\navailable, the easiest way for this is to mark the test functions\nwith the tokio::test macro, allowing us to directly .await in the test\nfunction.\n\nIn places where we don\u0027t have an async runtime available from context\n(like tvix-cli), we can pass one down explicitly.\n\nNow that we don\u0027t provide a sync interface anymore, the (sync) FUSE\nlibrary now holds a pointer to a tokio runtime handle, and needs to at\nleast have 2 threads available when talking to a blob service (which is\nwhy some of the tests now use the multi_thread flavor).\n\nThe FUSE tests got a bit more verbose, as we couldn\u0027t use the\nsetup_and_mount function accepting a callback anymore. We can hopefully\nmove some of the test fixture setup to rstest in the future to make this\nless repetitive.\n\nCo-Authored-By: Connor Brewster \u003ccbrewster@hey.com\u003e\nChange-Id: Ia0501b606e32c852d0108de9c9016b21c94a3c05\nReviewed-on: https://cl.tvl.fyi/c/depot/+/9329\nReviewed-by: Connor Brewster \u003ccbrewster@hey.com\u003e\nTested-by: BuildkiteCI\nReviewed-by: raitobezarius \u003ctvl@lahfa.xyz\u003e\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003dda6cbb4a459d02111c44a67d3d0dd7e654abff23"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003dda6cbb4a459d02111c44a67d3d0dd7e654abff23"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"3de96017640b6dc25f1544a1bafd4b370bb1cea0","is_merged_in_target_branch":true,"change_id":"I28f5c26443b9a878f8f374af2c7935831d17ab12","change_number":9355,"patch_set_number":3,"change_status":"MERGED"}],"branch":"refs/heads/canon"}},"requirements":[],"submit_records":[{"rule_name":"gerrit~PrologRule","status":"CLOSED","labels":[{"label":"Autosubmit","status":"MAY"},{"label":"Conformant-Commit-Message","status":"OK","applied_by":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"}},{"label":"All-Comments-Resolved","status":"OK","applied_by":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"}},{"label":"Verified","status":"OK","applied_by":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}},{"label":"Code-Review","status":"OK","applied_by":{"_account_id":1000073,"name":"raitobezarius","display_name":"Ryan Lahfa","email":"tvl@lahfa.xyz","username":"raitobezarius"}}]},{"rule_name":"Code-Owners","status":"CLOSED"}],"submit_requirements":[{"name":"All-Comments-Resolved","status":"SATISFIED","is_legacy":true,"submittability_expression_result":{"expression":"label:All-Comments-Resolved\u003dgerrit~PrologRule","fulfilled":true,"status":"PASS","passing_atoms":["label:All-Comments-Resolved\u003dgerrit~PrologRule"],"failing_atoms":[]}},{"name":"Verified","status":"SATISFIED","is_legacy":true,"submittability_expression_result":{"expression":"label:Verified\u003dgerrit~PrologRule","fulfilled":true,"status":"PASS","passing_atoms":["label:Verified\u003dgerrit~PrologRule"],"failing_atoms":[]}},{"name":"Code-Owners","status":"SATISFIED","is_legacy":true,"submittability_expression_result":{"expression":"rule:Code-Owners","fulfilled":true,"status":"PASS","passing_atoms":["Code-Owners"],"failing_atoms":[]}},{"name":"Conformant-Commit-Message","status":"SATISFIED","is_legacy":true,"submittability_expression_result":{"expression":"label:Conformant-Commit-Message\u003dgerrit~PrologRule","fulfilled":true,"status":"PASS","passing_atoms":["label:Conformant-Commit-Message\u003dgerrit~PrologRule"],"failing_atoms":[]}},{"name":"Code-Review","status":"SATISFIED","is_legacy":true,"submittability_expression_result":{"expression":"label:Code-Review\u003dgerrit~PrologRule","fulfilled":true,"status":"PASS","passing_atoms":["label:Code-Review\u003dgerrit~PrologRule"],"failing_atoms":[]}}]}
