)]}'
{"tests/unit/test_circular_dependencies.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"cf7bca742c66669a3acb4b0ad51510d59dc3c380","unresolved":true,"context_lines":[{"line_number":4168,"context_line":"        check_runs \u003d self.fake_github.getCommitChecks(\"gh/project\", A.head_sha)"},{"line_number":4169,"context_line":"        self.assertEqual(len(check_runs), 2)"},{"line_number":4170,"context_line":"        self.assertEqual(check_runs[0][\"status\"], \"in_progress\")"},{"line_number":4171,"context_line":"        self.assertEqual(check_runs[1][\"status\"], \"completed\")"},{"line_number":4172,"context_line":""},{"line_number":4173,"context_line":"        self.executor_server.hold_jobs_in_build \u003d False"},{"line_number":4174,"context_line":"        self.executor_server.release()"}],"source_content_type":"text/x-python","patch_set":6,"id":"a20061ce_5fd75d15","line":4171,"updated":"2024-02-09 17:37:21.000000000","message":"I guess we insert new check runs at the front of the queue? I would\u0027ve expected [0] to be completed and [1] to be in progress if using an append.","commit_id":"ca83980bb7c03e58f35763742bfcafd29b09f4cb"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"9370ee3b9a3022a5459c447d6482625ddab94dfe","unresolved":false,"context_lines":[{"line_number":4168,"context_line":"        check_runs \u003d self.fake_github.getCommitChecks(\"gh/project\", A.head_sha)"},{"line_number":4169,"context_line":"        self.assertEqual(len(check_runs), 2)"},{"line_number":4170,"context_line":"        self.assertEqual(check_runs[0][\"status\"], \"in_progress\")"},{"line_number":4171,"context_line":"        self.assertEqual(check_runs[1][\"status\"], \"completed\")"},{"line_number":4172,"context_line":""},{"line_number":4173,"context_line":"        self.executor_server.hold_jobs_in_build \u003d False"},{"line_number":4174,"context_line":"        self.executor_server.release()"}],"source_content_type":"text/x-python","patch_set":6,"id":"b6cdbc87_5351d133","line":4171,"in_reply_to":"a20061ce_5fd75d15","updated":"2024-02-09 18:09:59.000000000","message":"Yep. https://opendev.org/zuul/zuul/src/branch/master/tests/fakegithub.py#L187-L189","commit_id":"ca83980bb7c03e58f35763742bfcafd29b09f4cb"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"cf7bca742c66669a3acb4b0ad51510d59dc3c380","unresolved":true,"context_lines":[{"line_number":4451,"context_line":"        self.assertEqual(len(pipeline.queues), 3)"},{"line_number":4452,"context_line":"        self.assertQueueCycles(pipeline, 0, [[A], [B]])"},{"line_number":4453,"context_line":"        self.assertQueueCycles(pipeline, 1, [[A], [B], [C]])"},{"line_number":4454,"context_line":"        self.assertQueueCycles(pipeline, 2, [[A]])"},{"line_number":4455,"context_line":""},{"line_number":4456,"context_line":"        # Verify that we can put B and C into a bundle."},{"line_number":4457,"context_line":"        C.body \u003d \"{}\\n\\nDepends-On: {}\\n\".format("}],"source_content_type":"text/x-python","patch_set":6,"id":"91f5d44e_319b1ac1","line":4454,"updated":"2024-02-09 17:37:21.000000000","message":"This might be related to my previous comment, but how do we end up with an order of `A,B ; A,B,C ; A` and not either `A ; A,B ; A,B,C` or `A,B,C ; A,B ; A` ? I know there is not git relationship between A B and C, but we emit the events in order A then B then C so I would expect A then AB then ABC (or reversed depending on queue representation order).","commit_id":"ca83980bb7c03e58f35763742bfcafd29b09f4cb"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"4a346a478d653194809d7ac3fb12740d2eea92e3","unresolved":true,"context_lines":[{"line_number":4451,"context_line":"        self.assertEqual(len(pipeline.queues), 3)"},{"line_number":4452,"context_line":"        self.assertQueueCycles(pipeline, 0, [[A], [B]])"},{"line_number":4453,"context_line":"        self.assertQueueCycles(pipeline, 1, [[A], [B], [C]])"},{"line_number":4454,"context_line":"        self.assertQueueCycles(pipeline, 2, [[A]])"},{"line_number":4455,"context_line":""},{"line_number":4456,"context_line":"        # Verify that we can put B and C into a bundle."},{"line_number":4457,"context_line":"        C.body \u003d \"{}\\n\\nDepends-On: {}\\n\".format("}],"source_content_type":"text/x-python","patch_set":6,"id":"c0ad68fb_8a641680","line":4454,"in_reply_to":"4c412eab_96e9d979","updated":"2024-02-09 18:30:19.000000000","message":"Two different things going on here:\n\nAt the start of all this, BCA is a cycle enqueued as one item in the pipeline.  The order of a dependency cycle is undefined (unless there are git deps involved), and we arbitrarily end up with the BCA order of changes within that one item.\n\nLater, we sever the cycle, and the strict ordering between the same changes which are now no longer in a cycle is observed when we enqueue them into the pipeline.  So we end up with a bunch of changes correctly ordered, but invididually enqueued in the arbitrary order of however they ended up in the dependency cycle change list earlier.","commit_id":"ca83980bb7c03e58f35763742bfcafd29b09f4cb"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"9370ee3b9a3022a5459c447d6482625ddab94dfe","unresolved":true,"context_lines":[{"line_number":4451,"context_line":"        self.assertEqual(len(pipeline.queues), 3)"},{"line_number":4452,"context_line":"        self.assertQueueCycles(pipeline, 0, [[A], [B]])"},{"line_number":4453,"context_line":"        self.assertQueueCycles(pipeline, 1, [[A], [B], [C]])"},{"line_number":4454,"context_line":"        self.assertQueueCycles(pipeline, 2, [[A]])"},{"line_number":4455,"context_line":""},{"line_number":4456,"context_line":"        # Verify that we can put B and C into a bundle."},{"line_number":4457,"context_line":"        C.body \u003d \"{}\\n\\nDepends-On: {}\\n\".format("}],"source_content_type":"text/x-python","patch_set":6,"id":"aa6ece07_c7a09250","line":4454,"in_reply_to":"91f5d44e_319b1ac1","updated":"2024-02-09 18:09:59.000000000","message":"If you go up a few lines to where we have a queue state of: ABC,E (where ABC is a cycle).  We write the cycle as ABC in the test, but due to the quirks of how the cycle is enqueued, the change list for the queue item is actually BCA.\n\nSo after we sever the cycle, we dequeue BCA, then also dequeue E because E still depends on C.  This leaves us with an empty pipeline.\n\nThen we do what this change does and add enqueue events for each of the component changes of the BCA item.  Since we do it in that order, we end up enqueing B first (which depends on A), so we get:\n\nA,B\n\nThen we enqueue C, which depends on B, so we get:\n\nA,B ; A,B,C\n\nThen we enqueue A which has no deps leaving us with:\n\nA,B ; A,B,C ; A\n\ntl;dr we don\u0027t care about the cycle item change order in the test assertions and it doesn\u0027t match the actual order.  But the result is the same.","commit_id":"ca83980bb7c03e58f35763742bfcafd29b09f4cb"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"51ae43f668509e86c1006d62318ad33779f2f92a","unresolved":true,"context_lines":[{"line_number":4451,"context_line":"        self.assertEqual(len(pipeline.queues), 3)"},{"line_number":4452,"context_line":"        self.assertQueueCycles(pipeline, 0, [[A], [B]])"},{"line_number":4453,"context_line":"        self.assertQueueCycles(pipeline, 1, [[A], [B], [C]])"},{"line_number":4454,"context_line":"        self.assertQueueCycles(pipeline, 2, [[A]])"},{"line_number":4455,"context_line":""},{"line_number":4456,"context_line":"        # Verify that we can put B and C into a bundle."},{"line_number":4457,"context_line":"        C.body \u003d \"{}\\n\\nDepends-On: {}\\n\".format("}],"source_content_type":"text/x-python","patch_set":6,"id":"4c412eab_96e9d979","line":4454,"in_reply_to":"aa6ece07_c7a09250","updated":"2024-02-09 18:16:14.000000000","message":"\u003e Then we do what this change does and add enqueue events for each of the component changes of the BCA item.  Since we do it in that order, we end up enqueing B first (which depends on A), so we get:\n\nBut we emit the event for A\u0027s update first, then B then C. I don\u0027t see where we have an order BCA after severing the cycle relationships.","commit_id":"ca83980bb7c03e58f35763742bfcafd29b09f4cb"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"64ff2ebda3cabc69acc7f4c6456c66d1dd2993b6","unresolved":false,"context_lines":[{"line_number":4451,"context_line":"        self.assertEqual(len(pipeline.queues), 3)"},{"line_number":4452,"context_line":"        self.assertQueueCycles(pipeline, 0, [[A], [B]])"},{"line_number":4453,"context_line":"        self.assertQueueCycles(pipeline, 1, [[A], [B], [C]])"},{"line_number":4454,"context_line":"        self.assertQueueCycles(pipeline, 2, [[A]])"},{"line_number":4455,"context_line":""},{"line_number":4456,"context_line":"        # Verify that we can put B and C into a bundle."},{"line_number":4457,"context_line":"        C.body \u003d \"{}\\n\\nDepends-On: {}\\n\".format("}],"source_content_type":"text/x-python","patch_set":6,"id":"afdb279e_d93db817","line":4454,"in_reply_to":"c0ad68fb_8a641680","updated":"2024-02-09 18:38:46.000000000","message":"Got it. The order is a side effect of iterating over the changes in cycle order in order to reenqueue them after the severing. This is subtle and really probably only makes a difference in testing, but I wanted to make sure I understood the behavior as it was unexpected to me.","commit_id":"ca83980bb7c03e58f35763742bfcafd29b09f4cb"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"cf7bca742c66669a3acb4b0ad51510d59dc3c380","unresolved":true,"context_lines":[{"line_number":4467,"context_line":"        self.assertEqual(len(pipeline.queues), 2)"},{"line_number":4468,"context_line":"        bc \u003d [B, C]"},{"line_number":4469,"context_line":"        self.assertQueueCycles(pipeline, 0, [[A]])"},{"line_number":4470,"context_line":"        self.assertQueueCycles(pipeline, 1, [bc])"},{"line_number":4471,"context_line":""},{"line_number":4472,"context_line":"        # All done."},{"line_number":4473,"context_line":"        self.executor_server.hold_jobs_in_build \u003d False"}],"source_content_type":"text/x-python","patch_set":6,"id":"59141da8_a3583f7e","line":4470,"updated":"2024-02-09 17:37:21.000000000","message":"This order makes sense as we\u0027ll enqueue BC after removing every other entry with B or C in it. Leaving A then BC.","commit_id":"ca83980bb7c03e58f35763742bfcafd29b09f4cb"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"9370ee3b9a3022a5459c447d6482625ddab94dfe","unresolved":false,"context_lines":[{"line_number":4467,"context_line":"        self.assertEqual(len(pipeline.queues), 2)"},{"line_number":4468,"context_line":"        bc \u003d [B, C]"},{"line_number":4469,"context_line":"        self.assertQueueCycles(pipeline, 0, [[A]])"},{"line_number":4470,"context_line":"        self.assertQueueCycles(pipeline, 1, [bc])"},{"line_number":4471,"context_line":""},{"line_number":4472,"context_line":"        # All done."},{"line_number":4473,"context_line":"        self.executor_server.hold_jobs_in_build \u003d False"}],"source_content_type":"text/x-python","patch_set":6,"id":"537c13b4_32c717c8","line":4470,"in_reply_to":"59141da8_a3583f7e","updated":"2024-02-09 18:09:59.000000000","message":"And there\u0027s no cycles at play in the previous dequeue so there\u0027s no unexpected ordering.","commit_id":"ca83980bb7c03e58f35763742bfcafd29b09f4cb"}],"zuul/manager/__init__.py":[{"author":{"_account_id":27582,"name":"Simon Westphahl","email":"simon.westphahl@bmw.de","username":"simon.westphahl"},"change_message_id":"f46ccc287e1a9297bcac619813827851086e6acc","unresolved":true,"context_lines":[{"line_number":494,"context_line":"                                 change.project.name,"},{"line_number":495,"context_line":"                                 change\u003dchange._id())"},{"line_number":496,"context_line":"            event.zuul_event_id \u003d item.event.zuul_event_id"},{"line_number":497,"context_line":"            self.sched.management_events[self.pipeline.tenant.name].put("},{"line_number":498,"context_line":"                event)"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"782c540f_158bf221","line":497,"updated":"2024-02-07 10:30:29.000000000","message":"I think we can add this directly to this pipeline\u0027s management event queue. I don\u0027t see a need to take a detour via the tenant event queue.","commit_id":"d821fd4c40e80b5697ca3d1f828dbc1089ff865c"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"b08433445945b8ce0858067b5e7fa0ce9e10120b","unresolved":false,"context_lines":[{"line_number":494,"context_line":"                                 change.project.name,"},{"line_number":495,"context_line":"                                 change\u003dchange._id())"},{"line_number":496,"context_line":"            event.zuul_event_id \u003d item.event.zuul_event_id"},{"line_number":497,"context_line":"            self.sched.management_events[self.pipeline.tenant.name].put("},{"line_number":498,"context_line":"                event)"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"311a6823_bf33c370","line":497,"in_reply_to":"782c540f_158bf221","updated":"2024-02-07 14:43:33.000000000","message":"Done.","commit_id":"d821fd4c40e80b5697ca3d1f828dbc1089ff865c"}]}
