@@ -44,6 +44,7 @@ export type FairDequeuingStrategyOptions = {
4444 * If not provided, no biasing will be applied (completely random shuffling)
4545 */
4646 biases ?: FairDequeuingStrategyBiases ;
47+ reuseSnapshotCount ?: number ;
4748} ;
4849
4950type FairQueueConcurrency = {
@@ -90,6 +91,10 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
9091 } > ;
9192
9293 private _rng : seedrandom . PRNG ;
94+ private _reusedSnapshotForConsumer : Map <
95+ string ,
96+ { snapshot : FairQueueSnapshot ; reuseCount : number }
97+ > = new Map ( ) ;
9398
9499 constructor ( private options : FairDequeuingStrategyOptions ) {
95100 const ctx = new DefaultStatefulContext ( ) ;
@@ -310,6 +315,31 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
310315 span . setAttribute ( "consumer_id" , consumerId ) ;
311316 span . setAttribute ( "parent_queue" , parentQueue ) ;
312317
318+ if (
319+ typeof this . options . reuseSnapshotCount === "number" &&
320+ this . options . reuseSnapshotCount > 0
321+ ) {
322+ const key = `${ parentQueue } :${ consumerId } ` ;
323+ const reusedSnapshot = this . _reusedSnapshotForConsumer . get ( key ) ;
324+
325+ if ( reusedSnapshot ) {
326+ if ( reusedSnapshot . reuseCount < this . options . reuseSnapshotCount ) {
327+ span . setAttribute ( "reused_snapshot" , true ) ;
328+
329+ this . _reusedSnapshotForConsumer . set ( key , {
330+ snapshot : reusedSnapshot . snapshot ,
331+ reuseCount : reusedSnapshot . reuseCount + 1 ,
332+ } ) ;
333+
334+ return reusedSnapshot . snapshot ;
335+ } else {
336+ this . _reusedSnapshotForConsumer . delete ( key ) ;
337+ }
338+ }
339+ }
340+
341+ span . setAttribute ( "reused_snapshot" , false ) ;
342+
313343 const now = Date . now ( ) ;
314344
315345 const queues = await this . #allChildQueuesByScore( parentQueue , consumerId , now ) ;
@@ -341,10 +371,6 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
341371 ( org ) => org . concurrency . current >= org . concurrency . limit
342372 ) ;
343373
344- span . setAttributes ( {
345- ...flattenAttributes ( orgsAtFullConcurrency , "orgs_at_full_concurrency" ) ,
346- } ) ;
347-
348374 const orgIdsAtFullConcurrency = new Set ( orgsAtFullConcurrency . map ( ( org ) => org . id ) ) ;
349375
350376 const orgsSnapshot = orgs . reduce ( ( acc , org ) => {
@@ -355,6 +381,12 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
355381 return acc ;
356382 } , { } as Record < string , { concurrency : FairQueueConcurrency } > ) ;
357383
384+ span . setAttributes ( {
385+ org_count : orgs . length ,
386+ orgs_at_full_concurrency_count : orgsAtFullConcurrency . length ,
387+ orgs_snapshot_count : Object . keys ( orgsSnapshot ) . length ,
388+ } ) ;
389+
358390 if ( Object . keys ( orgsSnapshot ) . length === 0 ) {
359391 return emptyFairQueueSnapshot ;
360392 }
@@ -376,10 +408,6 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
376408 ( env ) => env . concurrency . current >= env . concurrency . limit
377409 ) ;
378410
379- span . setAttributes ( {
380- ...flattenAttributes ( envsAtFullConcurrency , "envs_at_full_concurrency" ) ,
381- } ) ;
382-
383411 const envIdsAtFullConcurrency = new Set ( envsAtFullConcurrency . map ( ( env ) => env . id ) ) ;
384412
385413 const envsSnapshot = envs . reduce ( ( acc , env ) => {
@@ -390,6 +418,11 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
390418 return acc ;
391419 } , { } as Record < string , { concurrency : FairQueueConcurrency } > ) ;
392420
421+ span . setAttributes ( {
422+ env_count : envs . length ,
423+ envs_at_full_concurrency_count : envsAtFullConcurrency . length ,
424+ } ) ;
425+
393426 const queuesSnapshot = queues . filter (
394427 ( queue ) =>
395428 ! orgIdsAtFullConcurrency . has ( queue . org ) && ! envIdsAtFullConcurrency . has ( queue . env )
@@ -402,6 +435,16 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
402435 queues : queuesSnapshot ,
403436 } ;
404437
438+ if (
439+ typeof this . options . reuseSnapshotCount === "number" &&
440+ this . options . reuseSnapshotCount > 0
441+ ) {
442+ this . _reusedSnapshotForConsumer . set ( `${ parentQueue } :${ consumerId } ` , {
443+ snapshot,
444+ reuseCount : 0 ,
445+ } ) ;
446+ }
447+
405448 return snapshot ;
406449 } ) ;
407450 }
0 commit comments