)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1004,"name":"Mohammed Naser","email":"mnaser@vexxhost.com","username":"mnaser"},"change_message_id":"eda17e8499e6611c5c43180435564c53c9ab9d4f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"07d21d94_2f9c0af8","updated":"2024-11-13 14:05:50.000000000","message":"My concern with this patch is that there\u0027s no mechanism of making this not something that ends up \"running loose\".\n\nIf for some reason an Amphora fails to come up again and goes back to ERROR state, it will just keep \"looping\" and retrying and potentially DoS the cloud, I think we need to introduce a mechanism that would try N times and stop after N times (and then if it succeeds, reset the counter somehow).","commit_id":"81ef2c6ca58b7ce9e0314a208f19585856966598"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"e90d39082d0b0f73b45ac472bd093a4515f1bebc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"1cbee377_3e9d311b","in_reply_to":"07d21d94_2f9c0af8","updated":"2024-11-13 18:11:41.000000000","message":"Yes, this is the exact reason we currently only attempt one automatic failover and ERROR is a terminal state requiring investigation and a manual failover.","commit_id":"81ef2c6ca58b7ce9e0314a208f19585856966598"},{"author":{"_account_id":1004,"name":"Mohammed Naser","email":"mnaser@vexxhost.com","username":"mnaser"},"change_message_id":"12f531b2dfbcc12711e124bad0e16efc59dc7e9a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"0b0e5546_c056fb84","in_reply_to":"1cbee377_3e9d311b","updated":"2024-11-15 02:08:34.000000000","message":"The thing is I\u0027ve seen scenarios where it goes straight into provisioning state ERROR to be honest.","commit_id":"81ef2c6ca58b7ce9e0314a208f19585856966598"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"d86dfda8903b0d2104f0eeda4c63b23e1867a30e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"61f63e4e_4e5c0eae","updated":"2024-11-18 15:36:05.000000000","message":"I added retry limit in patch","commit_id":"4a639f5c0f75cc5e58adf2e247808836de9a0d23"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"9bdfa5aa7c1f86995d49609613b4cd1285c63bab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"f9993ce0_93430427","updated":"2026-03-19 08:21:01.000000000","message":"@ricolin@ricolky.com @mnaser@vexxhost.com do you still plan to work on this feature? I\u0027ve seen many requests for a similar feature in the last months.","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"},{"author":{"_account_id":38360,"name":"Zachary Mark Raines","display_name":"Zachary Raines","email":"zachary.raines@canonical.com","username":"raineszm","status":"Sustaining Engineer @ Canonical"},"change_message_id":"2646022b21200d39e29442a09af04d9ec6c71afd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"d1a6051a_1dbf52f0","updated":"2025-12-09 19:03:55.000000000","message":"Some suggestions on docstrings and release notes, but otherwise seems good to me so far.","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"ab79545a64e994ed6edddd4333bb680908bde1bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"dcb31a5e_16239eee","updated":"2025-11-26 14:51:00.000000000","message":"We discussed this feature at the PTG in October\nTBH I like this idea, but we think that it should have a configurable (and increasing) delay between each attempt. What do you think about it?","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"da00b092efc2e92e34bcd4b654fd305d44dc3d5e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"422ab585_43f7f6a9","updated":"2024-12-18 06:54:45.000000000","message":"bump","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"780cbeb290e23ae0448eff153a30317e670ea4ab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"648e8b4f_52593ea7","updated":"2025-02-25 04:40:48.000000000","message":"bump","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"4ea1f0f8a6332c915c4677dce9727be33f8fc0fc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"cdc7c696_39f708df","in_reply_to":"f9993ce0_93430427","updated":"2026-04-21 03:17:03.000000000","message":"Hey good to hear that\u0027s also useful for some other users. Just updated 😉","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"2c503b9e9f0b4bdeddebb9f75442585f32815dc8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"2204e0b3_0dda79ed","updated":"2026-04-23 04:04:32.000000000","message":"This is the version with db change","commit_id":"d3aade31d7e138a9afe43eb52ac308b025fb528b"}],"octavia/common/config.py":[{"author":{"_account_id":38360,"name":"Zachary Mark Raines","display_name":"Zachary Raines","email":"zachary.raines@canonical.com","username":"raineszm","status":"Sustaining Engineer @ Canonical"},"change_message_id":"2646022b21200d39e29442a09af04d9ec6c71afd","unresolved":true,"context_lines":[{"line_number":309,"context_line":"               default\u003d10,"},{"line_number":310,"context_line":"               mutable\u003dTrue,"},{"line_number":311,"context_line":"               help\u003d_(\u0027Sleep time between sending heartbeats.\u0027)),"},{"line_number":312,"context_line":"    cfg.BoolOpt(\u0027failover_on_error\u0027, default\u003dFalse,"},{"line_number":313,"context_line":"                help\u003d_(\u0027Set this to True to allow failover when amphora \u0027"},{"line_number":314,"context_line":"                       \u0027status in Error. Beware that, try to performing \u0027"},{"line_number":315,"context_line":"                       \u0027failover when ERROR status might not help to solve \u0027"},{"line_number":316,"context_line":"                       \u0027the ERROR status for Amphora. \u0027"},{"line_number":317,"context_line":"                       \u0027So use this option with caution.\u0027)),"},{"line_number":318,"context_line":"    cfg.IntOpt(\u0027failover_on_error_max_retries\u0027,"},{"line_number":319,"context_line":"               default\u003d3,"},{"line_number":320,"context_line":"               min\u003d-1,"}],"source_content_type":"text/x-python","patch_set":9,"id":"77ffc72b_dcf31454","line":317,"range":{"start_line":312,"start_character":0,"end_line":317,"end_character":60},"updated":"2025-12-09 19:03:55.000000000","message":"Some minor docstring edits for clarity\n\n```suggestion\n    cfg.BoolOpt(\u0027failover_on_error\u0027, default\u003dFalse,\n                help\u003d_(\u0027Set this to True to allow automatic failover when \u0027\n                       \u0027an amphora has status of ERROR. Beware that performing \u0027\n                       \u0027failover when in ERROR status might not resolve \u0027\n                       \u0027the ERROR for the amphora. \u0027\n                       \u0027So use this option with caution.\u0027)),\n```","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"086858efb9f986c9a0f6c3f7c3c8c411d108047f","unresolved":false,"context_lines":[{"line_number":309,"context_line":"               default\u003d10,"},{"line_number":310,"context_line":"               mutable\u003dTrue,"},{"line_number":311,"context_line":"               help\u003d_(\u0027Sleep time between sending heartbeats.\u0027)),"},{"line_number":312,"context_line":"    cfg.BoolOpt(\u0027failover_on_error\u0027, default\u003dFalse,"},{"line_number":313,"context_line":"                help\u003d_(\u0027Set this to True to allow failover when amphora \u0027"},{"line_number":314,"context_line":"                       \u0027status in Error. Beware that, try to performing \u0027"},{"line_number":315,"context_line":"                       \u0027failover when ERROR status might not help to solve \u0027"},{"line_number":316,"context_line":"                       \u0027the ERROR status for Amphora. \u0027"},{"line_number":317,"context_line":"                       \u0027So use this option with caution.\u0027)),"},{"line_number":318,"context_line":"    cfg.IntOpt(\u0027failover_on_error_max_retries\u0027,"},{"line_number":319,"context_line":"               default\u003d3,"},{"line_number":320,"context_line":"               min\u003d-1,"}],"source_content_type":"text/x-python","patch_set":9,"id":"490f18c6_d85fb22f","line":317,"range":{"start_line":312,"start_character":0,"end_line":317,"end_character":60},"in_reply_to":"77ffc72b_dcf31454","updated":"2026-04-21 03:16:00.000000000","message":"Done","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"},{"author":{"_account_id":38360,"name":"Zachary Mark Raines","display_name":"Zachary Raines","email":"zachary.raines@canonical.com","username":"raineszm","status":"Sustaining Engineer @ Canonical"},"change_message_id":"2646022b21200d39e29442a09af04d9ec6c71afd","unresolved":true,"context_lines":[{"line_number":318,"context_line":"    cfg.IntOpt(\u0027failover_on_error_max_retries\u0027,"},{"line_number":319,"context_line":"               default\u003d3,"},{"line_number":320,"context_line":"               min\u003d-1,"},{"line_number":321,"context_line":"               help\u003d_(\u0027Retry threshold for failover on an ERROR amphora.\u0027"},{"line_number":322,"context_line":"                      \u0027Setting \"-1\" to remove the threshold.\u0027)),"},{"line_number":323,"context_line":"]"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"oslo_messaging_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":9,"id":"7ce99634_c24ebf9f","line":322,"range":{"start_line":321,"start_character":24,"end_line":322,"end_character":64},"updated":"2025-12-09 19:03:55.000000000","message":"\u003caybe\n\n```suggestion\n               help\u003d_(\u0027The maximum number of times to \u0027\n               \t      \u0027automatic or failover of an amphora \u0027\n               \t      \u0027in an ERROR state. \u0027\n                      \u0027Setting \"-1\" to remove the threshold.\u0027)),\n```","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"086858efb9f986c9a0f6c3f7c3c8c411d108047f","unresolved":false,"context_lines":[{"line_number":318,"context_line":"    cfg.IntOpt(\u0027failover_on_error_max_retries\u0027,"},{"line_number":319,"context_line":"               default\u003d3,"},{"line_number":320,"context_line":"               min\u003d-1,"},{"line_number":321,"context_line":"               help\u003d_(\u0027Retry threshold for failover on an ERROR amphora.\u0027"},{"line_number":322,"context_line":"                      \u0027Setting \"-1\" to remove the threshold.\u0027)),"},{"line_number":323,"context_line":"]"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"oslo_messaging_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":9,"id":"945056e0_c3f8fa6b","line":322,"range":{"start_line":321,"start_character":24,"end_line":322,"end_character":64},"in_reply_to":"7ce99634_c24ebf9f","updated":"2026-04-21 03:16:00.000000000","message":"Done","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"}],"octavia/controller/worker/v2/controller_worker.py":[{"author":{"_account_id":38360,"name":"Zachary Mark Raines","display_name":"Zachary Raines","email":"zachary.raines@canonical.com","username":"raineszm","status":"Sustaining Engineer @ Canonical"},"change_message_id":"2646022b21200d39e29442a09af04d9ec6c71afd","unresolved":true,"context_lines":[{"line_number":986,"context_line":""},{"line_number":987,"context_line":"        :param amphora_id: ID for amphora to failover"},{"line_number":988,"context_line":"        :param reraise: If enabled reraise any caught exception"},{"line_number":989,"context_line":"        :param count_error_retries: If enabled allows counts Amphora failover"},{"line_number":990,"context_line":"            on ERROR status"},{"line_number":991,"context_line":"        :returns: None"},{"line_number":992,"context_line":"        :raises octavia.common.exceptions.NotFound: The referenced amphora was"},{"line_number":993,"context_line":"                                                    not found"}],"source_content_type":"text/x-python","patch_set":9,"id":"56954e95_7e39923e","line":990,"range":{"start_line":989,"start_character":47,"end_line":990,"end_character":27},"updated":"2025-12-09 19:03:55.000000000","message":"```suggestion\n        :param count_error_retries: If enabled counts the number of times failover has been retried in an ERROR state.\n```","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"086858efb9f986c9a0f6c3f7c3c8c411d108047f","unresolved":false,"context_lines":[{"line_number":986,"context_line":""},{"line_number":987,"context_line":"        :param amphora_id: ID for amphora to failover"},{"line_number":988,"context_line":"        :param reraise: If enabled reraise any caught exception"},{"line_number":989,"context_line":"        :param count_error_retries: If enabled allows counts Amphora failover"},{"line_number":990,"context_line":"            on ERROR status"},{"line_number":991,"context_line":"        :returns: None"},{"line_number":992,"context_line":"        :raises octavia.common.exceptions.NotFound: The referenced amphora was"},{"line_number":993,"context_line":"                                                    not found"}],"source_content_type":"text/x-python","patch_set":9,"id":"e4ae845f_63986e3e","line":990,"range":{"start_line":989,"start_character":47,"end_line":990,"end_character":27},"in_reply_to":"56954e95_7e39923e","updated":"2026-04-21 03:16:00.000000000","message":"Done","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"}],"octavia/controller/worker/v2/tasks/database_tasks.py":[{"author":{"_account_id":38360,"name":"Zachary Mark Raines","display_name":"Zachary Raines","email":"zachary.raines@canonical.com","username":"raineszm","status":"Sustaining Engineer @ Canonical"},"change_message_id":"2646022b21200d39e29442a09af04d9ec6c71afd","unresolved":true,"context_lines":[{"line_number":103,"context_line":"                load_balancer_id\u003dloadbalancer_id,"},{"line_number":104,"context_line":"                status\u003dconstants.PENDING_CREATE,"},{"line_number":105,"context_line":"                cert_busy\u003dFalse,"},{"line_number":106,"context_line":"                **kwargs)"},{"line_number":107,"context_line":"        if loadbalancer_id:"},{"line_number":108,"context_line":"            LOG.info(\"Created Amphora %s in DB for load balancer %s\","},{"line_number":109,"context_line":"                     amphora.id, loadbalancer_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"a1b6797c_dfa60017","line":106,"updated":"2025-12-09 19:03:55.000000000","message":"Is adding **kwargs here specifically related to this feature, or is this something that should have been present already?","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"086858efb9f986c9a0f6c3f7c3c8c411d108047f","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                load_balancer_id\u003dloadbalancer_id,"},{"line_number":104,"context_line":"                status\u003dconstants.PENDING_CREATE,"},{"line_number":105,"context_line":"                cert_busy\u003dFalse,"},{"line_number":106,"context_line":"                **kwargs)"},{"line_number":107,"context_line":"        if loadbalancer_id:"},{"line_number":108,"context_line":"            LOG.info(\"Created Amphora %s in DB for load balancer %s\","},{"line_number":109,"context_line":"                     amphora.id, loadbalancer_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9446c4e6_66a6466f","line":106,"in_reply_to":"a1b6797c_dfa60017","updated":"2026-04-21 03:16:00.000000000","message":"IMO, this is something we should have done, but let\u0027s skip this update for now so we can focus on the rest functions","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"}],"octavia/db/repositories.py":[{"author":{"_account_id":1004,"name":"Mohammed Naser","email":"mnaser@vexxhost.com","username":"mnaser"},"change_message_id":"eda17e8499e6611c5c43180435564c53c9ab9d4f","unresolved":true,"context_lines":[{"line_number":1607,"context_line":"        # i.e. Not DELETED, PENDING_*, etc."},{"line_number":1608,"context_line":"        # If CONF.health_manager.failover_on_error is set, we will allow"},{"line_number":1609,"context_line":"        # performing failover when Amphora on error status."},{"line_number":1610,"context_line":"        allow_stats \u003d ["},{"line_number":1611,"context_line":"            consts.AMPHORA_ALLOCATED,"},{"line_number":1612,"context_line":"            consts.AMPHORA_FAILOVER_STOPPED"},{"line_number":1613,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":2,"id":"b2ad5f5f_f85c329b","line":1610,"updated":"2024-11-13 14:05:50.000000000","message":"Let\u0027s rename this to allowed_status since it\u0027s not really stats.","commit_id":"81ef2c6ca58b7ce9e0314a208f19585856966598"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"573eee257c8d274185ab189edc0cfd5d6ab8ee47","unresolved":false,"context_lines":[{"line_number":1607,"context_line":"        # i.e. Not DELETED, PENDING_*, etc."},{"line_number":1608,"context_line":"        # If CONF.health_manager.failover_on_error is set, we will allow"},{"line_number":1609,"context_line":"        # performing failover when Amphora on error status."},{"line_number":1610,"context_line":"        allow_stats \u003d ["},{"line_number":1611,"context_line":"            consts.AMPHORA_ALLOCATED,"},{"line_number":1612,"context_line":"            consts.AMPHORA_FAILOVER_STOPPED"},{"line_number":1613,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":2,"id":"88f2547c_5b0f93e3","line":1610,"in_reply_to":"b2ad5f5f_f85c329b","updated":"2024-11-18 15:31:24.000000000","message":"Done","commit_id":"81ef2c6ca58b7ce9e0314a208f19585856966598"},{"author":{"_account_id":38360,"name":"Zachary Mark Raines","display_name":"Zachary Raines","email":"zachary.raines@canonical.com","username":"raineszm","status":"Sustaining Engineer @ Canonical"},"change_message_id":"2646022b21200d39e29442a09af04d9ec6c71afd","unresolved":true,"context_lines":[{"line_number":1608,"context_line":"        # currently in the ALLOCATED or FAILOVER_STOPPED state."},{"line_number":1609,"context_line":"        # i.e. Not DELETED, PENDING_*, etc."},{"line_number":1610,"context_line":"        # But if CONF.health_manager.failover_on_error is set, we will allow"},{"line_number":1611,"context_line":"        # performing failover when Amphora on ERROR status with certain"},{"line_number":1612,"context_line":"        # conditions."},{"line_number":1613,"context_line":"        allow_status \u003d ["},{"line_number":1614,"context_line":"            consts.AMPHORA_ALLOCATED,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7b748ae6_f8732325","line":1611,"updated":"2025-12-09 19:03:55.000000000","message":"```suggestion\n        # performing failover when amphora are in ERROR state with certain\n```","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"086858efb9f986c9a0f6c3f7c3c8c411d108047f","unresolved":false,"context_lines":[{"line_number":1608,"context_line":"        # currently in the ALLOCATED or FAILOVER_STOPPED state."},{"line_number":1609,"context_line":"        # i.e. Not DELETED, PENDING_*, etc."},{"line_number":1610,"context_line":"        # But if CONF.health_manager.failover_on_error is set, we will allow"},{"line_number":1611,"context_line":"        # performing failover when Amphora on ERROR status with certain"},{"line_number":1612,"context_line":"        # conditions."},{"line_number":1613,"context_line":"        allow_status \u003d ["},{"line_number":1614,"context_line":"            consts.AMPHORA_ALLOCATED,"}],"source_content_type":"text/x-python","patch_set":9,"id":"4bbc6a3f_8acc3d0b","line":1611,"in_reply_to":"7b748ae6_f8732325","updated":"2026-04-21 03:16:00.000000000","message":"Done","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"}],"releasenotes/notes/allow-error-amphora-failover-ab882982adc05f01.yaml":[{"author":{"_account_id":38360,"name":"Zachary Mark Raines","display_name":"Zachary Raines","email":"zachary.raines@canonical.com","username":"raineszm","status":"Sustaining Engineer @ Canonical"},"change_message_id":"2646022b21200d39e29442a09af04d9ec6c71afd","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Allow failover on Amphora in ERROR status. Also tracing the retries counts"},{"line_number":5,"context_line":"    on failover Amphora in ERROR status. The counting is recorded in"},{"line_number":6,"context_line":"    DB (Amphora.error_retries) and will get cleaned when"},{"line_number":7,"context_line":"    Amphora able to run failover on non-ERROR status."},{"line_number":8,"context_line":"    If retry counts hits max retries limit, it will requires more investigate"},{"line_number":9,"context_line":"    and running failover manually (if needs)."},{"line_number":10,"context_line":"    For this feature, we add config `[health_manager]/failover_on_error`"},{"line_number":11,"context_line":"    (disable by default) to allow health manager pick up any Amphora in both"},{"line_number":12,"context_line":"    ERROR status and expired on heartbeats conditions when looking for stale"},{"line_number":13,"context_line":"    Amphora to failover."},{"line_number":14,"context_line":"    Also add config `[health_manager]/failover_on_error_max_retries`"},{"line_number":15,"context_line":"    (default to 0) to control max retries to run failover on error status"},{"line_number":16,"context_line":"    Amphora. Set to `-1` to allow unlimited retries."},{"line_number":17,"context_line":"    Beware that, try to performing failover when ERROR"},{"line_number":18,"context_line":"    status might not help to solve the ERROR status for Amphora."},{"line_number":19,"context_line":"    So use this option with caution."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"upgrade:"},{"line_number":22,"context_line":"  - |"},{"line_number":23,"context_line":"    Upgrade requires a database migration to update amphora table."}],"source_content_type":"text/x-yaml","patch_set":9,"id":"38ded35b_f8007525","line":20,"range":{"start_line":4,"start_character":4,"end_line":20,"end_character":1},"updated":"2025-12-09 19:03:55.000000000","message":"This is a little hard to follow as written. Probably we should first just describe the feature and then get into how it is implemented.\n\n```suggestion\nAdd config option `[health_manager]/failover_on_error`\n(disabled by default) to allow failover on amphora in ERROR status. \nEnabling allows health manager pick up any amphora in both\nERROR status and expired on heartbeats conditions when looking \nfor stale amphorae to failover.\nAlso add config option `[health_manager]/failover_on_error_max_retries`\n(default to 0) to control maximum number of retries for faailover\non an amphora in the error state. Setting this option to `-1` \nallows unlimited retries.\nThe retry count is recorded in the database (Amphora.error_retries) \nand will be cleaned when the amphora isb able to run failover successfully.\nIf the retry counts hits the max retries limit, it will requires \nmore investigation and manual failover (if needed).\nBeware that try to performing failover when in ERROR\nstate might not help to solve the ERROR for the amphora.\nSo use this option with caution.\n\n```","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"086858efb9f986c9a0f6c3f7c3c8c411d108047f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Allow failover on Amphora in ERROR status. Also tracing the retries counts"},{"line_number":5,"context_line":"    on failover Amphora in ERROR status. The counting is recorded in"},{"line_number":6,"context_line":"    DB (Amphora.error_retries) and will get cleaned when"},{"line_number":7,"context_line":"    Amphora able to run failover on non-ERROR status."},{"line_number":8,"context_line":"    If retry counts hits max retries limit, it will requires more investigate"},{"line_number":9,"context_line":"    and running failover manually (if needs)."},{"line_number":10,"context_line":"    For this feature, we add config `[health_manager]/failover_on_error`"},{"line_number":11,"context_line":"    (disable by default) to allow health manager pick up any Amphora in both"},{"line_number":12,"context_line":"    ERROR status and expired on heartbeats conditions when looking for stale"},{"line_number":13,"context_line":"    Amphora to failover."},{"line_number":14,"context_line":"    Also add config `[health_manager]/failover_on_error_max_retries`"},{"line_number":15,"context_line":"    (default to 0) to control max retries to run failover on error status"},{"line_number":16,"context_line":"    Amphora. Set to `-1` to allow unlimited retries."},{"line_number":17,"context_line":"    Beware that, try to performing failover when ERROR"},{"line_number":18,"context_line":"    status might not help to solve the ERROR status for Amphora."},{"line_number":19,"context_line":"    So use this option with caution."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"upgrade:"},{"line_number":22,"context_line":"  - |"},{"line_number":23,"context_line":"    Upgrade requires a database migration to update amphora table."}],"source_content_type":"text/x-yaml","patch_set":9,"id":"208d015c_98dde3f6","line":20,"range":{"start_line":4,"start_character":4,"end_line":20,"end_character":1},"in_reply_to":"38ded35b_f8007525","updated":"2026-04-21 03:16:00.000000000","message":"Done","commit_id":"9bebf87c3c29e36f5fc2e4dc5d10b42ee8f3d799"}]}
