)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"bd305dcdf5a8c7ef20ed4707c7e9c3b7ae6c5397","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"754f8336_b9a10d3c","updated":"2025-12-23 21:25:59.000000000","message":"recheck no bug","commit_id":"46839a378b02728f71aa90f36388d2a9c56e38e4"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"3a9edfe18d15475bdc1d5e5efdd502ad91656aeb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"218d48b8_53a340c9","updated":"2026-01-21 14:48:59.000000000","message":"Just some annoying grammar and spelling nits.","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"6e0c2bfc294b9a90e4a7085f17380ddaae39c83a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"94857ab3_6aa49c32","updated":"2026-01-12 11:39:12.000000000","message":"recheck no bug","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"42302fd179be5d441aa026a858b52d108fed106e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"cccf2e25_633886d6","updated":"2026-01-15 12:38:42.000000000","message":"recheck no bug","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"93dcb1484b5d0f500eb95a001d239d510adb6733","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"3704fe60_b47d3ea5","updated":"2026-01-22 13:25:16.000000000","message":"Looks good to me","commit_id":"add43f54b90b9ebcc0800d6250d7d243ce93622c"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"28eb8e431ddb8c58a684dc175d02c76caa825042","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"7b192814_0a50bd40","updated":"2026-01-22 16:58:26.000000000","message":"recheck no bug","commit_id":"add43f54b90b9ebcc0800d6250d7d243ce93622c"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"75ef1c487e9361146b1160303df5bd3d619ec0ec","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"25c1d0b0_b6570e6e","updated":"2026-03-17 09:55:15.000000000","message":"Ok, I\u0027ll factorize this in the parent class, though it will need a few parameters to be set in backup,scheduler,volume/manager.py.","commit_id":"8d733522680d72ad9a35f2a2a5bda2ca9d76169b"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"a66da3cff034e2ddc22b01ac21b46a3d604d99d4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"86712f6e_42285df7","updated":"2026-03-11 23:32:56.000000000","message":"The code does not look wrong.\n\nHowever, -1 because: is there a reason why ```is_working()``` isn\u0027t being offloaded to the parent ```Manager``` instead of having multiple near-same instances of the same thing in classes all derived from said ```Manager```?\n\nI won\u0027t try to enforce this with negative reviews or anything, but I wanted to bring it up and get a reply.","commit_id":"8d733522680d72ad9a35f2a2a5bda2ca9d76169b"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"337e843abef38f5928bad35efaf884a009ec91f8","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":8,"id":"0b9b67e7_607f7373","updated":"2026-03-11 23:34:13.000000000","message":"The code does not look wrong.\n\nHowever, -1 because: is there a reason why is_working() isn\u0027t being offloaded to the parent Manager instead of having multiple near-same instances of the same thing in classes all derived from said Manager?\n\nI won\u0027t try to enforce this with negative reviews or anything, but I wanted to bring it up and get a reply.","commit_id":"8d733522680d72ad9a35f2a2a5bda2ca9d76169b"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"fbb9ff9b1900ee525dde6cc2f6b5fbece2368524","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":8,"id":"29658334_e10613b2","in_reply_to":"0b9b67e7_607f7373","updated":"2026-03-11 23:37:18.000000000","message":"An intermediary class might make sense too if it doesn\u0027t make sense to get ```Manager``` involved.","commit_id":"8d733522680d72ad9a35f2a2a5bda2ca9d76169b"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"bf27e81f1d38ecf0c52313592545285835f47d1a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"33f974a9_4c590259","in_reply_to":"29658334_e10613b2","updated":"2026-06-19 07:19:54.000000000","message":"Done","commit_id":"8d733522680d72ad9a35f2a2a5bda2ca9d76169b"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"82cce5889e60ba2e14bf1798f76f63b30df6372b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"aaf1e432_4cd86d28","updated":"2026-06-29 18:09:10.000000000","message":"run Pure Storage CI","commit_id":"b4d32fb0c6c87a7631f1aa4a874d0ed9d95abf0f"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"876c959872e22e23c34b3165512bef8f7914f0b5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"43cb51e9_ef233126","updated":"2026-07-07 13:57:20.000000000","message":"recheck","commit_id":"62b59c6550cc52956eac8da45d626e27744ad65f"}],"cinder/manager.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"36e6bf6e2782f083df8d8335e1644479e6461e57","unresolved":true,"context_lines":[{"line_number":62,"context_line":"import oslo_config.types"},{"line_number":63,"context_line":"from oslo_log import log as logging"},{"line_number":64,"context_line":"import oslo_messaging as messaging"},{"line_number":65,"context_line":"from oslo_messaging import get_rpc_client"},{"line_number":66,"context_line":"from oslo_messaging import Target"},{"line_number":67,"context_line":"from oslo_service import periodic_task"},{"line_number":68,"context_line":"from oslo_utils import timeutils"}],"source_content_type":"text/x-python","patch_set":15,"id":"3c7b236c_941a05db","line":65,"updated":"2026-07-01 14:23:32.000000000","message":"This should use Cinder’s RPC abstraction instead of importing and using oslo_messaging.get_rpc_client() directly.\nCinder already provides cinder.rpc.get_client()","commit_id":"b4d32fb0c6c87a7631f1aa4a874d0ed9d95abf0f"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"240f0cf35e92c8a8b96521090f7b1f49bc5ba0e0","unresolved":false,"context_lines":[{"line_number":62,"context_line":"import oslo_config.types"},{"line_number":63,"context_line":"from oslo_log import log as logging"},{"line_number":64,"context_line":"import oslo_messaging as messaging"},{"line_number":65,"context_line":"from oslo_messaging import get_rpc_client"},{"line_number":66,"context_line":"from oslo_messaging import Target"},{"line_number":67,"context_line":"from oslo_service import periodic_task"},{"line_number":68,"context_line":"from oslo_utils import timeutils"}],"source_content_type":"text/x-python","patch_set":15,"id":"ff2d314a_ed9231a4","line":65,"in_reply_to":"3c7b236c_941a05db","updated":"2026-07-02 09:10:53.000000000","message":"Done","commit_id":"b4d32fb0c6c87a7631f1aa4a874d0ed9d95abf0f"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"36e6bf6e2782f083df8d8335e1644479e6461e57","unresolved":true,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        ping_id \u003d str(uuid.uuid4())"},{"line_number":172,"context_line":"        timeout \u003d 5.0"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        try:"},{"line_number":175,"context_line":"            LOG.debug(\"Heartbeat: ping to %s, topic\u003d%s\","},{"line_number":176,"context_line":"                      self.host, self.RPC_HEARTBEAT_TOPIC)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1943a047_a9292915","line":173,"updated":"2026-07-01 14:23:32.000000000","message":"The heartbeat RPC timeout is currently hardcoded...\nPythontimeout \u003d 5.0. also,\nThis value may be too aggressive for large or busy deployments where the RPC executor or message broker is temporarily slow but not dead","commit_id":"b4d32fb0c6c87a7631f1aa4a874d0ed9d95abf0f"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"240f0cf35e92c8a8b96521090f7b1f49bc5ba0e0","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        ping_id \u003d str(uuid.uuid4())"},{"line_number":172,"context_line":"        timeout \u003d 5.0"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        try:"},{"line_number":175,"context_line":"            LOG.debug(\"Heartbeat: ping to %s, topic\u003d%s\","},{"line_number":176,"context_line":"                      self.host, self.RPC_HEARTBEAT_TOPIC)"}],"source_content_type":"text/x-python","patch_set":15,"id":"0319d9fc_ed4f8feb","line":173,"in_reply_to":"1943a047_a9292915","updated":"2026-07-02 09:10:53.000000000","message":"Made this configurable, with 5 seconds still being the default value.","commit_id":"b4d32fb0c6c87a7631f1aa4a874d0ed9d95abf0f"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"36e6bf6e2782f083df8d8335e1644479e6461e57","unresolved":true,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"            start \u003d time.time()"},{"line_number":186,"context_line":"            reply \u003d client.call(ctxt, \u0027ping\u0027, ping_id\u003dping_id, timeout\u003dtimeout)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"            if reply and reply.get(\u0027pong\u0027) \u003d\u003d ping_id:"},{"line_number":189,"context_line":"                LOG.debug(\"Heartbeat: ping %s replied in %.3f sec\","},{"line_number":190,"context_line":"                          ping_id, time.time() - start)"}],"source_content_type":"text/x-python","patch_set":15,"id":"a83fb180_491afc2a","line":187,"updated":"2026-07-01 14:23:32.000000000","message":"The timeout is currently passed as a keyword argument to the remote ping() method.\nThat does not set the oslo.messaging transport-level RPC timeout.","commit_id":"b4d32fb0c6c87a7631f1aa4a874d0ed9d95abf0f"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"240f0cf35e92c8a8b96521090f7b1f49bc5ba0e0","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"            start \u003d time.time()"},{"line_number":186,"context_line":"            reply \u003d client.call(ctxt, \u0027ping\u0027, ping_id\u003dping_id, timeout\u003dtimeout)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"            if reply and reply.get(\u0027pong\u0027) \u003d\u003d ping_id:"},{"line_number":189,"context_line":"                LOG.debug(\"Heartbeat: ping %s replied in %.3f sec\","},{"line_number":190,"context_line":"                          ping_id, time.time() - start)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1759a07a_bb64d94b","line":187,"in_reply_to":"a83fb180_491afc2a","updated":"2026-07-02 09:10:53.000000000","message":"Oh, indeed, that\u0027s tricky, just param orders is changing the behavior. Thanks for this review!","commit_id":"b4d32fb0c6c87a7631f1aa4a874d0ed9d95abf0f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"db33e4365f3ae1b7250f5291b1991f0e3540c8b8","unresolved":false,"context_lines":[{"line_number":62,"context_line":"import oslo_config.types"},{"line_number":63,"context_line":"from oslo_log import log as logging"},{"line_number":64,"context_line":"import oslo_messaging as messaging"},{"line_number":65,"context_line":"from oslo_messaging import get_rpc_client"},{"line_number":66,"context_line":"from oslo_messaging import Target"},{"line_number":67,"context_line":"from oslo_service import periodic_task"},{"line_number":68,"context_line":"from oslo_utils import timeutils"}],"source_content_type":"text/x-python","patch_set":17,"id":"35c1c6c4_38343d38","line":65,"updated":"2026-07-02 10:25:49.000000000","message":"pep8: F401 \u0027oslo_messaging.get_rpc_client\u0027 imported but unused","commit_id":"33f63025d842389c33d50578b57c8161da27518e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"299d8a5a52306efef9674e8498b894ede9b3dec7","unresolved":true,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"            start \u003d time.time()"},{"line_number":186,"context_line":"            reply \u003d client.call(ctxt, \u0027ping\u0027, timeout\u003dtimeout, ping_id\u003dping_id)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"            if reply and reply.get(\u0027pong\u0027) \u003d\u003d ping_id:"},{"line_number":189,"context_line":"                LOG.debug(\"Heartbeat: ping %s replied in %.3f sec\","},{"line_number":190,"context_line":"                          ping_id, time.time() - start)"}],"source_content_type":"text/x-python","patch_set":22,"id":"d507b6c6_575b969a","line":187,"updated":"2026-07-17 13:55:05.000000000","message":"timeout is still being passed as a keyword argument to the remote ping() endpoint. Keyword argument ordering does not change the behavior of RPCClient.call().\nIn oslo.messaging, arguments after method are serialized into the RPC method arguments. The client-side response timeout must be set on a prepared call context, for example...\nclient \u003d rpc.get_client(target\u003dtarget).prepare(\n    timeout\u003dself.rpc_heartbeat_timeout)\nreply \u003d client.call(ctxt, \u0027ping\u0027, ping_id\u003dping_id)","commit_id":"62b59c6550cc52956eac8da45d626e27744ad65f"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"1f6fd5ce4b4c3870c2bca910fe2fcc660bde9abb","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"            start \u003d time.time()"},{"line_number":186,"context_line":"            reply \u003d client.call(ctxt, \u0027ping\u0027, timeout\u003dtimeout, ping_id\u003dping_id)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"            if reply and reply.get(\u0027pong\u0027) \u003d\u003d ping_id:"},{"line_number":189,"context_line":"                LOG.debug(\"Heartbeat: ping %s replied in %.3f sec\","},{"line_number":190,"context_line":"                          ping_id, time.time() - start)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7049e8c7_53c05a9f","line":187,"in_reply_to":"d507b6c6_575b969a","updated":"2026-07-29 14:17:25.000000000","message":"Done","commit_id":"62b59c6550cc52956eac8da45d626e27744ad65f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e692994518206d281e41fa2ea270d8b886976f96","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            return True"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        ping_id \u003d str(uuid.uuid4())"},{"line_number":172,"context_line":"        timeout \u003d self.rpc_heartbeat_timeout"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        try:"},{"line_number":175,"context_line":"            LOG.debug(\"Heartbeat: ping to %s, topic\u003d%s\","}],"source_content_type":"text/x-python","patch_set":23,"id":"5dd65eef_fa5cc3d3","line":172,"updated":"2026-07-29 17:38:20.000000000","message":"pep8: F841 local variable \u0027timeout\u0027 is assigned to but never used","commit_id":"674251a8fc1c0125e01cef70f2c5ae550df7b85d"}],"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":"299d8a5a52306efef9674e8498b894ede9b3dec7","unresolved":true,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"service_opts \u003d ["},{"line_number":56,"context_line":"    cfg.IntOpt(\u0027rpc_hearbeat_timeout\u0027,"},{"line_number":57,"context_line":"               default\u003d5,"},{"line_number":58,"context_line":"               min\u003d2,"},{"line_number":59,"context_line":"               help\u003d\u0027Timeout (in seconds) for the RPC heartbeat ping.\u0027),"},{"line_number":60,"context_line":"    cfg.IntOpt(\u0027report_interval\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a5aa779_3e96d45f","line":57,"updated":"2026-07-17 13:55:05.000000000","message":"The new operator-facing option is spelled rpc_hearbeat_timeout, missing the second t in “heartbeat.”\nPlease rename this to rpc_heartbeat_timeout","commit_id":"62b59c6550cc52956eac8da45d626e27744ad65f"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"1f6fd5ce4b4c3870c2bca910fe2fcc660bde9abb","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"service_opts \u003d ["},{"line_number":56,"context_line":"    cfg.IntOpt(\u0027rpc_hearbeat_timeout\u0027,"},{"line_number":57,"context_line":"               default\u003d5,"},{"line_number":58,"context_line":"               min\u003d2,"},{"line_number":59,"context_line":"               help\u003d\u0027Timeout (in seconds) for the RPC heartbeat ping.\u0027),"},{"line_number":60,"context_line":"    cfg.IntOpt(\u0027report_interval\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"dc553003_5ed12c55","line":57,"in_reply_to":"9a5aa779_3e96d45f","updated":"2026-07-29 14:17:25.000000000","message":"Wow, sorry for the typo, and good catch! (fixed...)","commit_id":"62b59c6550cc52956eac8da45d626e27744ad65f"}],"cinder/tests/unit/test_heartbeat.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"843a50750290b58e44a3b2f25e8a5407c00c5b74","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            }"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        mock_prepared_client.call.side_effect \u003d mock_call"},{"line_number":48,"context_line":"        mock_get_client.return_value.prepare.return_value \u003d mock_prepared_client"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        result \u003d self.manager._rpc_heartbeat_ping()"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"60dd8764_9194e734","line":48,"updated":"2026-08-03 12:48:18.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"9c6decd9a9deb6e3e84f751ba03d3fb50af40bff"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"843a50750290b58e44a3b2f25e8a5407c00c5b74","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def test_rpc_heartbeat_ping_timeout(self, mock_get_client):"},{"line_number":65,"context_line":"        mock_prepared_client \u003d mock.Mock()"},{"line_number":66,"context_line":"        mock_prepared_client.call.side_effect \u003d Exception(\"RPC timeout\")"},{"line_number":67,"context_line":"        mock_get_client.return_value.prepare.return_value \u003d mock_prepared_client"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        result \u003d self.manager._rpc_heartbeat_ping()"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"73790c6c_eda9b9a3","line":67,"updated":"2026-08-03 12:48:18.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"9c6decd9a9deb6e3e84f751ba03d3fb50af40bff"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"843a50750290b58e44a3b2f25e8a5407c00c5b74","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def test_is_working_invalid_pong(self, mock_get_client):"},{"line_number":75,"context_line":"        mock_prepared_client \u003d mock.Mock()"},{"line_number":76,"context_line":"        mock_prepared_client.call.return_value \u003d {\u0027pong\u0027: \u0027wrong-id\u0027}"},{"line_number":77,"context_line":"        mock_get_client.return_value.prepare.return_value \u003d mock_prepared_client"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        result \u003d self.manager._rpc_heartbeat_ping()"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"c885b89e_18e0f17f","line":77,"updated":"2026-08-03 12:48:18.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"9c6decd9a9deb6e3e84f751ba03d3fb50af40bff"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"843a50750290b58e44a3b2f25e8a5407c00c5b74","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \"\"\"Test heartbeat ping with None reply.\"\"\""},{"line_number":86,"context_line":"        mock_prepared_client \u003d mock.Mock()"},{"line_number":87,"context_line":"        mock_prepared_client.call.return_value \u003d None"},{"line_number":88,"context_line":"        mock_get_client.return_value.prepare.return_value \u003d mock_prepared_client"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        result \u003d self.manager._rpc_heartbeat_ping()"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"3071b034_52e57059","line":88,"updated":"2026-08-03 12:48:18.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"9c6decd9a9deb6e3e84f751ba03d3fb50af40bff"}],"releasenotes/notes/heartbeats-with-rpc-ping-23725271a1dfbc7e.yaml":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"3a9edfe18d15475bdc1d5e5efdd502ad91656aeb","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A specific thread is used to transmit heartbeats. Unfortunately, in some"},{"line_number":5,"context_line":"    situations, the thread cloud have been alive and (falsly) report the"},{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"9c72d843_db223ea3","line":5,"range":{"start_line":5,"start_character":27,"end_line":5,"end_character":33},"updated":"2026-01-21 14:48:59.000000000","message":"nit: could","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"3a9edfe18d15475bdc1d5e5efdd502ad91656aeb","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A specific thread is used to transmit heartbeats. Unfortunately, in some"},{"line_number":5,"context_line":"    situations, the thread cloud have been alive and (falsly) report the"},{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"b03e9da1_c2759842","line":5,"range":{"start_line":5,"start_character":54,"end_line":5,"end_character":60},"updated":"2026-01-21 14:48:59.000000000","message":"nit: falsely","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"93dcb1484b5d0f500eb95a001d239d510adb6733","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A specific thread is used to transmit heartbeats. Unfortunately, in some"},{"line_number":5,"context_line":"    situations, the thread cloud have been alive and (falsly) report the"},{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"00b2a532_9aa88a41","line":5,"range":{"start_line":5,"start_character":27,"end_line":5,"end_character":33},"in_reply_to":"9c72d843_db223ea3","updated":"2026-01-22 13:25:16.000000000","message":"Done","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"fbd0fbac319ce8114987770dad63a39ab321526c","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A specific thread is used to transmit heartbeats. Unfortunately, in some"},{"line_number":5,"context_line":"    situations, the thread cloud have been alive and (falsly) report the"},{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"580f1666_583f90b4","line":5,"range":{"start_line":5,"start_character":27,"end_line":5,"end_character":33},"in_reply_to":"9c72d843_db223ea3","updated":"2026-01-22 14:33:24.000000000","message":"Done","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"fbd0fbac319ce8114987770dad63a39ab321526c","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A specific thread is used to transmit heartbeats. Unfortunately, in some"},{"line_number":5,"context_line":"    situations, the thread cloud have been alive and (falsly) report the"},{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"31f96207_d5992ee6","line":5,"range":{"start_line":5,"start_character":54,"end_line":5,"end_character":60},"in_reply_to":"b03e9da1_c2759842","updated":"2026-01-22 14:33:24.000000000","message":"Done","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"93dcb1484b5d0f500eb95a001d239d510adb6733","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A specific thread is used to transmit heartbeats. Unfortunately, in some"},{"line_number":5,"context_line":"    situations, the thread cloud have been alive and (falsly) report the"},{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"d152e09d_8640b28e","line":5,"range":{"start_line":5,"start_character":54,"end_line":5,"end_character":60},"in_reply_to":"b03e9da1_c2759842","updated":"2026-01-22 13:25:16.000000000","message":"Done","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"3a9edfe18d15475bdc1d5e5efdd502ad91656aeb","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    A specific thread is used to transmit heartbeats. Unfortunately, in some"},{"line_number":5,"context_line":"    situations, the thread cloud have been alive and (falsly) report the"},{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"},{"line_number":9,"context_line":"    been implemented the cinder-scheduler, cinder-bakcup and cinder-volume"},{"line_number":10,"context_line":"    services."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"0bb88254_11757490","line":7,"range":{"start_line":7,"start_character":4,"end_line":7,"end_character":18},"updated":"2026-01-21 14:48:59.000000000","message":"service threads reads better","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"93dcb1484b5d0f500eb95a001d239d510adb6733","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    A specific thread is used to transmit heartbeats. Unfortunately, in some"},{"line_number":5,"context_line":"    situations, the thread cloud have been alive and (falsly) report the"},{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"},{"line_number":9,"context_line":"    been implemented the cinder-scheduler, cinder-bakcup and cinder-volume"},{"line_number":10,"context_line":"    services."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"8c35cbfe_3a1b5031","line":7,"range":{"start_line":7,"start_character":4,"end_line":7,"end_character":18},"in_reply_to":"0bb88254_11757490","updated":"2026-01-22 13:25:16.000000000","message":"Done","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"fbd0fbac319ce8114987770dad63a39ab321526c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    A specific thread is used to transmit heartbeats. Unfortunately, in some"},{"line_number":5,"context_line":"    situations, the thread cloud have been alive and (falsly) report the"},{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"},{"line_number":9,"context_line":"    been implemented the cinder-scheduler, cinder-bakcup and cinder-volume"},{"line_number":10,"context_line":"    services."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"c445aac9_85286d5c","line":7,"range":{"start_line":7,"start_character":4,"end_line":7,"end_character":18},"in_reply_to":"0bb88254_11757490","updated":"2026-01-22 14:33:24.000000000","message":"Done","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"3a9edfe18d15475bdc1d5e5efdd502ad91656aeb","unresolved":true,"context_lines":[{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"},{"line_number":9,"context_line":"    been implemented the cinder-scheduler, cinder-bakcup and cinder-volume"},{"line_number":10,"context_line":"    services."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"d40b79d6_81c5274a","line":9,"range":{"start_line":9,"start_character":50,"end_line":9,"end_character":57},"updated":"2026-01-21 14:48:59.000000000","message":"nit: backup","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"3a9edfe18d15475bdc1d5e5efdd502ad91656aeb","unresolved":true,"context_lines":[{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"},{"line_number":9,"context_line":"    been implemented the cinder-scheduler, cinder-bakcup and cinder-volume"},{"line_number":10,"context_line":"    services."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"d213010a_9a1bbd90","line":9,"range":{"start_line":9,"start_character":20,"end_line":9,"end_character":21},"updated":"2026-01-21 14:48:59.000000000","message":"nit: missing \u0027in\u0027","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"93dcb1484b5d0f500eb95a001d239d510adb6733","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"},{"line_number":9,"context_line":"    been implemented the cinder-scheduler, cinder-bakcup and cinder-volume"},{"line_number":10,"context_line":"    services."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"2b106f51_279df6e4","line":9,"range":{"start_line":9,"start_character":20,"end_line":9,"end_character":21},"in_reply_to":"d213010a_9a1bbd90","updated":"2026-01-22 13:25:16.000000000","message":"Done","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"fbd0fbac319ce8114987770dad63a39ab321526c","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"},{"line_number":9,"context_line":"    been implemented the cinder-scheduler, cinder-bakcup and cinder-volume"},{"line_number":10,"context_line":"    services."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"f9502350_731db6c3","line":9,"range":{"start_line":9,"start_character":20,"end_line":9,"end_character":21},"in_reply_to":"d213010a_9a1bbd90","updated":"2026-01-22 14:33:24.000000000","message":"Done","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"93dcb1484b5d0f500eb95a001d239d510adb6733","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"},{"line_number":9,"context_line":"    been implemented the cinder-scheduler, cinder-bakcup and cinder-volume"},{"line_number":10,"context_line":"    services."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"1aabd72e_28074854","line":9,"range":{"start_line":9,"start_character":50,"end_line":9,"end_character":57},"in_reply_to":"d40b79d6_81c5274a","updated":"2026-01-22 13:25:16.000000000","message":"Done","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"fbd0fbac319ce8114987770dad63a39ab321526c","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    Cinder services as up-and-running. Now, the heartbeat thread pings the"},{"line_number":7,"context_line":"    living threads with an RPC call to make sure they are alive, so it can"},{"line_number":8,"context_line":"    correctly report if the main thread is working or not. This logic has"},{"line_number":9,"context_line":"    been implemented the cinder-scheduler, cinder-bakcup and cinder-volume"},{"line_number":10,"context_line":"    services."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"cb2afcbf_ed3f760a","line":9,"range":{"start_line":9,"start_character":50,"end_line":9,"end_character":57},"in_reply_to":"d40b79d6_81c5274a","updated":"2026-01-22 14:33:24.000000000","message":"Done","commit_id":"d208e3c825d75ed363fd9a7e345c22dac5299571"}]}
