2525import com .apple .foundationdb .record .logging .KeyValueLogMessage ;
2626import com .apple .foundationdb .record .logging .LogMessageKeys ;
2727import com .apple .foundationdb .record .metadata .Index ;
28+ import com .apple .foundationdb .record .provider .common .StoreTimer ;
29+ import com .apple .foundationdb .record .provider .common .StoreTimerSnapshot ;
2830import com .apple .foundationdb .record .util .Result ;
2931import org .slf4j .Logger ;
3032import org .slf4j .LoggerFactory ;
3133
34+ import javax .annotation .Nullable ;
3235import javax .annotation .ParametersAreNonnullByDefault ;
36+ import java .util .Collections ;
3337import java .util .List ;
38+ import java .util .Map ;
3439import java .util .concurrent .CompletableFuture ;
3540import java .util .concurrent .atomic .AtomicInteger ;
3641import java .util .concurrent .atomic .AtomicLong ;
@@ -52,6 +57,8 @@ public class IndexingMerger {
5257 private final IndexingCommon common ;
5358 private int repartitionDocumentCount = 0 ;
5459 private int repartitionSecondChances = 0 ;
60+ private StoreTimerSnapshot lastProgressSnapshot = null ;
61+
5562
5663 public IndexingMerger (final Index index , IndexingCommon common , long initialMergesCountLimit ) {
5764 this .index = index ;
@@ -75,6 +82,7 @@ CompletableFuture<Void> mergeIndex() {
7582 // Note: this runAsync will retry according to the runner's "maxAttempts" setting
7683 common .getRunner ().runAsync (context -> openRecordStore (context )
7784 .thenCompose (store -> {
85+ startFdbMetricsMeasurement (timer );
7886 mergeStartTime .set (System .nanoTime ());
7987 final IndexDeferredMaintenanceControl mergeControl = store .getIndexDeferredMaintenanceControl ();
8088 mergeControlRef .set (mergeControl );
@@ -229,7 +237,7 @@ private void giveUpMerging(final IndexDeferredMaintenanceControl mergeControl, T
229237 throw common .getRunner ().getDatabase ().mapAsyncToSyncException (e );
230238 }
231239
232- List <Object > mergerKeysAndValues (final IndexDeferredMaintenanceControl mergeControl ) {
240+ private List <Object > mergerKeysAndValues (final IndexDeferredMaintenanceControl mergeControl ) {
233241 return List .of (
234242 LogMessageKeys .INDEX_NAME , index .getName (),
235243 LogMessageKeys .INDEX_MERGES_LAST_LIMIT , mergeControl .getMergesLimit (),
@@ -242,14 +250,27 @@ List<Object> mergerKeysAndValues(final IndexDeferredMaintenanceControl mergeCont
242250 );
243251 }
244252
245- String mergerLogMessage (String ttl , final IndexDeferredMaintenanceControl mergeControl ) {
253+ private String mergerLogMessage (String ttl , final IndexDeferredMaintenanceControl mergeControl ) {
246254 final KeyValueLogMessage msg = KeyValueLogMessage .build (ttl );
247255 msg .addKeysAndValues (mergerKeysAndValues (mergeControl ));
256+ // Note: this fdb metrics represents fdb activity within a single merge operation
257+ msg .addKeysAndValues (getFdbMetricsMeasurement (common .getRunner ().getTimer ()));
248258 SubspaceProvider subspaceProvider = common .getRecordStoreBuilder ().getSubspaceProvider ();
249259 if (subspaceProvider != null ) {
250260 msg .addKeyAndValue (subspaceProvider .logKey (), subspaceProvider );
251261 }
252262 return msg .toString ();
253263 }
254264
265+ private void startFdbMetricsMeasurement (@ Nullable FDBStoreTimer timer ) {
266+ if (timer != null ) {
267+ lastProgressSnapshot = StoreTimerSnapshot .from (timer );
268+ }
269+ }
270+
271+ private Map <String , Number > getFdbMetricsMeasurement (@ Nullable FDBStoreTimer timer ) {
272+ return (timer == null || lastProgressSnapshot == null ) ?
273+ Collections .emptyMap () :
274+ StoreTimer .getDifference (timer , lastProgressSnapshot ).getKeysAndValues ();
275+ }
255276}
0 commit comments