Skip to content

Commit b1cefc1

Browse files
committed
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 3e6489a commit b1cefc1

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
@@ -1318,8 +1318,10 @@ private NoOpResult innerNoOp(final NoOp noOp) throws IOException {
13181318
final long seqNo = noOp.seqNo();
13191319
try {
13201320
final NoOpResult noOpResult = new NoOpResult(noOp.seqNo());
1321-
final Translog.Location location = translog.add(new Translog.NoOp(noOp.seqNo(), noOp.primaryTerm(), noOp.reason()));
1322-
noOpResult.setTranslogLocation(location);
1321+
if (noOp.origin() != Operation.Origin.LOCAL_TRANSLOG_RECOVERY) {
1322+
final Translog.Location location = translog.add(new Translog.NoOp(noOp.seqNo(), noOp.primaryTerm(), noOp.reason()));
1323+
noOpResult.setTranslogLocation(location);
1324+
}
13231325
noOpResult.setTook(System.nanoTime() - noOp.startTime());
13241326
noOpResult.freeze();
13251327
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
@@ -3742,15 +3742,13 @@ protected long doGenerateSeqNoForOperation(Operation operation) {
37423742
noOpEngine.recoverFromTranslog();
37433743
final int gapsFilled = noOpEngine.fillSeqNoGaps(primaryTerm.get());
37443744
final String reason = randomAlphaOfLength(16);
3745-
noOpEngine.noOp(
3746-
new Engine.NoOp(
3747-
maxSeqNo + 1,
3748-
primaryTerm.get(),
3749-
randomFrom(PRIMARY, REPLICA, PEER_RECOVERY, LOCAL_TRANSLOG_RECOVERY),
3750-
System.nanoTime(),
3751-
reason));
3745+
noOpEngine.noOp(new Engine.NoOp(maxSeqNo + 1, primaryTerm.get(), LOCAL_TRANSLOG_RECOVERY, System.nanoTime(), reason));
37523746
assertThat(noOpEngine.getLocalCheckpointTracker().getCheckpoint(), equalTo((long) (maxSeqNo + 1)));
3753-
assertThat(noOpEngine.getTranslog().stats().getUncommittedOperations(), equalTo(1 + gapsFilled));
3747+
assertThat(noOpEngine.getTranslog().stats().getUncommittedOperations(), equalTo(gapsFilled));
3748+
noOpEngine.noOp(
3749+
new Engine.NoOp(maxSeqNo + 2, primaryTerm.get(), randomFrom(PRIMARY, REPLICA, PEER_RECOVERY), System.nanoTime(), reason));
3750+
assertThat(noOpEngine.getLocalCheckpointTracker().getCheckpoint(), equalTo((long) (maxSeqNo + 2)));
3751+
assertThat(noOpEngine.getTranslog().stats().getUncommittedOperations(), equalTo(gapsFilled + 1));
37543752
// skip to the op that we added to the translog
37553753
Translog.Operation op;
37563754
Translog.Operation last = null;
@@ -3762,7 +3760,7 @@ protected long doGenerateSeqNoForOperation(Operation operation) {
37623760
assertNotNull(last);
37633761
assertThat(last, instanceOf(Translog.NoOp.class));
37643762
final Translog.NoOp noOp = (Translog.NoOp) last;
3765-
assertThat(noOp.seqNo(), equalTo((long) (maxSeqNo + 1)));
3763+
assertThat(noOp.seqNo(), equalTo((long) (maxSeqNo + 2)));
37663764
assertThat(noOp.primaryTerm(), equalTo(primaryTerm.get()));
37673765
assertThat(noOp.reason(), equalTo(reason));
37683766
} 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
@@ -1659,6 +1659,16 @@ public void testRecoverFromStoreWithNoOps() throws IOException {
16591659
IndexShardTestCase.updateRoutingEntry(newShard, newShard.routingEntry().moveToStarted());
16601660
assertDocCount(newShard, 1);
16611661
assertDocCount(shard, 2);
1662+
1663+
for (int i = 0; i < 2; i++) {
1664+
newShard = reinitShard(newShard, ShardRoutingHelper.initWithSameId(primaryShardRouting,
1665+
RecoverySource.StoreRecoverySource.EXISTING_STORE_INSTANCE));
1666+
newShard.markAsRecovering("store", new RecoveryState(newShard.routingEntry(), localNode, null));
1667+
assertTrue(newShard.recoverFromStore());
1668+
try (Translog.Snapshot snapshot = getTranslog(newShard).newSnapshot()) {
1669+
assertThat(snapshot.totalOperations(), equalTo(2));
1670+
}
1671+
}
16621672
closeShards(newShard, shard);
16631673
}
16641674

0 commit comments

Comments
 (0)