)]}'
{"id":"depot~6695","triplet_id":"depot~canon~I50788a7ec7940cb5e5760f244692e361019a9bb7","project":"depot","branch":"canon","attention_set":{},"removed_from_attention_set":{"1000064":{"account":{"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},"last_update":"2022-09-19 11:28:10.000000000","reason":"Change was submitted"}},"hashtags":[],"change_id":"I50788a7ec7940cb5e5760f244692e361019a9bb7","subject":"fix(nixery): Avoid race when the same image is fetched in parallel","status":"MERGED","created":"2022-09-19 10:24:47.000000000","updated":"2022-09-19 11:28:10.000000000","submitted":"2022-09-19 11:28:10.000000000","submitter":{"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},"total_comment_count":0,"unresolved_comment_count":0,"has_review_started":true,"submission_id":"6697","meta_rev_id":"5c6745f657686709abca7be5c8f8be99bb1d006d","_number":6695,"virtual_id_number":6695,"owner":{"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},"actions":{},"labels":{"Code-Review":{"approved":{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},"all":[{"tag":"autogenerated:gerrit:merged","value":2,"date":"2022-09-19 11:28:10.000000000","permitted_voting_range":{"min":2,"max":2},"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"value":0,"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},{"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":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"value":0,"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},{"tag":"autogenerated:gerrit:merged","value":1,"date":"2022-09-19 11:28:10.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":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"value":0,"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},{"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":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},"all":[{"value":0,"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"value":0,"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},{"value":0,"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}]},"Conformant-Commit-Message":{"approved":{"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},"all":[{"value":0,"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"value":0,"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},{"value":0,"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}]}},"removable_reviewers":[],"reviewers":{"REVIEWER":[{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},{"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2022-09-19 10:24:48.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":"2022-09-19 10:26:37.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":"2022-09-19 10:29:38.000000000","updated_by":{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},"reviewer":{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},"state":"REVIEWER"}],"messages":[{"id":"d1a9fce00a0003c5c5ac64b13607d912dc4b80a1","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},"date":"2022-09-19 10:24:47.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"e18157a1a33a58a1282ade40918396a3141b4b7d","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2022-09-19 10:24:48.000000000","message":"Patch Set 1:\n\nStarted build for patchset #1 on: https://buildkite.com/tvl/depot/builds/16555","accounts_in_message":[],"_revision_number":1},{"id":"0b09b9b3db6dd1d5b12b30508e15b21e3d72c2ee","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2022-09-19 10:26:37.000000000","message":"Patch Set 1: Verified+1\n\nBuild of patchset 1 passed: https://buildkite.com/tvl/depot/builds/16555","accounts_in_message":[],"_revision_number":1},{"id":"842dd026a5463e91a25e43652b5727fad9b8aba5","author":{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},"date":"2022-09-19 10:29:38.000000000","message":"Patch Set 1: Code-Review+2","accounts_in_message":[],"_revision_number":1},{"id":"1c8704f2af6eb7dfb2385e5393142c7778e38a8b","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},"date":"2022-09-19 10:37:57.000000000","message":"Uploaded patch set 2.","accounts_in_message":[],"_revision_number":2},{"id":"95b0d91049cd4ec0fcc79dadd684592ef9294919","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2022-09-19 10:37:58.000000000","message":"Patch Set 2:\n\nStarted build for patchset #2 on: https://buildkite.com/tvl/depot/builds/16558","accounts_in_message":[],"_revision_number":2},{"id":"614d8addb6642db2341dd7384b83c95b026b3d12","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2022-09-19 10:39:42.000000000","message":"Patch Set 2: Verified+1\n\nBuild of patchset 2 passed: https://buildkite.com/tvl/depot/builds/16558","accounts_in_message":[],"_revision_number":2},{"id":"5c6745f657686709abca7be5c8f8be99bb1d006d","tag":"autogenerated:gerrit:merged","author":{"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},"date":"2022-09-19 11:28:10.000000000","message":"Change has been successfully rebased and submitted as 28417afbb4d8776501f9ae3ecead5859707488b9\n\n1 is the latest approved patch-set.\nThe change was submitted with unreviewed changes in the following files:\n\n```\nThe name of the file: tools/nixery/builder/builder.go\nInsertions: 1, Deletions: 1.\n\n@@ -26,8 +26,8 @@\n \t\"github.com/google/nixery/layers\"\n \t\"github.com/google/nixery/manifest\"\n \t\"github.com/google/nixery/storage\"\n-\tlog \"github.com/sirupsen/logrus\"\n \t\"github.com/im7mortal/kmutex\"\n+\tlog \"github.com/sirupsen/logrus\"\n )\n \n // The maximum number of layers in an image is 125. To allow for\n```\n```\nThe name of the file: tools/nixery/cmd/server/main.go\nInsertions: 1, Deletions: 1.\n\n@@ -30,8 +30,8 @@\n \t\"github.com/google/nixery/logs\"\n \tmf \"github.com/google/nixery/manifest\"\n \t\"github.com/google/nixery/storage\"\n-\tlog \"github.com/sirupsen/logrus\"\n \t\"github.com/im7mortal/kmutex\"\n+\tlog \"github.com/sirupsen/logrus\"\n )\n \n // ManifestMediaType is the Content-Type used for the manifest itself. This\n```\n","accounts_in_message":[],"_revision_number":3}],"current_revision_number":3,"current_revision":"28417afbb4d8776501f9ae3ecead5859707488b9","revisions":{"2f2fcccb834ea3d50cb0b02bee0f3a107cc513e1":{"kind":"REWORK","_number":1,"created":"2022-09-19 10:24:47.000000000","uploader":{"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},"ref":"refs/changes/95/6695/1","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/95/6695/1","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/95/6695/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/95/6695/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/95/6695/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/95/6695/1"}}},"commit":{"parents":[{"commit":"fefa8c55c45d82fc1d81e02a96e126812e1e1223","subject":"feat(tvix/eval): Support builtins.tail","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003dfefa8c55c45d82fc1d81e02a96e126812e1e1223"}]}],"author":{"name":"talyz","email":"kim.lindberger@gmail.com","date":"2022-09-19 07:30:28.000000000","tz":120},"committer":{"name":"talyz","email":"kim.lindberger@gmail.com","date":"2022-09-19 07:30:28.000000000","tz":120},"subject":"fix(nixery): Avoid race when the same image is fetched in parallel","message":"fix(nixery): Avoid race when the same image is fetched in parallel\n\nRemove a race condition which appears when uploadHashLayer is called\nwith the same key from multiple threads simultaneously. This can\neasily happen when the same image path is requested by multiple\nclients at the same time. When it does, a 500 status is returned and\nthe following error message is logged:\n\n{\n  \"context\": {\n    \"filePath\": \"github.com/google/nixery/builder/builder.go\",\n    \"lineNumber\": 440,\n    \"functionName\": \"github.com/google/nixery/builder.uploadHashLayer\"\n  },\n  \"error\": \"rename /var/lib/nixery/staging/\u003chash\u003e /var/lib/nixery/layers/\u003chash\u003e: no such file or directory\",\n  \"eventTime\": \"...\",\n  \"layer\": \"\u003chash\u003e\",\n  \"message\": \"failed to move layer from staging\",\n  ...\n}\n\nTo solve this issue, introduce a mutex keyed on the uploaded hash and\nmove all layer caching into uploadHashLayer. This could additionally\nprovide a small performance benefit when an already built image is\nrequested and NIXERY_PKGS_PATH is set, since symlink layers and config\nlayers are now also cached.\n\nChange-Id: I50788a7ec7940cb5e5760f244692e361019a9bb7\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d2f2fcccb834ea3d50cb0b02bee0f3a107cc513e1"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d2f2fcccb834ea3d50cb0b02bee0f3a107cc513e1"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"fefa8c55c45d82fc1d81e02a96e126812e1e1223","is_merged_in_target_branch":true,"change_id":"Iae90fda1bb21ce7bdb1aaa2aeb2b8c1e6dcb0f05","change_number":6545,"patch_set_number":10,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"102d57e719fdbd2fa9b79d245ae14c50f80c135b":{"kind":"REWORK","_number":2,"created":"2022-09-19 10:37:57.000000000","uploader":{"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},"ref":"refs/changes/95/6695/2","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/95/6695/2","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/95/6695/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/95/6695/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/95/6695/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/95/6695/2"}}},"commit":{"parents":[{"commit":"fefa8c55c45d82fc1d81e02a96e126812e1e1223","subject":"feat(tvix/eval): Support builtins.tail","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003dfefa8c55c45d82fc1d81e02a96e126812e1e1223"}]}],"author":{"name":"talyz","email":"kim.lindberger@gmail.com","date":"2022-09-19 07:30:28.000000000","tz":120},"committer":{"name":"talyz","email":"kim.lindberger@gmail.com","date":"2022-09-19 10:37:26.000000000","tz":120},"subject":"fix(nixery): Avoid race when the same image is fetched in parallel","message":"fix(nixery): Avoid race when the same image is fetched in parallel\n\nRemove a race condition which appears when uploadHashLayer is called\nwith the same key from multiple threads simultaneously. This can\neasily happen when the same image path is requested by multiple\nclients at the same time. When it does, a 500 status is returned and\nthe following error message is logged:\n\n{\n  \"context\": {\n    \"filePath\": \"github.com/google/nixery/builder/builder.go\",\n    \"lineNumber\": 440,\n    \"functionName\": \"github.com/google/nixery/builder.uploadHashLayer\"\n  },\n  \"error\": \"rename /var/lib/nixery/staging/\u003chash\u003e /var/lib/nixery/layers/\u003chash\u003e: no such file or directory\",\n  \"eventTime\": \"...\",\n  \"layer\": \"\u003chash\u003e\",\n  \"message\": \"failed to move layer from staging\",\n  ...\n}\n\nTo solve this issue, introduce a mutex keyed on the uploaded hash and\nmove all layer caching into uploadHashLayer. This could additionally\nprovide a small performance benefit when an already built image is\nrequested and NIXERY_PKGS_PATH is set, since symlink layers and config\nlayers are now also cached.\n\nChange-Id: I50788a7ec7940cb5e5760f244692e361019a9bb7\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d102d57e719fdbd2fa9b79d245ae14c50f80c135b"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d102d57e719fdbd2fa9b79d245ae14c50f80c135b"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"fefa8c55c45d82fc1d81e02a96e126812e1e1223","is_merged_in_target_branch":true,"change_id":"Iae90fda1bb21ce7bdb1aaa2aeb2b8c1e6dcb0f05","change_number":6545,"patch_set_number":10,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"28417afbb4d8776501f9ae3ecead5859707488b9":{"kind":"REWORK","_number":3,"created":"2022-09-19 11:28:10.000000000","uploader":{"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"},"ref":"refs/changes/95/6695/3","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/95/6695/3","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/95/6695/3 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/95/6695/3 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/95/6695/3 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/95/6695/3"}}},"commit":{"parents":[{"commit":"adf092a26be9da18448e96e1e6198d543d187c63","subject":"feat(monorepo-gerrit): swap owners plugin for code-owners","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003dadf092a26be9da18448e96e1e6198d543d187c63"}]}],"author":{"name":"talyz","email":"kim.lindberger@gmail.com","date":"2022-09-19 07:30:28.000000000","tz":120},"committer":{"name":"talyz","email":"kim.lindberger@gmail.com","date":"2022-09-19 11:28:10.000000000","tz":0},"subject":"fix(nixery): Avoid race when the same image is fetched in parallel","message":"fix(nixery): Avoid race when the same image is fetched in parallel\n\nRemove a race condition which appears when uploadHashLayer is called\nwith the same key from multiple threads simultaneously. This can\neasily happen when the same image path is requested by multiple\nclients at the same time. When it does, a 500 status is returned and\nthe following error message is logged:\n\n{\n  \"context\": {\n    \"filePath\": \"github.com/google/nixery/builder/builder.go\",\n    \"lineNumber\": 440,\n    \"functionName\": \"github.com/google/nixery/builder.uploadHashLayer\"\n  },\n  \"error\": \"rename /var/lib/nixery/staging/\u003chash\u003e /var/lib/nixery/layers/\u003chash\u003e: no such file or directory\",\n  \"eventTime\": \"...\",\n  \"layer\": \"\u003chash\u003e\",\n  \"message\": \"failed to move layer from staging\",\n  ...\n}\n\nTo solve this issue, introduce a mutex keyed on the uploaded hash and\nmove all layer caching into uploadHashLayer. This could additionally\nprovide a small performance benefit when an already built image is\nrequested and NIXERY_PKGS_PATH is set, since symlink layers and config\nlayers are now also cached.\n\nChange-Id: I50788a7ec7940cb5e5760f244692e361019a9bb7\nReviewed-on: https://cl.tvl.fyi/c/depot/+/6695\nReviewed-by: tazjin \u003ctazjin@tvl.su\u003e\nTested-by: BuildkiteCI\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d28417afbb4d8776501f9ae3ecead5859707488b9"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d28417afbb4d8776501f9ae3ecead5859707488b9"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"adf092a26be9da18448e96e1e6198d543d187c63","is_merged_in_target_branch":true,"change_id":"I9e05384b58dac258bc2da41c22e321b20451ef00","change_number":6686,"patch_set_number":3,"change_status":"MERGED"}],"branch":"refs/heads/canon","description":"Rebase"}},"requirements":[],"submit_records":[{"rule_name":"gerrit~PrologRule","status":"CLOSED","labels":[{"label":"Autosubmit","status":"MAY"},{"label":"Conformant-Commit-Message","status":"OK","applied_by":{"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"}},{"label":"All-Comments-Resolved","status":"OK","applied_by":{"_account_id":1000064,"name":"talyz","email":"kim.lindberger@gmail.com","username":"talyz"}},{"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":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"}}]},{"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":[]}}]}
