Skip to content

Commit 52c50e3

Browse files
authored
Do not add noop from local translog to translog again (#29637)
Today we always add no-ops to translog regardless of its origin, thus a noop may appear in the translog multiple times. This is not a big deal as noops are small and rare to appear. This commit ensures to add a noop to translog only if its origin is not from local translog. This restriction has been applied for index and delete.
1 parent a8f40b3 commit 52c50e3

File tree

3 files changed

+21
-11
lines changed

3 files changed

+21
-11
lines changed

server/src/main/java/org/elasticsearch/index/engine/InternalEngine.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1269,8 +1269,10 @@ private NoOpResult innerNoOp(final NoOp noOp) throws IOException {
12691269
final long seqNo = noOp.seqNo();
12701270
try {
12711271
final NoOpResult noOpResult = new NoOpResult(noOp.seqNo());
1272-
final Translog.Location location = translog.add(new Translog.NoOp(noOp.seqNo(), noOp.primaryTerm(), noOp.reason()));
1273-
noOpResult.setTranslogLocation(location);
1272+
if (noOp.origin() != Operation.Origin.LOCAL_TRANSLOG_RECOVERY) {
1273+
final Translog.Location location = translog.add(new Translog.NoOp(noOp.seqNo(), noOp.primaryTerm(), noOp.reason()));
1274+
noOpResult.setTranslogLocation(location);
1275+
}
12741276
noOpResult.setTook(System.nanoTime() - noOp.startTime());
12751277
noOpResult.freeze();
12761278
return noOpResult;

server/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3724,15 +3724,13 @@ protected long doGenerateSeqNoForOperation(Operation operation) {
37243724
noOpEngine.recoverFromTranslog();
37253725
final int gapsFilled = noOpEngine.fillSeqNoGaps(primaryTerm.get());
37263726
final String reason = randomAlphaOfLength(16);
3727-
noOpEngine.noOp(
3728-
new Engine.NoOp(
3729-
maxSeqNo + 1,
3730-
primaryTerm.get(),
3731-
randomFrom(PRIMARY, REPLICA, PEER_RECOVERY, LOCAL_TRANSLOG_RECOVERY),
3732-
System.nanoTime(),
3733-
reason));
3727+
noOpEngine.noOp(new Engine.NoOp(maxSeqNo + 1, primaryTerm.get(), LOCAL_TRANSLOG_RECOVERY, System.nanoTime(), reason));
37343728
assertThat(noOpEngine.getLocalCheckpointTracker().getCheckpoint(), equalTo((long) (maxSeqNo + 1)));
3735-
assertThat(noOpEngine.getTranslog().stats().getUncommittedOperations(), equalTo(1 + gapsFilled));
3729+
assertThat(noOpEngine.getTranslog().stats().getUncommittedOperations(), equalTo(gapsFilled));
3730+
noOpEngine.noOp(
3731+
new Engine.NoOp(maxSeqNo + 2, primaryTerm.get(), randomFrom(PRIMARY, REPLICA, PEER_RECOVERY), System.nanoTime(), reason));
3732+
assertThat(noOpEngine.getLocalCheckpointTracker().getCheckpoint(), equalTo((long) (maxSeqNo + 2)));
3733+
assertThat(noOpEngine.getTranslog().stats().getUncommittedOperations(), equalTo(gapsFilled + 1));
37363734
// skip to the op that we added to the translog
37373735
Translog.Operation op;
37383736
Translog.Operation last = null;
@@ -3744,7 +3742,7 @@ protected long doGenerateSeqNoForOperation(Operation operation) {
37443742
assertNotNull(last);
37453743
assertThat(last, instanceOf(Translog.NoOp.class));
37463744
final Translog.NoOp noOp = (Translog.NoOp) last;
3747-
assertThat(noOp.seqNo(), equalTo((long) (maxSeqNo + 1)));
3745+
assertThat(noOp.seqNo(), equalTo((long) (maxSeqNo + 2)));
37483746
assertThat(noOp.primaryTerm(), equalTo(primaryTerm.get()));
37493747
assertThat(noOp.reason(), equalTo(reason));
37503748
} finally {

server/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1661,6 +1661,16 @@ public void testRecoverFromStoreWithNoOps() throws IOException {
16611661
IndexShardTestCase.updateRoutingEntry(newShard, newShard.routingEntry().moveToStarted());
16621662
assertDocCount(newShard, 1);
16631663
assertDocCount(shard, 2);
1664+
1665+
for (int i = 0; i < 2; i++) {
1666+
newShard = reinitShard(newShard, ShardRoutingHelper.initWithSameId(primaryShardRouting,
1667+
RecoverySource.StoreRecoverySource.EXISTING_STORE_INSTANCE));
1668+
newShard.markAsRecovering("store", new RecoveryState(newShard.routingEntry(), localNode, null));
1669+
assertTrue(newShard.recoverFromStore());
1670+
try (Translog.Snapshot snapshot = getTranslog(newShard).newSnapshot()) {
1671+
assertThat(snapshot.totalOperations(), equalTo(2));
1672+
}
1673+
}
16641674
closeShards(newShard, shard);
16651675
}
16661676

0 commit comments

Comments
 (0)