)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"021459251a27c1c17b955a8134470eeb3a6f5c85","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6202cadf_0e421647","updated":"2026-09-11 14:05:20.000000000","message":"recheck, uncertain of tox-py313","commit_id":"7125c3828d2011c4fd026076b9e3c09b17ce58d7"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"2efdab4c57fb0233c1a196535d79e14bad8ff2f2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"dd86316f_e0001fb5","updated":"2026-09-18 14:40:27.000000000","message":"Hey Rajat, I jast want to understand what is the value of adding this as an API instead of just asking the operator to \u0027stop\u0027 the service.","commit_id":"2c07e8a1d380a7e0d68a5860130c64428633177d"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"8fc395008666b61b9c8babfb5f8cf7246ad564c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e41e2b07_1ea7487c","updated":"2026-09-16 14:34:41.000000000","message":"Hi. I\u0027m not so sure about my own patch at https://review.opendev.org/c/openstack/cinder/+/979641 and I do trust Rajat knows better. I\u0027ll try to give this patch a try in my CI.","commit_id":"2c07e8a1d380a7e0d68a5860130c64428633177d"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"04ca5ad946ad793cc94871fb328342e749e0c86b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"a853ef24_c3f577d5","updated":"2026-09-18 15:18:40.000000000","message":"Looks like it should work. I\u0027ll try to find time to test it.","commit_id":"2c07e8a1d380a7e0d68a5860130c64428633177d"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"e7db04ef5e1b9034cad7fcdb689e3858fd2b8b83","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7b4611de_3f10bc80","updated":"2026-09-18 15:45:49.000000000","message":"Small question about the implementation. Neutral review.","commit_id":"2c07e8a1d380a7e0d68a5860130c64428633177d"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"0a5876c56c4dd7d85d8cf27f7502a96bdb4acee7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ddf7270a_16fc18dc","updated":"2026-09-18 15:14:25.000000000","message":"Thanks for clarifying, since we have this plausible use case, I\u0027ll +1 it, and approve once you have it tested. Please collect the artifacts and post to the launchpad bug.","commit_id":"2c07e8a1d380a7e0d68a5860130c64428633177d"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"db20a6f8ecea7a65dfbaa1802c639d1686edbd31","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e32b6c88_5e4769b3","in_reply_to":"dd86316f_e0001fb5","updated":"2026-09-18 14:52:36.000000000","message":"Replying here, as suggested by Erion during this Friday festival of review.\n\nIn our use case, we have one cinder-volume running on each compute node. We do that because nova-compute already needs the Ceph secret, so there was less code to add to have Cinder to get it. Also, as compute nodes have a huge amount of RAM, they host a large number of VMs, and then it makes sense to have the amount of cinder-volume nodes to grow at the same time as the number of compute.\n\n\nErion suggested that we just stop the service (systemctl stop cinder-volume). That would indeed work and achieve the same thing as this patch. But unfortunately, from an operator perspective, that\u0027s not convenient. First, it will ring on our Zabbix monitoring, as a defective service on the host. Second, puppet will restart it.\n\nAlso, when a compute is provisioned, we disable all services on it by default (Nova, Neutron, Cinder). It\u0027d be nice if Cinder had an option to have new cinder-volume services disabled by default, just like Nova does, to avoid a small race condition where new hosts are left enabled before our config management disable them.","commit_id":"2c07e8a1d380a7e0d68a5860130c64428633177d"}],"cinder/api/v3/services.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"73738386f2c332119e1013aca2ec329283d5a922","unresolved":true,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        # Not found exception will be handled at the wsgi level"},{"line_number":290,"context_line":"        svc \u003d objects.Service.get_by_args(context, host, binary_key)"},{"line_number":291,"context_line":"        svc.disabled \u003d False"},{"line_number":292,"context_line":"        svc.save()"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        return {"}],"source_content_type":"text/x-python","patch_set":2,"id":"285c0d72_434f4f1f","line":291,"updated":"2026-09-17 04:07:05.000000000","message":"Service.save() only persists cinder_obj_get_changes(); if this\nassignment is missing, enable() is a no-op on the disabled column.\ndisable-log-reason already does svc.disabled \u003d True (line 262).","commit_id":"2c07e8a1d380a7e0d68a5860130c64428633177d"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"2efdab4c57fb0233c1a196535d79e14bad8ff2f2","unresolved":true,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        # Not found exception will be handled at the wsgi level"},{"line_number":290,"context_line":"        svc \u003d objects.Service.get_by_args(context, host, binary_key)"},{"line_number":291,"context_line":"        svc.disabled \u003d False"},{"line_number":292,"context_line":"        svc.save()"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        return {"}],"source_content_type":"text/x-python","patch_set":2,"id":"221ac9a1_4b1f5a01","line":291,"in_reply_to":"285c0d72_434f4f1f","updated":"2026-09-18 14:40:27.000000000","message":"hey, @jayaanand.borra@netapp.com. Not sure what you mean here. \u0027disabled\u0027, is a database field in the service object, so set and safe should work. disable-log-reason is another API call","commit_id":"2c07e8a1d380a7e0d68a5860130c64428633177d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"73738386f2c332119e1013aca2ec329283d5a922","unresolved":true,"context_lines":[{"line_number":314,"context_line":""},{"line_number":315,"context_line":"        # Not found exception will be handled at the wsgi level"},{"line_number":316,"context_line":"        svc \u003d objects.Service.get_by_args(context, host, binary_key)"},{"line_number":317,"context_line":"        svc.disabled \u003d True"},{"line_number":318,"context_line":"        svc.save()"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        return {"}],"source_content_type":"text/x-python","patch_set":2,"id":"f621ea67_de359941","line":317,"updated":"2026-09-17 04:07:05.000000000","message":"Same as enable(): this is what makes report_state see\nservice_ref.disabled and drop the cluster consumer.\n\ntest_services_disable_* only asserts res_dict[\u0027status\u0027] \u003d\u003d \u0027disabled\u0027,\nwhich is hardcoded in the return dict and would pass without this\nassignment. Please assert the stored Service.disabled value.","commit_id":"2c07e8a1d380a7e0d68a5860130c64428633177d"}],"cinder/service.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"73738386f2c332119e1013aca2ec329283d5a922","unresolved":true,"context_lines":[{"line_number":256,"context_line":"            self.backend_rpcserver.start()"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        if self.cluster:"},{"line_number":259,"context_line":"            service_ref \u003d objects.Service.get_by_id(ctxt, Service.service_id)"},{"line_number":260,"context_line":"            if not service_ref.disabled:"},{"line_number":261,"context_line":"                self._start_cluster_rpcserver()"},{"line_number":262,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"c3a49776_861eef25","line":259,"updated":"2026-09-17 04:07:05.000000000","message":"get_by_id() is unguarded. If it raises NotFound, the whole service\nfails to start; previously we still started the cluster RPC server.","commit_id":"2c07e8a1d380a7e0d68a5860130c64428633177d"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"e7db04ef5e1b9034cad7fcdb689e3858fd2b8b83","unresolved":true,"context_lines":[{"line_number":279,"context_line":"        if not self.cluster or self.cluster_rpcserver:"},{"line_number":280,"context_line":"            return"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":283,"context_line":"        endpoints \u003d [self.manager]"},{"line_number":284,"context_line":"        endpoints.extend(self.manager.additional_endpoints)"},{"line_number":285,"context_line":"        obj_version_cap \u003d objects.Service.get_minimum_obj_version(ctxt)"}],"source_content_type":"text/x-python","patch_set":2,"id":"57883885_c41a18bc","line":282,"updated":"2026-09-18 15:45:49.000000000","message":"I\u0027m wondering if we should pass in the already-built serializer here instead of rebuilding it?\n\nParticularly if this is an expensive object.","commit_id":"2c07e8a1d380a7e0d68a5860130c64428633177d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"73738386f2c332119e1013aca2ec329283d5a922","unresolved":true,"context_lines":[{"line_number":295,"context_line":"    def _stop_cluster_rpcserver(self):"},{"line_number":296,"context_line":"        if self.cluster_rpcserver:"},{"line_number":297,"context_line":"            cluster_rpcserver \u003d self.cluster_rpcserver"},{"line_number":298,"context_line":"            self.cluster_rpcserver \u003d None"},{"line_number":299,"context_line":"            cluster_rpcserver.stop()"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"    def basic_config_check(self) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9b09b543_3377fd22","line":298,"updated":"2026-09-17 04:07:05.000000000","message":"Service.wait() is:\n if self.cluster_rpcserver:\n  self.cluster_rpcserver.wait()\n\nAfter this assignment, wait() never joins the cluster server.\nBefore this patch, stop() called cluster_rpcserver.stop() and left\nthe pointer set so wait() could join it.\n\nDisable still needs the pointer cleared (otherwise the next\nheartbeat’s _start is a no-op). Keep the stopped server on something\nwait() can join (e.g. _stopped_cluster_rpcserver), and wait() that\nold server before _start creates a new one — not inside report_state,\nor an in-flight create stalls heartbeats.","commit_id":"2c07e8a1d380a7e0d68a5860130c64428633177d"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"73738386f2c332119e1013aca2ec329283d5a922","unresolved":true,"context_lines":[{"line_number":443,"context_line":"                self.rpcserver.stop()"},{"line_number":444,"context_line":"            if self.backend_rpcserver:"},{"line_number":445,"context_line":"                self.backend_rpcserver.stop()"},{"line_number":446,"context_line":"            self._stop_cluster_rpcserver()"},{"line_number":447,"context_line":"        except Exception:"},{"line_number":448,"context_line":"            pass"},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3737255b_3aad0798","line":446,"updated":"2026-09-17 04:07:05.000000000","message":"Old code:\n if self.cluster_rpcserver:\n  self.cluster_rpcserver.stop()\n\nThat left the pointer for wait(). Delegating here Nones it first\n(line 298). Please wait() from this path, or keep a reference\nService.wait() can still join.","commit_id":"2c07e8a1d380a7e0d68a5860130c64428633177d"}]}
