@@ -82,7 +82,10 @@ std::atomic<unsigned __int64> leafSearchCycles{0};
82
82
static cycle_t traceCacheLockingFrequency{0 };
83
83
static cycle_t traceNodeLoadFrequency{0 };
84
84
static cycle_t traceNodeLoadThreshold{0 };
85
- static unsigned traceKeyMergeThreshold{1000 }; // Report merges of > 1000 cursor positions
85
+ static unsigned traceKeyMergeThreshold{1000 }; // Report merges of > 1000 cursor positions
86
+ static RelaxedAtomic<unsigned > mergeThresholdExceededSuppressed {0 };
87
+ static RelaxedAtomic<unsigned > maxActiveKeys {0 };
88
+ static unsigned lastMergeThresholdReport = 0 ;
86
89
87
90
MODULE_INIT (INIT_PRIORITY_JHTREE_JHTREE)
88
91
{
@@ -3384,10 +3387,30 @@ class CKeyMerger : public CKeyLevelManager
3384
3387
if (activekeys>0 )
3385
3388
{
3386
3389
if (ctx)
3387
- {
3388
3390
ctx->noteStatistic (StNumIndexMerges, activekeys);
3389
- if (traceKeyMergeThreshold && activekeys > traceKeyMergeThreshold)
3390
- ctx->CTXLOG (" Key merger with %u active keys detected" , activekeys);
3391
+ if (traceKeyMergeThreshold && activekeys > traceKeyMergeThreshold)
3392
+ {
3393
+ unsigned now = msTick ();
3394
+ if (now - lastMergeThresholdReport > 60000 )
3395
+ {
3396
+ if (mergeThresholdExceededSuppressed)
3397
+ {
3398
+ // Report skipped
3399
+ DBGLOG (" %u large key mergers detected with up to %u active keys" , mergeThresholdExceededSuppressed.load (), maxActiveKeys.load ());
3400
+ lastMergeThresholdReport = now;
3401
+ mergeThresholdExceededSuppressed = 0 ;
3402
+ maxActiveKeys = 0 ;
3403
+ }
3404
+ // Report this
3405
+ DBGLOG (" Large key merger detected with %u active keys" , activekeys);
3406
+ }
3407
+ else
3408
+ {
3409
+ // Record skipped
3410
+ mergeThresholdExceededSuppressed++;
3411
+ if (activekeys > maxActiveKeys)
3412
+ maxActiveKeys = activekeys;
3413
+ }
3391
3414
}
3392
3415
cursors = cursorArray.getArray ();
3393
3416
mergeheap = mergeHeapArray.getArray ();
0 commit comments