mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-03-09 14:34:43 +00:00
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.
This commit is contained in:
parent
a8f40b3e04
commit
52c50e353b
@ -1269,8 +1269,10 @@ public class InternalEngine extends Engine {
|
|||||||
final long seqNo = noOp.seqNo();
|
final long seqNo = noOp.seqNo();
|
||||||
try {
|
try {
|
||||||
final NoOpResult noOpResult = new NoOpResult(noOp.seqNo());
|
final NoOpResult noOpResult = new NoOpResult(noOp.seqNo());
|
||||||
final Translog.Location location = translog.add(new Translog.NoOp(noOp.seqNo(), noOp.primaryTerm(), noOp.reason()));
|
if (noOp.origin() != Operation.Origin.LOCAL_TRANSLOG_RECOVERY) {
|
||||||
noOpResult.setTranslogLocation(location);
|
final Translog.Location location = translog.add(new Translog.NoOp(noOp.seqNo(), noOp.primaryTerm(), noOp.reason()));
|
||||||
|
noOpResult.setTranslogLocation(location);
|
||||||
|
}
|
||||||
noOpResult.setTook(System.nanoTime() - noOp.startTime());
|
noOpResult.setTook(System.nanoTime() - noOp.startTime());
|
||||||
noOpResult.freeze();
|
noOpResult.freeze();
|
||||||
return noOpResult;
|
return noOpResult;
|
||||||
|
@ -3724,15 +3724,13 @@ public class InternalEngineTests extends EngineTestCase {
|
|||||||
noOpEngine.recoverFromTranslog();
|
noOpEngine.recoverFromTranslog();
|
||||||
final int gapsFilled = noOpEngine.fillSeqNoGaps(primaryTerm.get());
|
final int gapsFilled = noOpEngine.fillSeqNoGaps(primaryTerm.get());
|
||||||
final String reason = randomAlphaOfLength(16);
|
final String reason = randomAlphaOfLength(16);
|
||||||
noOpEngine.noOp(
|
noOpEngine.noOp(new Engine.NoOp(maxSeqNo + 1, primaryTerm.get(), LOCAL_TRANSLOG_RECOVERY, System.nanoTime(), reason));
|
||||||
new Engine.NoOp(
|
|
||||||
maxSeqNo + 1,
|
|
||||||
primaryTerm.get(),
|
|
||||||
randomFrom(PRIMARY, REPLICA, PEER_RECOVERY, LOCAL_TRANSLOG_RECOVERY),
|
|
||||||
System.nanoTime(),
|
|
||||||
reason));
|
|
||||||
assertThat(noOpEngine.getLocalCheckpointTracker().getCheckpoint(), equalTo((long) (maxSeqNo + 1)));
|
assertThat(noOpEngine.getLocalCheckpointTracker().getCheckpoint(), equalTo((long) (maxSeqNo + 1)));
|
||||||
assertThat(noOpEngine.getTranslog().stats().getUncommittedOperations(), equalTo(1 + gapsFilled));
|
assertThat(noOpEngine.getTranslog().stats().getUncommittedOperations(), equalTo(gapsFilled));
|
||||||
|
noOpEngine.noOp(
|
||||||
|
new Engine.NoOp(maxSeqNo + 2, primaryTerm.get(), randomFrom(PRIMARY, REPLICA, PEER_RECOVERY), System.nanoTime(), reason));
|
||||||
|
assertThat(noOpEngine.getLocalCheckpointTracker().getCheckpoint(), equalTo((long) (maxSeqNo + 2)));
|
||||||
|
assertThat(noOpEngine.getTranslog().stats().getUncommittedOperations(), equalTo(gapsFilled + 1));
|
||||||
// skip to the op that we added to the translog
|
// skip to the op that we added to the translog
|
||||||
Translog.Operation op;
|
Translog.Operation op;
|
||||||
Translog.Operation last = null;
|
Translog.Operation last = null;
|
||||||
@ -3744,7 +3742,7 @@ public class InternalEngineTests extends EngineTestCase {
|
|||||||
assertNotNull(last);
|
assertNotNull(last);
|
||||||
assertThat(last, instanceOf(Translog.NoOp.class));
|
assertThat(last, instanceOf(Translog.NoOp.class));
|
||||||
final Translog.NoOp noOp = (Translog.NoOp) last;
|
final Translog.NoOp noOp = (Translog.NoOp) last;
|
||||||
assertThat(noOp.seqNo(), equalTo((long) (maxSeqNo + 1)));
|
assertThat(noOp.seqNo(), equalTo((long) (maxSeqNo + 2)));
|
||||||
assertThat(noOp.primaryTerm(), equalTo(primaryTerm.get()));
|
assertThat(noOp.primaryTerm(), equalTo(primaryTerm.get()));
|
||||||
assertThat(noOp.reason(), equalTo(reason));
|
assertThat(noOp.reason(), equalTo(reason));
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -1661,6 +1661,16 @@ public class IndexShardTests extends IndexShardTestCase {
|
|||||||
IndexShardTestCase.updateRoutingEntry(newShard, newShard.routingEntry().moveToStarted());
|
IndexShardTestCase.updateRoutingEntry(newShard, newShard.routingEntry().moveToStarted());
|
||||||
assertDocCount(newShard, 1);
|
assertDocCount(newShard, 1);
|
||||||
assertDocCount(shard, 2);
|
assertDocCount(shard, 2);
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
|
newShard = reinitShard(newShard, ShardRoutingHelper.initWithSameId(primaryShardRouting,
|
||||||
|
RecoverySource.StoreRecoverySource.EXISTING_STORE_INSTANCE));
|
||||||
|
newShard.markAsRecovering("store", new RecoveryState(newShard.routingEntry(), localNode, null));
|
||||||
|
assertTrue(newShard.recoverFromStore());
|
||||||
|
try (Translog.Snapshot snapshot = getTranslog(newShard).newSnapshot()) {
|
||||||
|
assertThat(snapshot.totalOperations(), equalTo(2));
|
||||||
|
}
|
||||||
|
}
|
||||||
closeShards(newShard, shard);
|
closeShards(newShard, shard);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user