)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c01a998fd62bf558d92fcb26b54fddb6dafed090","unresolved":true,"context_lines":[{"line_number":9,"context_line":"The IPsec device driver could leave a VPN service and its IPsec site"},{"line_number":10,"context_line":"connections stuck in a stale status on the server side, two races:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"*  PENDING_CREATE never cleared: The server only transitions a"},{"line_number":13,"context_line":"resource out of a PENDING_* status when the agent reports it with"},{"line_number":14,"context_line":"\u0027updated_pending_status\u0027 set to True. That flag is reset after every"},{"line_number":15,"context_line":"status report, including the periodic one, so a periodic report firing"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"db362516_0f8b67db","line":12,"range":{"start_line":12,"start_character":0,"end_line":12,"end_character":3},"updated":"2026-10-07 07:29:04.000000000","message":"nit: maybe `1) `, similar to the second bullet point","commit_id":"4575c44180ad27ff8586dda013babd13a7da7106"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c01a998fd62bf558d92fcb26b54fddb6dafed090","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"746f1f93_5ff32f3b","updated":"2026-10-07 07:29:04.000000000","message":"minor nits, if you don\u0027t want to address them, that\u0027s ok","commit_id":"4575c44180ad27ff8586dda013babd13a7da7106"}],"neutron_vpnaas/services/vpn/device_drivers/ipsec.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c01a998fd62bf558d92fcb26b54fddb6dafed090","unresolved":true,"context_lines":[{"line_number":624,"context_line":"                \u0027ipsec_site_connections\u0027: {}}"},{"line_number":625,"context_line":"        return self.process_status_cache[process.id]"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"    def is_status_updated(self, process, previous_status, current_status\u003dNone):"},{"line_number":628,"context_line":"        # NOTE(lajoskatona): \u0027current_status\u0027 is a snapshot of the process"},{"line_number":629,"context_line":"        # status captured once by report_status(). It must be used for the"},{"line_number":630,"context_line":"        # comparison (instead of re-reading process.status /"}],"source_content_type":"text/x-python","patch_set":1,"id":"24e50c3b_4a01ca29","line":627,"range":{"start_line":627,"start_character":58,"end_line":627,"end_character":77},"updated":"2026-10-07 07:29:04.000000000","message":"nit: I don\u0027t think we need this additional parameter. The only place where this used is in L747 and we are calling `current_status \u003d self.capture_process_status(process)` too. We can just read it internally","commit_id":"4575c44180ad27ff8586dda013babd13a7da7106"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"9cb7b602e040fb3c83bdec136d379bf67e7fecac","unresolved":true,"context_lines":[{"line_number":624,"context_line":"                \u0027ipsec_site_connections\u0027: {}}"},{"line_number":625,"context_line":"        return self.process_status_cache[process.id]"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"    def is_status_updated(self, process, previous_status, current_status\u003dNone):"},{"line_number":628,"context_line":"        # NOTE(lajoskatona): \u0027current_status\u0027 is a snapshot of the process"},{"line_number":629,"context_line":"        # status captured once by report_status(). It must be used for the"},{"line_number":630,"context_line":"        # comparison (instead of re-reading process.status /"}],"source_content_type":"text/x-python","patch_set":1,"id":"eec9201e_c034ba5a","line":627,"range":{"start_line":627,"start_character":58,"end_line":627,"end_character":77},"in_reply_to":"24e50c3b_4a01ca29","updated":"2026-10-08 09:35:51.000000000","message":"I just tested it locallty, and even the extra read here brings back the race. It goes down to ipsec status, and that can change from UP to Down. So we have to keep one status read per cycle to avoid the flipping state.","commit_id":"4575c44180ad27ff8586dda013babd13a7da7106"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"cea378fc15f54bf43732028007a9526bfd03af30","unresolved":true,"context_lines":[{"line_number":624,"context_line":"                \u0027ipsec_site_connections\u0027: {}}"},{"line_number":625,"context_line":"        return self.process_status_cache[process.id]"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"    def is_status_updated(self, process, previous_status, current_status\u003dNone):"},{"line_number":628,"context_line":"        # NOTE(lajoskatona): \u0027current_status\u0027 is a snapshot of the process"},{"line_number":629,"context_line":"        # status captured once by report_status(). It must be used for the"},{"line_number":630,"context_line":"        # comparison (instead of re-reading process.status /"}],"source_content_type":"text/x-python","patch_set":1,"id":"71357ba5_ac07fd73","line":627,"range":{"start_line":627,"start_character":58,"end_line":627,"end_character":77},"in_reply_to":"24e50c3b_4a01ca29","updated":"2026-10-08 09:32:25.000000000","message":"That one is missing in PS2, but this is just a nit","commit_id":"4575c44180ad27ff8586dda013babd13a7da7106"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3a660bedbc37cdbd381224ab0e594d24fb78f299","unresolved":false,"context_lines":[{"line_number":624,"context_line":"                \u0027ipsec_site_connections\u0027: {}}"},{"line_number":625,"context_line":"        return self.process_status_cache[process.id]"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"    def is_status_updated(self, process, previous_status, current_status\u003dNone):"},{"line_number":628,"context_line":"        # NOTE(lajoskatona): \u0027current_status\u0027 is a snapshot of the process"},{"line_number":629,"context_line":"        # status captured once by report_status(). It must be used for the"},{"line_number":630,"context_line":"        # comparison (instead of re-reading process.status /"}],"source_content_type":"text/x-python","patch_set":1,"id":"762df11d_0414c0a3","line":627,"range":{"start_line":627,"start_character":58,"end_line":627,"end_character":77},"in_reply_to":"eec9201e_c034ba5a","updated":"2026-10-08 11:00:07.000000000","message":"Nice","commit_id":"4575c44180ad27ff8586dda013babd13a7da7106"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c01a998fd62bf558d92fcb26b54fddb6dafed090","unresolved":true,"context_lines":[{"line_number":647,"context_line":"        for connection_status in process.connection_status.values():"},{"line_number":648,"context_line":"            connection_status[\u0027updated_pending_status\u0027] \u003d False"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"    def capture_process_status(self, process):"},{"line_number":651,"context_line":"        \"\"\"Capture a consistent snapshot of the process status."},{"line_number":652,"context_line":""},{"line_number":653,"context_line":"        Reading ``process.status`` and ``process.connection_status`` each"}],"source_content_type":"text/x-python","patch_set":1,"id":"b073fc14_f282c6fe","line":650,"range":{"start_line":650,"start_character":8,"end_line":650,"end_character":30},"updated":"2026-10-07 07:29:04.000000000","message":"nit: I think this method should be private","commit_id":"4575c44180ad27ff8586dda013babd13a7da7106"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"9cb7b602e040fb3c83bdec136d379bf67e7fecac","unresolved":false,"context_lines":[{"line_number":647,"context_line":"        for connection_status in process.connection_status.values():"},{"line_number":648,"context_line":"            connection_status[\u0027updated_pending_status\u0027] \u003d False"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"    def capture_process_status(self, process):"},{"line_number":651,"context_line":"        \"\"\"Capture a consistent snapshot of the process status."},{"line_number":652,"context_line":""},{"line_number":653,"context_line":"        Reading ``process.status`` and ``process.connection_status`` each"}],"source_content_type":"text/x-python","patch_set":1,"id":"90098b32_d6084035","line":650,"range":{"start_line":650,"start_character":8,"end_line":650,"end_character":30},"in_reply_to":"b073fc14_f282c6fe","updated":"2026-10-08 09:35:51.000000000","message":"Done","commit_id":"4575c44180ad27ff8586dda013babd13a7da7106"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c01a998fd62bf558d92fcb26b54fddb6dafed090","unresolved":true,"context_lines":[{"line_number":668,"context_line":"            \u0027connection_status\u0027: copy.deepcopy(process.connection_status),"},{"line_number":669,"context_line":"        }"},{"line_number":670,"context_line":""},{"line_number":671,"context_line":"    def copy_process_status(self, process, force_pending_update\u003dFalse,"},{"line_number":672,"context_line":"                            current_status\u003dNone):"},{"line_number":673,"context_line":"        # NOTE(lajoskatona): The server only moves a VPNService"},{"line_number":674,"context_line":"        # (or IPsec site connection) out of a PENDING_* status when the"}],"source_content_type":"text/x-python","patch_set":1,"id":"55ae531b_f1eb4888","line":671,"updated":"2026-10-07 07:29:04.000000000","message":"ditto: I think this method should be private","commit_id":"4575c44180ad27ff8586dda013babd13a7da7106"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"9cb7b602e040fb3c83bdec136d379bf67e7fecac","unresolved":false,"context_lines":[{"line_number":668,"context_line":"            \u0027connection_status\u0027: copy.deepcopy(process.connection_status),"},{"line_number":669,"context_line":"        }"},{"line_number":670,"context_line":""},{"line_number":671,"context_line":"    def copy_process_status(self, process, force_pending_update\u003dFalse,"},{"line_number":672,"context_line":"                            current_status\u003dNone):"},{"line_number":673,"context_line":"        # NOTE(lajoskatona): The server only moves a VPNService"},{"line_number":674,"context_line":"        # (or IPsec site connection) out of a PENDING_* status when the"}],"source_content_type":"text/x-python","patch_set":1,"id":"1be38ab3_c98b9fba","line":671,"in_reply_to":"55ae531b_f1eb4888","updated":"2026-10-08 09:35:51.000000000","message":"Done","commit_id":"4575c44180ad27ff8586dda013babd13a7da7106"}]}
