)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"7392d464555921cae5df4204d6fb859270ed85ba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"3f68d727_f511f35e","updated":"2025-10-10 10:21:50.000000000","message":"gaaaah forgot to mock requests in other tests","commit_id":"7c15144931756324f10ff0355597670e8efe0552"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"f4ffe239e0044b4d11dc54323aff0259eb259407","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"0fdcf984_4fd48bad","updated":"2025-10-10 13:01:33.000000000","message":"recheck might not work as expected","commit_id":"e0e2b3e857d00df9be1f3cd1a24b98ec1522fca9"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"44f0ea012f111524be50c4dda554874758cbadc2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a3b7713b_eed559bd","updated":"2025-10-10 13:19:25.000000000","message":"this is actually checking the advertised ip of the agent, but we need to check the ironic api url","commit_id":"e0e2b3e857d00df9be1f3cd1a24b98ec1522fca9"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"3937a259e522d1cfdbf690166ef6fd5dc4780d5f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"879e10ba_0b581182","updated":"2025-11-05 22:46:43.000000000","message":"Comment needs to be addressed; please also add a release note.","commit_id":"9dc563cf575fca994d08516206f2e9ee6c18fecd"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"3af88f981e170033f20848875e7ec445672722a0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e4ac3580_6a4af39d","in_reply_to":"879e10ba_0b581182","updated":"2025-11-06 15:24:18.000000000","message":"Acknowledged","commit_id":"9dc563cf575fca994d08516206f2e9ee6c18fecd"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"22d95531323e74e8a40b5d3111efea019657e485","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"aa33f9ca_ab0f65a9","updated":"2025-11-07 10:03:13.000000000","message":"recheck node failure?","commit_id":"1dcf742c77df1323d418f9c2bdab8807fc4fdd5b"}],"ironic_python_agent/agent.py":[{"author":{"_account_id":34564,"name":"Yamato Tanaka","email":"yatanaka@redhat.com","username":"yatanaka-1007"},"change_message_id":"40dcfb6f08f8da72fb0d44bc88d17ec05b60b252","unresolved":true,"context_lines":[{"line_number":312,"context_line":"        \"\"\""},{"line_number":313,"context_line":"        test_urls \u003d ["},{"line_number":314,"context_line":"            \u0027http://{}\u0027.format(ip_address),"},{"line_number":315,"context_line":"            \u0027https://{}\u0027.format(ip_address),"},{"line_number":316,"context_line":"        ]"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        for url in test_urls:"}],"source_content_type":"text/x-python","patch_set":5,"id":"4833861f_8d00f978","line":315,"updated":"2025-10-16 04:35:08.000000000","message":"self.api_urls should has the whole URL, like the following example:\n\n```\n[DEFAULT]\napi_url \u003d https://192.168.0.1:6385,https://[2001:db8::1]:6385\n```\n\nDo we need to extract the IP address from it and append http:// or https:// again here?","commit_id":"66ac8a291b4a5dc6b5d3735778e3ae17b24ac60e"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"02a922ca53e01ef440533b5b6c461baea074ead8","unresolved":true,"context_lines":[{"line_number":312,"context_line":"        \"\"\""},{"line_number":313,"context_line":"        test_urls \u003d ["},{"line_number":314,"context_line":"            \u0027http://{}\u0027.format(ip_address),"},{"line_number":315,"context_line":"            \u0027https://{}\u0027.format(ip_address),"},{"line_number":316,"context_line":"        ]"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        for url in test_urls:"}],"source_content_type":"text/x-python","patch_set":5,"id":"933658fe_736d79d3","line":315,"in_reply_to":"4833861f_8d00f978","updated":"2025-10-16 13:31:39.000000000","message":"I\u0027m not sure what you mean by \"the whole URL\"\nip_address is the ip we\u0027re trying to reach, and all the ips contained in the api_url entry are tested","commit_id":"66ac8a291b4a5dc6b5d3735778e3ae17b24ac60e"},{"author":{"_account_id":34564,"name":"Yamato Tanaka","email":"yatanaka@redhat.com","username":"yatanaka-1007"},"change_message_id":"0d6a414b55726972d01ca137d0cf612e1a075a5c","unresolved":false,"context_lines":[{"line_number":312,"context_line":"        \"\"\""},{"line_number":313,"context_line":"        test_urls \u003d ["},{"line_number":314,"context_line":"            \u0027http://{}\u0027.format(ip_address),"},{"line_number":315,"context_line":"            \u0027https://{}\u0027.format(ip_address),"},{"line_number":316,"context_line":"        ]"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        for url in test_urls:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7159c61d_57814919","line":315,"in_reply_to":"933658fe_736d79d3","updated":"2025-10-27 00:08:10.000000000","message":"I was just wondering why _test_ip_reachability receives \"ip_address\" rather than using \"self.api_url\".\nWell, but I\u0027m sorry I might be wrong. Please ignore my comment.","commit_id":"66ac8a291b4a5dc6b5d3735778e3ae17b24ac60e"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"3937a259e522d1cfdbf690166ef6fd5dc4780d5f","unresolved":true,"context_lines":[{"line_number":319,"context_line":"            try:"},{"line_number":320,"context_line":"                # Use a short timeout to avoid hanging"},{"line_number":321,"context_line":"                # Disable SSL verification for reachability testing only"},{"line_number":322,"context_line":"                response \u003d requests.get(url, timeout\u003d5, verify\u003dFalse)  # nosec"},{"line_number":323,"context_line":"                # Any HTTP response (even 404, 500, etc.) indicates"},{"line_number":324,"context_line":"                # reachability"},{"line_number":325,"context_line":"                LOG.debug(\u0027IP %s is reachable via %s (status: %s)\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"14694eeb_3aa72cf5","line":322,"updated":"2025-11-05 22:46:43.000000000","message":"Actual queries use a *much* longer timeout. Should we be concerned this would lead to false negative results?","commit_id":"9dc563cf575fca994d08516206f2e9ee6c18fecd"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"3af88f981e170033f20848875e7ec445672722a0","unresolved":true,"context_lines":[{"line_number":319,"context_line":"            try:"},{"line_number":320,"context_line":"                # Use a short timeout to avoid hanging"},{"line_number":321,"context_line":"                # Disable SSL verification for reachability testing only"},{"line_number":322,"context_line":"                response \u003d requests.get(url, timeout\u003d5, verify\u003dFalse)  # nosec"},{"line_number":323,"context_line":"                # Any HTTP response (even 404, 500, etc.) indicates"},{"line_number":324,"context_line":"                # reachability"},{"line_number":325,"context_line":"                LOG.debug(\u0027IP %s is reachable via %s (status: %s)\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"4f7ecaeb_b247f06c","line":322,"in_reply_to":"14694eeb_3aa72cf5","updated":"2025-11-06 15:24:18.000000000","message":"mmm yeah, the default timeout is 30 seconds, which is a lot IMHO, we\u0027re just testing for dead connections here, not slow response times.\nAnyway, if we\u0027re concerned about the discrepancy we could just set this timeout to the same value of CONF.http_request_timeout\nwdyt?","commit_id":"9dc563cf575fca994d08516206f2e9ee6c18fecd"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"019d23c17541e80fae089f0d61dcd63e8c491ed6","unresolved":false,"context_lines":[{"line_number":319,"context_line":"            try:"},{"line_number":320,"context_line":"                # Use a short timeout to avoid hanging"},{"line_number":321,"context_line":"                # Disable SSL verification for reachability testing only"},{"line_number":322,"context_line":"                response \u003d requests.get(url, timeout\u003d5, verify\u003dFalse)  # nosec"},{"line_number":323,"context_line":"                # Any HTTP response (even 404, 500, etc.) indicates"},{"line_number":324,"context_line":"                # reachability"},{"line_number":325,"context_line":"                LOG.debug(\u0027IP %s is reachable via %s (status: %s)\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"4b21830e_a37d271d","line":322,"in_reply_to":"1b74b465_0766f961","updated":"2025-11-06 17:01:32.000000000","message":"Done","commit_id":"9dc563cf575fca994d08516206f2e9ee6c18fecd"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"c10487bf75bb0230dcec0115bdcbbf9485eea569","unresolved":true,"context_lines":[{"line_number":319,"context_line":"            try:"},{"line_number":320,"context_line":"                # Use a short timeout to avoid hanging"},{"line_number":321,"context_line":"                # Disable SSL verification for reachability testing only"},{"line_number":322,"context_line":"                response \u003d requests.get(url, timeout\u003d5, verify\u003dFalse)  # nosec"},{"line_number":323,"context_line":"                # Any HTTP response (even 404, 500, etc.) indicates"},{"line_number":324,"context_line":"                # reachability"},{"line_number":325,"context_line":"                LOG.debug(\u0027IP %s is reachable via %s (status: %s)\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1b74b465_0766f961","line":322,"in_reply_to":"4f7ecaeb_b247f06c","updated":"2025-11-06 15:36:46.000000000","message":"CONF.http_request_timeout SGTM","commit_id":"9dc563cf575fca994d08516206f2e9ee6c18fecd"}],"releasenotes/notes/heartbeat-retry-connection-errors-689f2d3b9276d399.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"70e8b27d2a1b09b576264c33f095897712b9ef15","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds automatic retry logic to heartbeat requests to handle transient"},{"line_number":5,"context_line":"    connection errors. When a heartbeat fails with a ``ConnectionError``"},{"line_number":6,"context_line":"    (such as remote disconnection or dead connection pool connections),"},{"line_number":7,"context_line":"    the agent will now automatically retry up to 3 times with exponential"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"38005f81_e12c8b32","line":4,"updated":"2025-11-10 14:58:11.000000000","message":"Hmm, this looks entirely unrelated to me. Wrong file added?","commit_id":"1dcf742c77df1323d418f9c2bdab8807fc4fdd5b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"c2af47c93b39fdd648e021db67e55ddfe53dfaef","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds automatic retry logic to heartbeat requests to handle transient"},{"line_number":5,"context_line":"    connection errors. When a heartbeat fails with a ``ConnectionError``"},{"line_number":6,"context_line":"    (such as remote disconnection or dead connection pool connections),"},{"line_number":7,"context_line":"    the agent will now automatically retry up to 3 times with exponential"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"008d6690_6cd348b3","line":4,"in_reply_to":"38005f81_e12c8b32","updated":"2025-11-10 15:18:47.000000000","message":"yep, old implementation, fixed","commit_id":"1dcf742c77df1323d418f9c2bdab8807fc4fdd5b"}]}
