Repository: scality/backbeat
Pull request #2633: BB-673 Fix retry for replication and notification
Author: login: nicolas2bert
Created: 2025-03-25T16:59:05Z | Merged: 2025-03-27T08:54:27Z



Diff:
diff --git a/bin/replication.js b/bin/replication.js
index 6215fda07..6ca2f7ede 100644
--- a/bin/replication.js
+++ b/bin/replication.js
@@ -61,6 +61,7 @@ function _createSetupReplication(command, options, log) {
         internalHttps: config.internalHttps,
         checkSanity: true,
         log,
+        repConfig: config.extensions.replication,
     });
 }
 
diff --git a/extensions/notification/queueProcessor/QueueProcessor.js b/extensions/notification/queueProcessor/QueueProcessor.js
index 7f04f3fa0..9cadcaac5 100644
--- a/extensions/notification/queueProcessor/QueueProcessor.js
+++ b/extensions/notification/queueProcessor/QueueProcessor.js
@@ -48,8 +48,15 @@ class QueueProcessor extends EventEmitter {
      * the time they are consumed from the internal Kafka queue and
      * the time a delivery report is received from the external Kafka
      * broker (see also {@link destinationConfig.pollIntervalMs})
-     * @param {String} notifConfig.queueProcessor.retryTimeoutS -
-     *   number of seconds before giving up retries of an entry
+     * @param {Object} notifConfig.queueProcessor.retry - Object keyed by location type
+     * (e.g., `aws_s3`, `azure`, `gcp`, `scality`), defining retry parameters for each location type.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.maxRetries - Maximum number of retry attempts.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.timeoutS - Timeout in seconds before giving up.
+     * @param {Object} notifConfig.queueProcessor.retry.<locationType>.backoff - Exponential backoff configuration.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.backoff.min - Minimum backoff interval in ms.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.backoff.max - Maximum backoff interval in ms.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.backoff.jitter - Jitter factor.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.backoff.factor - Exponential backoff multiplier.
      * @param {String} destinationConfig.type - destination type
      * @param {String} destinationConfig.host - destination host
      * @param {String} destinationConfig.auth - destination auth configuration
diff --git a/extensions/replication/queueProcessor/QueueProcessor.js b/extensions/replication/queueProcessor/QueueProcessor.js
index d26975f82..e86bf0abc 100644
--- a/extensions/replication/queueProcessor/QueueProcessor.js
+++ b/extensions/replication/queueProcessor/QueueProcessor.js
@@ -167,20 +167,15 @@ class QueueProcessor extends EventEmitter {
      *   specific to queue processor
      * @param {String} repConfig.queueProcessor.groupId - kafka
      *   consumer group ID
-     * @param {number} [repConfig.queueProcessor.retry.timeoutS] -
-     *  retry timeout in secs.
-     * @param {number} [repConfig.queueProcessor.retry.maxRetries] -
-     *  max retries before giving up
-     * @param {Object} [repConfig.queueProcessor.retry.backoff] -
-     *  backoff params
-     * @param {number} [repConfig.queueProcessor.retry.backoff.min] -
-     *  min. backoff in ms.
-     * @param {number} [repConfig.queueProcessor.retry.backoff.max] -
-     *  max. backoff in ms.
-     * @param {number} [repConfig.queueProcessor.retry.backoff.jitter] -
-     *  randomness
-     * @param {number} [repConfig.queueProcessor.retry.backoff.factor] -
-     *  backoff factor
+     * @param {Object} repConfig.queueProcessor.retry - Object keyed by location type
+     * (e.g., `aws_s3`, `azure`, `gcp`, `scality`), defining retry parameters for each location type.
+     * @param {number} repConfig.queueProcessor.retry.<locationType>.maxRetries - Maximum number of retry attempts.
+     * @param {number} repConfig.queueProcessor.retry.<locationType>.timeoutS - Timeout in seconds before giving up.
+     * @param {Object} repConfig.queueProcessor.retry.<locationType>.backoff - Exponential backoff configuration.
+     * @param {number} repConfig.queueProcessor.retry.<locationType>.backoff.min - Minimum backoff interval in ms.
+     * @param {number} repConfig.queueProcessor.retry.<locationType>.backoff.max - Maximum backoff interval in ms.
+     * @param {number} repConfig.queueProcessor.retry.<locationType>.backoff.jitter - Jitter factor.
+     * @param {number} repConfig.queueProcessor.retry.<locationType>.backoff.factor - Exponential backoff multiplier.
      * @param {Object} redisConfig - redis configuration
      * @param {Object} mConfig - metrics config
      * @param {String} mConfig.topic - metrics config kafka topic
diff --git a/extensions/replication/tasks/EchoBucket.js b/extensions/replication/tasks/EchoBucket.js
index 439fc3ba1..2648c378d 100644
--- a/extensions/replication/tasks/EchoBucket.js
+++ b/extensions/replication/tasks/EchoBucket.js
@@ -14,9 +14,7 @@ class EchoBucket extends BackbeatTask {
      */
     constructor(qp) {
         const qpState = qp.getStateVars();
-        super({
-            timeoutS: qpState.repConfig.queueProcessor.retryTimeoutS,
-        });
+        super(qpState.repConfig.queueProcessor.retry.scality);
         Object.assign(this, qpState);
     }
 
@@ -230,7 +228,7 @@ class EchoBucket extends BackbeatTask {
                     internalHttps: this.internalHttpsConfig,
                     skipSourceBucketCreation: true,
                     log,
-                    retryTimeoutS: this.repConfig.queueProcessor.retryTimeoutS,
+                    repConfig: this.repConfig,
                 });
                 setupReplication.setupReplication(done);
             },
diff --git a/extensions/replication/tasks/ReplicateObject.js b/extensions/replication/tasks/ReplicateObject.js
index 3ba14b5d8..0a3b14adc 100644
--- a/extensions/replication/tasks/ReplicateObject.js
+++ b/extensions/replication/tasks/ReplicateObject.js
@@ -38,21 +38,23 @@ class ReplicateObject extends BackbeatTask {
      */
     constructor(qp) {
         const qpState = qp.getStateVars();
-        super({
-            timeoutS: qpState.repConfig.queueProcessor.retryTimeoutS,
-        });
-        Object.assign(this, qpState);
-        this.retryParams = this.repConfig.queueProcessor.retry.scality;
-        if (this.destConfig && this.destConfig.bootstrapList) {
-            const destination = this.destConfig.bootstrapList
-                .find(endpoint => endpoint.site === this.site) || {};
-            this.destType = destination.type;
-            const retryParams =
-                this.repConfig.queueProcessor.retry[destination.type];
-            if (retryParams) {
-                this.retryParams = retryParams;
+        const { repConfig, destConfig, site } = qpState;
+
+        let retryParams = repConfig.queueProcessor.retry.scality;
+
+        if (destConfig?.bootstrapList) {
+            const destination = destConfig.bootstrapList
+                .find(endpoint => endpoint.site === site) || {};
+            const { type: destType } = destination;
+            if (repConfig.queueProcessor.retry[destType]) {
+                retryParams = repConfig.queueProcessor.retry[destType];
             }
         }
+
+        super(retryParams);
+
+        Object.assign(this, qpState);
+
         this.sourceRole = null;
         this.targetRole = null;
         this.destBackbeatHost = null;
diff --git a/extensions/replication/tasks/UpdateReplicationStatus.js b/extensions/replication/tasks/UpdateReplicationStatus.js
index aa9b3ef6a..c130374d7 100644
--- a/extensions/replication/tasks/UpdateReplicationStatus.js
+++ b/extensions/replication/tasks/UpdateReplicationStatus.js
@@ -29,12 +29,8 @@ class UpdateReplicationStatus extends BackbeatTask {
      */
     constructor(rsp, metricsHandler) {
         const rspState = rsp.getStateVars();
-        super({
-            timeoutS:
-            rspState.repConfig.replicationStatusProcessor.retryTimeoutS,
-        });
+        super(rspState.repConfig.replicationStatusProcessor.retry);
         Object.assign(this, rspState);
-        this.retryParams = this.repConfig.replicationStatusProcessor.retry;
         this.metricsHandler = metricsHandler;
         this.sourceRole = null;
         this.s3sourceCredentials = null;
diff --git a/extensions/replication/utils/SetupReplication.js b/extensions/replication/utils/SetupReplication.js
index f87f4cfc3..c700de8f8 100644
--- a/extensions/replication/utils/SetupReplication.js
+++ b/extensions/replication/utils/SetupReplication.js
@@ -100,8 +100,8 @@ class SetupReplication extends BackbeatTask {
      */
     constructor(params) {
         const { source, target, https, internalHttps, checkSanity,
-                retryTimeoutS, skipSourceBucketCreation, log } = params;
-        super({ timeoutS: retryTimeoutS });
+                repConfig, skipSourceBucketCreation, log } = params;
+        super(repConfig.queueProcessor.retry.scality);
         this._log = log;
         this._sourceBucket = source.bucket;
         this._targetBucket = target.bucket;


Reviews:
user: login: welansari
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-25T17:03:57Z
user: login: welansari
state: APPROVED
author_association: NONE
submitted_at: 2025-03-25T17:05:23Z
user: login: anurag4DSB
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T18:28:13Z
user: login: francoisferrand
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-26T07:06:16Z
user: login: francoisferrand
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-26T07:08:39Z
user: login: nicolas2bert
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-26T09:39:14Z
user: login: francoisferrand
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-26T09:58:57Z
user: login: nicolas2bert
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-26T15:35:11Z

Review comments:
diff_hunk: @@ -167,20 +167,15 @@ class QueueProcessor extends EventEmitter {
      *   specific to queue processor
      * @param {String} repConfig.queueProcessor.groupId - kafka
      *   consumer group ID
-     * @param {number} [repConfig.queueProcessor.retry.timeoutS] -
-     *  retry timeout in secs.
-     * @param {number} [repConfig.queueProcessor.retry.maxRetries] -
-     *  max retries before giving up
-     * @param {Object} [repConfig.queueProcessor.retry.backoff] -
-     *  backoff params
-     * @param {number} [repConfig.queueProcessor.retry.backoff.min] -
-     *  min. backoff in ms.
-     * @param {number} [repConfig.queueProcessor.retry.backoff.max] -
-     *  max. backoff in ms.
-     * @param {number} [repConfig.queueProcessor.retry.backoff.jitter] -
-     *  randomness
-     * @param {number} [repConfig.queueProcessor.retry.backoff.factor] -
-     *  backoff factor
+     * @param {Object} notifConfig.queueProcessor.retry - Object keyed by location type
+     * (e.g., `aws_s3`, `azure`, `gcp`, `scality`), defining retry parameters for each location type.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.maxRetries - Maximum number of retry attempts.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.timeoutS - Timeout in seconds before giving up.
+     * @param {Object} notifConfig.queueProcessor.retry.<locationType>.backoff - Exponential backoff configuration.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.backoff.min - Minimum backoff interval in ms.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.backoff.max - Maximum backoff interval in ms.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.backoff.jitter - Jitter factor.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.backoff.factor - Exponential backoff multiplier.
path: extensions/replication/queueProcessor/QueueProcessor.js
user: login: welansari
body: 
```suggestion
     * @param {Object} repConfig.queueProcessor.retry - Object keyed by location type
     * (e.g., `aws_s3`, `azure`, `gcp`, `scality`), defining retry parameters for each location type.
     * @param {number} repConfig.queueProcessor.retry.<locationType>.maxRetries - Maximum number of retry attempts.
     * @param {number} repConfig.queueProcessor.retry.<locationType>.timeoutS - Timeout in seconds before giving up.
     * @param {Object} repConfig.queueProcessor.retry.<locationType>.backoff - Exponential backoff configuration.
     * @param {number} repConfig.queueProcessor.retry.<locationType>.backoff.min - Minimum backoff interval in ms.
     * @param {number} repConfig.queueProcessor.retry.<locationType>.backoff.max - Maximum backoff interval in ms.
     * @param {number} repConfig.queueProcessor.retry.<locationType>.backoff.jitter - Jitter factor.
     * @param {number} repConfig.queueProcessor.retry.<locationType>.backoff.factor - Exponential backoff multiplier.
```
created_at: 2025-03-25T17:03:56Z
author_association: NONE
diff_hunk: @@ -29,10 +29,7 @@ class UpdateReplicationStatus extends BackbeatTask {
      */
     constructor(rsp, metricsHandler) {
         const rspState = rsp.getStateVars();
-        super({
-            timeoutS:
-            rspState.repConfig.replicationStatusProcessor.retryTimeoutS,
-        });
+        super(rspState.repConfig.replicationStatusProcessor.retry);
path: extensions/replication/tasks/UpdateReplicationStatus.js
user: login: francoisferrand
body: retryParams are already on line 34, what is the point of this change?

(a cleanup may be good indeed, to pass the retryParams through the constructor instead of overriding them: but this is not what you are implementing here, and would change most backbeat tasks)


```suggestion
        super();
```
created_at: 2025-03-26T07:06:15Z
author_association: CONTRIBUTOR
diff_hunk: @@ -100,8 +100,8 @@ class SetupReplication extends BackbeatTask {
      */
     constructor(params) {
         const { source, target, https, internalHttps, checkSanity,
-                retryTimeoutS, skipSourceBucketCreation, log } = params;
-        super({ timeoutS: retryTimeoutS });
+                repConfig, skipSourceBucketCreation, log } = params;
+        super(repConfig.queueProcessor.retry.scality);
path: extensions/replication/utils/SetupReplication.js
user: login: francoisferrand
body: replication may target other backends (not just scality), and each "kind" (scality, aws, azure...) has its own retry params:
- seems weird to single-out the 'scality' retry params here
- due to these target-specific params, are the (proper) retry params not already used deeper in the code, when doing the actual replication, i.e. is it really needed to set it here?
created_at: 2025-03-26T07:08:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -100,8 +100,8 @@ class SetupReplication extends BackbeatTask {
      */
     constructor(params) {
         const { source, target, https, internalHttps, checkSanity,
-                retryTimeoutS, skipSourceBucketCreation, log } = params;
-        super({ timeoutS: retryTimeoutS });
+                repConfig, skipSourceBucketCreation, log } = params;
+        super(repConfig.queueProcessor.retry.scality);
path: extensions/replication/utils/SetupReplication.js
user: login: nicolas2bert
body: SetupReplication class fully configures CRR replication by performing all the housekeeping tasks needed for it to work (bucket existence/creation, versioning, IAM roles/policies, and the S3 replication configuration).

For internal replication (CRR), the type introduced is "scality".
created_at: 2025-03-26T08:58:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -29,10 +29,7 @@ class UpdateReplicationStatus extends BackbeatTask {
      */
     constructor(rsp, metricsHandler) {
         const rspState = rsp.getStateVars();
-        super({
-            timeoutS:
-            rspState.repConfig.replicationStatusProcessor.retryTimeoutS,
-        });
+        super(rspState.repConfig.replicationStatusProcessor.retry);
path: extensions/replication/tasks/UpdateReplicationStatus.js
user: login: nicolas2bert
body: Yes, that was my point about passing it in the constructor. I overlooked the unnecessary redundancy and will remove `this.retryParams = this.repConfig.replicationStatusProcessor.retry;`

Thanks.


created_at: 2025-03-26T09:37:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -167,20 +167,15 @@ class QueueProcessor extends EventEmitter {
      *   specific to queue processor
      * @param {String} repConfig.queueProcessor.groupId - kafka
      *   consumer group ID
-     * @param {number} [repConfig.queueProcessor.retry.timeoutS] -
-     *  retry timeout in secs.
-     * @param {number} [repConfig.queueProcessor.retry.maxRetries] -
-     *  max retries before giving up
-     * @param {Object} [repConfig.queueProcessor.retry.backoff] -
-     *  backoff params
-     * @param {number} [repConfig.queueProcessor.retry.backoff.min] -
-     *  min. backoff in ms.
-     * @param {number} [repConfig.queueProcessor.retry.backoff.max] -
-     *  max. backoff in ms.
-     * @param {number} [repConfig.queueProcessor.retry.backoff.jitter] -
-     *  randomness
-     * @param {number} [repConfig.queueProcessor.retry.backoff.factor] -
-     *  backoff factor
+     * @param {Object} notifConfig.queueProcessor.retry - Object keyed by location type
+     * (e.g., `aws_s3`, `azure`, `gcp`, `scality`), defining retry parameters for each location type.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.maxRetries - Maximum number of retry attempts.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.timeoutS - Timeout in seconds before giving up.
+     * @param {Object} notifConfig.queueProcessor.retry.<locationType>.backoff - Exponential backoff configuration.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.backoff.min - Minimum backoff interval in ms.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.backoff.max - Maximum backoff interval in ms.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.backoff.jitter - Jitter factor.
+     * @param {number} notifConfig.queueProcessor.retry.<locationType>.backoff.factor - Exponential backoff multiplier.
path: extensions/replication/queueProcessor/QueueProcessor.js
user: login: nicolas2bert
body: thanks, good catch. As you had guessed I copied/pasted it from the notification QueueProcessor.
created_at: 2025-03-26T09:38:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -38,9 +38,7 @@ class ReplicateObject extends BackbeatTask {
      */
     constructor(qp) {
         const qpState = qp.getStateVars();
-        super({
-            timeoutS: qpState.repConfig.queueProcessor.retryTimeoutS,
-        });
+        super();
path: extensions/replication/tasks/ReplicateObject.js
user: login: francoisferrand
body: should `retryParams` assignment be moved from line 43-53 to constructor param, then?
created_at: 2025-03-26T09:58:57Z
author_association: CONTRIBUTOR
diff_hunk: @@ -38,21 +38,23 @@ class ReplicateObject extends BackbeatTask {
      */
     constructor(qp) {
         const qpState = qp.getStateVars();
-        super({
-            timeoutS: qpState.repConfig.queueProcessor.retryTimeoutS,
-        });
-        Object.assign(this, qpState);
-        this.retryParams = this.repConfig.queueProcessor.retry.scality;
-        if (this.destConfig && this.destConfig.bootstrapList) {
-            const destination = this.destConfig.bootstrapList
-                .find(endpoint => endpoint.site === this.site) || {};
-            this.destType = destination.type;
path: extensions/replication/tasks/ReplicateObject.js
user: login: nicolas2bert
body: Removing `this.destType` since it does not seem to be used anywhere.
created_at: 2025-03-26T15:35:08Z
author_association: CONTRIBUTOR

PR comments:
user: login: bert-e
created_at: 2025-03-25T16:59:08Z
body: # Hello nicolas2bert,



My role is to assist you with the merge of this
pull request. Please type `@bert-e help` to get information
on this process, or consult the [user documentation](
https://bert-e.scality.net/scality/backbeat/doc/user).


<details>
  <summary><b>Available options</b></summary>

  name   | description  | privileged   | authored
  ------ | ------------ | ------------ |----------
  `/after_pull_request` | Wait for the given pull request id to be merged before continuing with the current one. |  | 
  `/bypass_author_approval` | Bypass the pull request author's approval |  :star:  | 
  `/bypass_build_status` | Bypass the build and test status |  :star:  | 
  `/bypass_commit_size` | Bypass the check on the size of the changeset ```TBA``` |  :star:  | 
  `/bypass_incompatible_branch` | Bypass the check on the source branch prefix |  :star:  | 
  `/bypass_jira_check` | Bypass the Jira issue check |  :star:  | 
  `/bypass_peer_approval` | Bypass the pull request peers' approval |  :star:  | 
  `/bypass_leader_approval` | Bypass the pull request leaders' approval |  :star:  | 
  `/approve` | Instruct Bert-E that the author has approved the pull request. |  |  :writing_hand: 
  `/create_pull_requests` | Allow the creation of integration pull requests. |  | 
  `/create_integration_branches` | Allow the creation of integration branches. |  | 
  `/no_octopus` | Prevent Wall-E from doing any octopus merge and use multiple consecutive merge instead |  | 
  `/unanimity` | Change review acceptance criteria from `one reviewer at least` to `all reviewers` |  | 
  `/wait` | Instruct Bert-E not to run until further notice. |  | 
  

</details>



<details>
  <summary><b>Available commands</b></summary>

  name   | description  | privileged
  ------ | ------------ | ------------
  `/help` | Print Bert-E's manual in the pull request. | 
  `/status` | Print Bert-E's current status in the pull request ```TBA``` | 
  `/clear` | Remove all comments from Bert-E from the history ```TBA``` | 
  `/retry` | Re-start a fresh build ```TBA``` | 
  `/build` | Re-start a fresh build ```TBA``` | 
  `/force_reset` | Delete integration branches & pull requests, and restart merge process from the beginning. | 
  `/reset` | Try to remove integration branches unless there are commits on them which do not appear on the source branch. | 
  
</details>




*Status report is not available.*







author_association: CONTRIBUTOR
user: login: bert-e
created_at: 2025-03-25T16:59:15Z
body: # Incorrect fix version



The `Fix Version/s` in issue BB-673 contains:


* *None*



Considering where you are trying to merge, I ignored possible hotfix versions and I expected to find:



* `9.0.5`

* `9.1.0`


Please check the `Fix Version/s` of BB-673, or the target
branch of this pull request.





author_association: CONTRIBUTOR
user: login: bert-e
created_at: 2025-03-25T17:04:07Z
body: # Request integration branches



Waiting for integration branch creation to be requested by the user.

To request integration branches, please comment on this pull request with the following command:

```
/create_integration_branches
```

Alternatively, the `/approve` and `/create_pull_requests` commands will automatically
create the integration branches.






author_association: CONTRIBUTOR
user: login: codecov[bot]
created_at: 2025-03-26T15:31:38Z
body: ## [Codecov](https://app.codecov.io/gh/scality/backbeat/pull/2633?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) Report
Attention: Patch coverage is `78.57143%` with `3 lines` in your changes missing coverage. Please review.
> Project coverage is 73.39%. Comparing base [(`4963f4b`)](https://app.codecov.io/gh/scality/backbeat/commit/4963f4b51e64e8b35f7c802a12f42b53b782d7a2?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) to head [(`6d87c9f`)](https://app.codecov.io/gh/scality/backbeat/commit/6d87c9f238ca5c432a7489eee822cc4cfaafb16e?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality).
> Report is 1 commits behind head on development/9.0.

| [Files with missing lines](https://app.codecov.io/gh/scality/backbeat/pull/2633?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | Patch % | Lines |
|---|---|---|
| [extensions/replication/utils/SetupReplication.js](https://app.codecov.io/gh/scality/backbeat/pull/2633?src=pr&el=tree&filepath=extensions%2Freplication%2Futils%2FSetupReplication.js&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality#diff-ZXh0ZW5zaW9ucy9yZXBsaWNhdGlvbi91dGlscy9TZXR1cFJlcGxpY2F0aW9uLmpz) | 0.00% | [2 Missing :warning: ](https://app.codecov.io/gh/scality/backbeat/pull/2633?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) |
| [extensions/replication/tasks/EchoBucket.js](https://app.codecov.io/gh/scality/backbeat/pull/2633?src=pr&el=tree&filepath=extensions%2Freplication%2Ftasks%2FEchoBucket.js&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality#diff-ZXh0ZW5zaW9ucy9yZXBsaWNhdGlvbi90YXNrcy9FY2hvQnVja2V0Lmpz) | 0.00% | [1 Missing :warning: ](https://app.codecov.io/gh/scality/backbeat/pull/2633?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) |

<details><summary>Additional details and impacted files</summary>


[![Impacted file tree graph](https://app.codecov.io/gh/scality/backbeat/pull/2633/graphs/tree.svg?width=650&height=150&src=pr&token=LlNB6ANurP&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality)](https://app.codecov.io/gh/scality/backbeat/pull/2633?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality)

| [Files with missing lines](https://app.codecov.io/gh/scality/backbeat/pull/2633?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | Coverage Δ | |
|---|---|---|
| [bin/replication.js](https://app.codecov.io/gh/scality/backbeat/pull/2633?src=pr&el=tree&filepath=bin%2Freplication.js&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality#diff-YmluL3JlcGxpY2F0aW9uLmpz) | `0.00% <ø> (ø)` | |
| [...ions/notification/queueProcessor/QueueProcessor.js](https://app.codecov.io/gh/scality/backbeat/pull/2633?src=pr&el=tree&filepath=extensions%2Fnotification%2FqueueProcessor%2FQueueProcessor.js&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality#diff-ZXh0ZW5zaW9ucy9ub3RpZmljYXRpb24vcXVldWVQcm9jZXNzb3IvUXVldWVQcm9jZXNzb3IuanM=) | `56.86% <ø> (ø)` | |
| [...sions/replication/queueProcessor/QueueProcessor.js](https://app.codecov.io/gh/scality/backbeat/pull/2633?src=pr&el=tree&filepath=extensions%2Freplication%2FqueueProcessor%2FQueueProcessor.js&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality#diff-ZXh0ZW5zaW9ucy9yZXBsaWNhdGlvbi9xdWV1ZVByb2Nlc3Nvci9RdWV1ZVByb2Nlc3Nvci5qcw==) | `72.96% <ø> (ø)` | |
| [extensions/replication/tasks/ReplicateObject.js](https://app.codecov.io/gh/scality/backbeat/pull/2633?src=pr&el=tree&filepath=extensions%2Freplication%2Ftasks%2FReplicateObject.js&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality#diff-ZXh0ZW5zaW9ucy9yZXBsaWNhdGlvbi90YXNrcy9SZXBsaWNhdGVPYmplY3QuanM=) | `91.49% <100.00%> (ø)` | |
| [...sions/replication/tasks/UpdateReplicationStatus.js](https://app.codecov.io/gh/scality/backbeat/pull/2633?src=pr&el=tree&filepath=extensions%2Freplication%2Ftasks%2FUpdateReplicationStatus.js&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality#diff-ZXh0ZW5zaW9ucy9yZXBsaWNhdGlvbi90YXNrcy9VcGRhdGVSZXBsaWNhdGlvblN0YXR1cy5qcw==) | `78.37% <100.00%> (-0.12%)` | :arrow_down: |
| [extensions/replication/tasks/EchoBucket.js](https://app.codecov.io/gh/scality/backbeat/pull/2633?src=pr&el=tree&filepath=extensions%2Freplication%2Ftasks%2FEchoBucket.js&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality#diff-ZXh0ZW5zaW9ucy9yZXBsaWNhdGlvbi90YXNrcy9FY2hvQnVja2V0Lmpz) | `5.49% <0.00%> (ø)` | |
| [extensions/replication/utils/SetupReplication.js](https://app.codecov.io/gh/scality/backbeat/pull/2633?src=pr&el=tree&filepath=extensions%2Freplication%2Futils%2FSetupReplication.js&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality#diff-ZXh0ZW5zaW9ucy9yZXBsaWNhdGlvbi91dGlscy9TZXR1cFJlcGxpY2F0aW9uLmpz) | `2.82% <0.00%> (ø)` | |

... and [5 files with indirect coverage changes](https://app.codecov.io/gh/scality/backbeat/pull/2633/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality)

| [Components](https://app.codecov.io/gh/scality/backbeat/pull/2633/components?src=pr&el=components&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | Coverage Δ | |
|---|---|---|
| [Bucket Notification](https://app.codecov.io/gh/scality/backbeat/pull/2633/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `75.37% <ø> (ø)` | |
| [Core Library](https://app.codecov.io/gh/scality/backbeat/pull/2633/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `80.27% <ø> (+0.86%)` | :arrow_up: |
| [Ingestion](https://app.codecov.io/gh/scality/backbeat/pull/2633/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `70.14% <ø> (ø)` | |
| [Lifecycle](https://app.codecov.io/gh/scality/backbeat/pull/2633/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `77.08% <ø> (+0.20%)` | :arrow_up: |
| [Oplog Populator](https://app.codecov.io/gh/scality/backbeat/pull/2633/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `85.06% <ø> (ø)` | |
| [Replication](https://app.codecov.io/gh/scality/backbeat/pull/2633/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `58.59% <78.57%> (+0.02%)` | :arrow_up: |
| [Bucket Scanner](https://app.codecov.io/gh/scality/backbeat/pull/2633/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `85.60% <ø> (ø)` | |

```diff
@@                 Coverage Diff                 @@
##           development/9.0    #2633      +/-   ##
===================================================
+ Coverage            72.99%   73.39%   +0.40%     
===================================================
  Files                  201      201              
  Lines                13374    13373       -1     
===================================================
+ Hits                  9762     9815      +53     
+ Misses                3602     3548      -54     
  Partials                10       10              
```

| [Flag](https://app.codecov.io/gh/scality/backbeat/pull/2633/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | Coverage Δ | |
|---|---|---|
| [api:retry](https://app.codecov.io/gh/scality/backbeat/pull/2633/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `9.48% <0.00%> (+<0.01%)` | :arrow_up: |
| [api:routes](https://app.codecov.io/gh/scality/backbeat/pull/2633/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `9.29% <0.00%> (+<0.01%)` | :arrow_up: |
| [bucket-scanner](https://app.codecov.io/gh/scality/backbeat/pull/2633/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `85.60% <ø> (ø)` | |
| [ft_test:queuepopulator](https://app.codecov.io/gh/scality/backbeat/pull/2633/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `10.77% <0.00%> (+1.87%)` | :arrow_up: |
| [ingestion](https://app.codecov.io/gh/scality/backbeat/pull/2633/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `12.56% <0.00%> (+<0.01%)` | :arrow_up: |
| [lib](https://app.codecov.io/gh/scality/backbeat/pull/2633/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `7.35% <0.00%> (+0.01%)` | :arrow_up: |
| [lifecycle](https://app.codecov.io/gh/scality/backbeat/pull/2633/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `18.75% <0.00%> (+<0.01%)` | :arrow_up: |
| [notification](https://app.codecov.io/gh/scality/backbeat/pull/2633/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `1.06% <0.00%> (+<0.01%)` | :arrow_up: |
| [replication](https://app.codecov.io/gh/scality/backbeat/pull/2633/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `18.52% <78.57%> (-0.01%)` | :arrow_down: |
| [unit](https://app.codecov.io/gh/scality/backbeat/pull/2633/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality) | `48.55% <71.42%> (-0.01%)` | :arrow_down: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=scality#carryforward-flags-in-the-pull-request-comment) to find out more.

</details>
<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
- :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>
author_association: NONE
user: login: nicolas2bert
created_at: 2025-03-27T08:52:23Z
body: @bert-e approve
author_association: CONTRIBUTOR
user: login: bert-e
created_at: 2025-03-27T08:52:34Z
body: # Integration data created



I have created the integration data for the additional destination branches.

* this pull request will merge `bugfix/BB-673/retry` into
`development/9.0`
* [w/9.1/bugfix/BB-673/retry](https://github.com/scality/backbeat/compare/development/9.1...w/9.1/bugfix/BB-673/retry) will be merged into `development/9.1` 



The following branches will **NOT** be impacted:

* `development/7.10`
* `development/7.4`
* `development/7.70`
* `development/8.6`




You can set option `create_pull_requests` if you need me to create
**integration pull requests** in addition to integration branches, with:

```
@bert-e create_pull_requests
```







*The following options are set:* **approve**


author_association: CONTRIBUTOR
user: login: bert-e
created_at: 2025-03-27T08:52:45Z
body: # History mismatch



Merge commit #8118c88d5262b48c3d3dafb9bf434121801b0eb9 on the integration branch
`w/9.1/bugfix/BB-673/retry` is merging a branch which is neither the current
branch `bugfix/BB-673/retry` nor the development branch
`development/9.1`.

It is likely due to a rebase of the branch `bugfix/BB-673/retry` and the
merge is not possible until all related `w/*` branches are deleted or updated.

**Please use the `reset` command to have me reinitialize these branches.**





*The following options are set:* **approve**


author_association: CONTRIBUTOR
user: login: bert-e
created_at: 2025-03-27T08:53:47Z
body: # History mismatch



Merge commit #722a5725b6cafcbbad1e641d5145f4abf8cb8708 on the integration branch
`w/9.1/bugfix/BB-673/retry` is merging a branch which is neither the current
branch `bugfix/BB-673/retry` nor the development branch
`development/9.1`.

It is likely due to a rebase of the branch `bugfix/BB-673/retry` and the
merge is not possible until all related `w/*` branches are deleted or updated.

**Please use the `reset` command to have me reinitialize these branches.**





*The following options are set:* **approve**


author_association: CONTRIBUTOR
user: login: nicolas2bert
created_at: 2025-03-27T08:53:53Z
body: @bert-e reset
author_association: CONTRIBUTOR
user: login: bert-e
created_at: 2025-03-27T08:54:03Z
body: # Reset complete



I have successfully deleted this pull request's integration branches.






*The following options are set:* **approve**


author_association: CONTRIBUTOR
user: login: bert-e
created_at: 2025-03-27T08:54:13Z
body: # Integration data created



I have created the integration data for the additional destination branches.

* this pull request will merge `bugfix/BB-673/retry` into
`development/9.0`
* [w/9.1/bugfix/BB-673/retry](https://github.com/scality/backbeat/compare/development/9.1...w/9.1/bugfix/BB-673/retry) will be merged into `development/9.1` 



The following branches will **NOT** be impacted:

* `development/7.10`
* `development/7.4`
* `development/7.70`
* `development/8.6`




You can set option `create_pull_requests` if you need me to create
**integration pull requests** in addition to integration branches, with:

```
@bert-e create_pull_requests
```







*The following options are set:* **approve**


author_association: CONTRIBUTOR
user: login: bert-e
created_at: 2025-03-27T08:54:26Z
body: # 


I have successfully merged the changeset of this pull request
into targetted development branches:


* :heavy_check_mark: `development/9.0`

* :heavy_check_mark: `development/9.1`



The following branches have **NOT** changed:

* `development/7.10`
* `development/7.4`
* `development/7.70`
* `development/8.6`



Please check the status of the associated issue BB-673.

Goodbye nicolas2bert.




*The following options are set:* **approve**


author_association: CONTRIBUTOR