Skip to content

Commit b73140a

Browse files
committed
fix: address code review comments on scan metrics
- Clear _scanEndTimeout in close() to prevent callback firing on a partially torn-down bucket processor instance - Propagate conductor's start timestamp (Date.now() at scan start) via contextInfo.scanStartTimestamp instead of using Date.now() in the bucket processor, so the scan progress dashboard accurately reflects the full scan duration - Document that bucketProcessorBucketsCount.reset() clears all label combinations (acceptable: single bucket source per deployment) - Update tests and BackbeatTestConsumer normalizer for the new scanStartTimestamp field
1 parent a1144f5 commit b73140a

4 files changed

Lines changed: 28 additions & 9 deletions

File tree

extensions/lifecycle/bucketProcessor/LifecycleBucketProcessor.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,8 @@ class LifecycleBucketProcessor {
310310
}
311311
const { bucket, owner, accountId, taskVersion } = result.target;
312312
const conductorScanId = result.contextInfo && result.contextInfo.conductorScanId;
313+
const scanStartTimestamp = (result.contextInfo
314+
&& result.contextInfo.scanStartTimestamp) || Date.now();
313315
if (conductorScanId && conductorScanId !== this._metricsScanId) {
314316
// New scan: cancel any pending debounce, full metric reset
315317
if (this._scanEndTimeout) {
@@ -318,7 +320,7 @@ class LifecycleBucketProcessor {
318320
}
319321
this._metricsScanId = conductorScanId;
320322
LifecycleMetrics.onBucketProcessorScanStart(
321-
this._log, Date.now()
323+
this._log, scanStartTimestamp
322324
);
323325
this._processorScanMetricsActive = true;
324326
this._log.info('new conductor scan detected', {
@@ -584,6 +586,10 @@ class LifecycleBucketProcessor {
584586
* @return {undefined}
585587
*/
586588
close(cb) {
589+
if (this._scanEndTimeout) {
590+
clearTimeout(this._scanEndTimeout);
591+
this._scanEndTimeout = null;
592+
}
587593
if (this._deleteInactiveCredentialsInterval) {
588594
clearInterval(this._deleteInactiveCredentialsInterval);
589595
}

extensions/lifecycle/conductor/LifecycleConductor.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -309,13 +309,14 @@ class LifecycleConductor {
309309
});
310310
}
311311

312-
_taskToMessage(task, taskVersion, scanId, log) {
312+
_taskToMessage(task, taskVersion, scanId, scanStartTimestamp, log) {
313313
return {
314314
message: JSON.stringify({
315315
action: 'processObjects',
316316
contextInfo: {
317317
reqId: log.getSerializedUids(),
318318
conductorScanId: scanId,
319+
scanStartTimestamp,
319320
bucketSource: this._bucketSource,
320321
},
321322
target: {
@@ -357,20 +358,22 @@ class LifecycleConductor {
357358
cb);
358359
}
359360

360-
_createBucketTaskMessages(tasks, scanId, log, cb) {
361+
_createBucketTaskMessages(tasks, scanId, scanStartTimestamp, log, cb) {
361362
if (this.lcConfig.forceLegacyListing) {
362363
return process.nextTick(cb, null, tasks.map(t =>
363-
this._taskToMessage(t, lifecycleTaskVersions.v1, scanId, log)));
364+
this._taskToMessage(t, lifecycleTaskVersions.v1, scanId, scanStartTimestamp, log)));
364365
}
365366

366367
return async.mapLimit(tasks, 10, (t, taskDone) =>
367368
this._indexesGetOrCreate(t, log, (err, taskVersion) => {
368369
if (err) {
369370
// should not happen as indexes methods would
370371
// ignore the errors and fallback to v1 listing
371-
return taskDone(null, this._taskToMessage(t, lifecycleTaskVersions.v1, scanId, log));
372+
return taskDone(null, this._taskToMessage(t, lifecycleTaskVersions.v1, scanId,
373+
scanStartTimestamp, log));
372374
}
373-
return taskDone(null, this._taskToMessage(t, taskVersion, scanId, log));
375+
return taskDone(null, this._taskToMessage(t, taskVersion, scanId,
376+
scanStartTimestamp, log));
374377
}), cb);
375378
}
376379

@@ -411,7 +414,8 @@ class LifecycleConductor {
411414
}
412415
return true;
413416
}))),
414-
(tasksWithAccountId, next) => this._createBucketTaskMessages(tasksWithAccountId, scanId, log, next),
417+
(tasksWithAccountId, next) => this._createBucketTaskMessages(
418+
tasksWithAccountId, scanId, start, log, next),
415419
],
416420
(err, messages) => {
417421
nBucketsQueued += tasks.length;

tests/unit/lifecycle/LifecycleConductor.spec.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ describe('Lifecycle Conductor', () => {
300300
setTimeout(() => cb(null, []), 1000);
301301
});
302302
sinon.stub(conductor, '_createBucketTaskMessages')
303-
.callsFake((_a, _b, _c, cb) => {
303+
.callsFake((_a, _b, _c, _d, cb) => {
304304
order.push(2);
305305
assert(conductor.activeIndexingJobsRetrieved);
306306
setTimeout(() => cb(null, []), 1000);
@@ -326,9 +326,12 @@ describe('Lifecycle Conductor', () => {
326326

327327
describe('_indexesGetOrCreate', () => {
328328
it('should include conductor scan id in task context', () => {
329-
const taskMessage = conductor._taskToMessage(getTask(true), lifecycleTaskVersions.v2, 'scan-id-test', log);
329+
const taskMessage = conductor._taskToMessage(
330+
getTask(true), lifecycleTaskVersions.v2,
331+
'scan-id-test', 1706000000000, log);
330332
const parsed = JSON.parse(taskMessage.message);
331333
assert.strictEqual(parsed.contextInfo.conductorScanId, 'scan-id-test');
334+
assert.strictEqual(parsed.contextInfo.scanStartTimestamp, 1706000000000);
332335
});
333336

334337
it('should return v2 for bucketd bucket sources', done => {

tests/utils/BackbeatTestConsumer.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ class BackbeatTestConsumer extends BackbeatConsumer {
4545
!expectedMsg.value.contextInfo?.bucketSource) {
4646
delete parsedMsg.contextInfo.bucketSource;
4747
}
48+
// scanStartTimestamp is a dynamic conductor timestamp:
49+
// normalize for comparison
50+
if (parsedMsg.contextInfo?.scanStartTimestamp &&
51+
!expectedMsg.value.contextInfo?.scanStartTimestamp) {
52+
delete parsedMsg.contextInfo.scanStartTimestamp;
53+
}
4854
}
4955
assert.deepStrictEqual(
5056
parsedMsg, expectedMsg.value,

0 commit comments

Comments
 (0)