)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"8ba08081de36093cf7665a85b17dc31b82cc3e44","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"6abdbcd4_99d5b03e","updated":"2026-09-25 19:27:56.000000000","message":"run Everpure CI","commit_id":"b91a2e221818216fce47456ee1d29dca9a9b1b79"}],"cinder/volume/driver.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"83aff30df18283ff3652f4f00a54898ccf2d878f","unresolved":true,"context_lines":[{"line_number":638,"context_line":"        if bps_limit:"},{"line_number":639,"context_line":"            try:"},{"line_number":640,"context_line":"                self._throttle \u003d throttling.BlkioCgroup(int(bps_limit),"},{"line_number":641,"context_line":"                                                        cgroup_name)"},{"line_number":642,"context_line":"            except (processutils.ProcessExecutionError, OSError) as err:"},{"line_number":643,"context_line":"                # OSError: cgcreate itself is missing (no cgroup-tools)."},{"line_number":644,"context_line":"                LOG.warning(\u0027Failed to activate volume copy throttling: \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"55e04007_d9813765","line":641,"updated":"2026-09-27 16:59:28.000000000","message":"This except is the only place the error is discarded.\n\nBlkioCgroup.__init__ (cinder/volume/throttling.py:77) logs and\nre-raises. VolumeManager._init_host calls set_throttle() and then\nset_initialized() with no try around set_throttle()\n(cinder/volume/manager.py:619 and :624). An exception here skips\nset_initialized() and propagates out of Service.start(), so the\nvolume service does not start its RPC server.\n\nFileNotFoundError is the missing-cgcreate case. processutils.execute\nre-raises the FileNotFoundError from Popen, and the privsep client\nre-raises that same class (daemon Message.ERR: exc_type(*e.args)).\nFileNotFoundError is a subclass of OSError, which is why the new test\npasses. Please catch that class, not OSError.\n\nOSError also includes the privsep client failure\noslo_privsep.comm.ClientChannel raises on reader EOF:\n\n  OSError(\u0027Premature eof waiting for privileged process\u0027)\n\nThat is not a FileNotFoundError. PrivsepTimeout is a bare Exception,\nso a call timeout is already not caught here. With this except, a\ndead privsep helper during cgroup_create is treated as \"no\ncgroup-tools\" and the backend still comes up.\n\n   except (processutils.ProcessExecutionError,\n           FileNotFoundError) as err:\n       LOG.warning(\u0027Volume copy throttling disabled; host copies \u0027\n                    \u0027that use the default throttle will not be rate \u0027\n                    \u0027limited. Failed to set up cgroup %(name)s: \u0027\n                    \u0027%(err)s\u0027,\n                    {\u0027name\u0027: cgroup_name, \u0027err\u0027: err})\n\ncgroup_name is already in scope. After this handler,\nThrottle.set_default(None) makes get_default() return a Throttle with\nan empty prefix.","commit_id":"b91a2e221818216fce47456ee1d29dca9a9b1b79"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b51be8a2706d4ccf5b3411f6bf9773f2f9f6edd6","unresolved":true,"context_lines":[{"line_number":638,"context_line":"        if bps_limit:"},{"line_number":639,"context_line":"            try:"},{"line_number":640,"context_line":"                self._throttle \u003d throttling.BlkioCgroup(int(bps_limit),"},{"line_number":641,"context_line":"                                                        cgroup_name)"},{"line_number":642,"context_line":"            except (processutils.ProcessExecutionError, OSError) as err:"},{"line_number":643,"context_line":"                # OSError: cgcreate itself is missing (no cgroup-tools)."},{"line_number":644,"context_line":"                LOG.warning(\u0027Failed to activate volume copy throttling: \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"a7a88ea9_86b54fbe","line":641,"in_reply_to":"55e04007_d9813765","updated":"2026-09-28 09:40:23.000000000","message":"Agreed. The intent was only the missing-cgcreate case, and privsep\ndoes re-raise Popen\u0027s FileNotFoundError as that class, so catching\nOSError was wider than the fix needs: a privsep channel failure\n(\"Premature eof waiting for privileged process\") would have been\nlogged as \"no cgroup-tools\" and the backend brought up anyway. PS4\ncatches FileNotFoundError, uses your warning text with the cgroup\nname, and adds a test that any other OSError from set_throttle still\npropagates.","commit_id":"b91a2e221818216fce47456ee1d29dca9a9b1b79"}],"cinder/volume/throttling.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"83aff30df18283ff3652f4f00a54898ccf2d878f","unresolved":true,"context_lines":[{"line_number":89,"context_line":"    def _limit_bps(self, rw, dev, bps):"},{"line_number":90,"context_line":"        try:"},{"line_number":91,"context_line":"            cinder.privsep.cgroup.cgroup_limit(self.cgroup, rw, dev, bps)"},{"line_number":92,"context_line":"        except (processutils.ProcessExecutionError, OSError):"},{"line_number":93,"context_line":"            LOG.warning(\u0027Failed to setup I/O cgroup to throttle the \u0027"},{"line_number":94,"context_line":"                        \u0027device \\\u0027%(device)s\\\u0027.\u0027, {\u0027device\u0027: dev})"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bc925997_1d21b251","line":92,"updated":"2026-09-27 16:59:28.000000000","message":"This except does not re-raise. Before this patch only\nProcessExecutionError was ignored, so an OSError from cgroup_limit\naborted the copy. OSError now takes the same path: log a warning and\ncontinue. subcommand() then still yields the cgexec prefix\n(throttling.py:137), and copy_volume / convert_image run dd or\nqemu-img.\n\nThe privsep EOF above is that OSError. A dead privsep helper during\ncgset used to fail the migration or image transfer. It will now log\nand attempt the copy with whatever limit was already on the cgroup.\n\nFileNotFoundError is the missing-cgset case this comment is about.\nPlease keep that, and let other OSErrors fail the copy:\n\n   except (processutils.ProcessExecutionError,\n            FileNotFoundError):\n\n__init__ at line 77 should stay a re-raise. It is not this path.","commit_id":"b91a2e221818216fce47456ee1d29dca9a9b1b79"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"b51be8a2706d4ccf5b3411f6bf9773f2f9f6edd6","unresolved":true,"context_lines":[{"line_number":89,"context_line":"    def _limit_bps(self, rw, dev, bps):"},{"line_number":90,"context_line":"        try:"},{"line_number":91,"context_line":"            cinder.privsep.cgroup.cgroup_limit(self.cgroup, rw, dev, bps)"},{"line_number":92,"context_line":"        except (processutils.ProcessExecutionError, OSError):"},{"line_number":93,"context_line":"            LOG.warning(\u0027Failed to setup I/O cgroup to throttle the \u0027"},{"line_number":94,"context_line":"                        \u0027device \\\u0027%(device)s\\\u0027.\u0027, {\u0027device\u0027: dev})"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"58f1decc_edfaee6f","line":92,"in_reply_to":"bc925997_1d21b251","updated":"2026-09-28 09:40:23.000000000","message":"Agreed, same reasoning: FileNotFoundError for a missing cgset, every\nother OSError fails the copy as before. __init__ keeps its re-raise;\nits except is narrowed to FileNotFoundError too, only so the same\nclass is named in all three places. PS4 adds a test that an OSError\nfrom cgroup_limit escapes subcommand().","commit_id":"b91a2e221818216fce47456ee1d29dca9a9b1b79"}]}
