Skip to content

Commit 1ec2443

Browse files
kovrusmergify[bot]
authored andcommitted
Fix InternalEngineTests#assertOpsOnPrimary.
Backport of elastic/elasticsearch#37746
1 parent ba075bf commit 1ec2443

File tree

2 files changed

+120
-29
lines changed

2 files changed

+120
-29
lines changed

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

Lines changed: 97 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@
147147
import java.util.concurrent.atomic.AtomicLong;
148148
import java.util.concurrent.atomic.AtomicReference;
149149
import java.util.function.BiFunction;
150+
import java.util.function.Function;
150151
import java.util.function.LongSupplier;
151152
import java.util.function.Supplier;
152153
import java.util.function.ToLongBiFunction;
@@ -1529,32 +1530,101 @@ public void testVersionOnPrimaryWithConcurrentRefresh() throws Exception {
15291530
}
15301531
});
15311532
refreshThread.start();
1532-
latch.await();
1533-
assertOpsOnPrimary(ops, Versions.NOT_FOUND, true, engine);
1534-
running.set(false);
1535-
refreshThread.join();
1533+
try {
1534+
latch.await();
1535+
assertOpsOnPrimary(ops, Versions.NOT_FOUND, true, engine);
1536+
} finally {
1537+
running.set(false);
1538+
refreshThread.join();
1539+
}
15361540
}
15371541

1538-
private int assertOpsOnPrimary(List<Engine.Operation> ops, long currentOpVersion, boolean docDeleted, InternalEngine engine)
1542+
private int assertOpsOnPrimary(List<Engine.Operation> ops,
1543+
long currentOpVersion,
1544+
boolean docDeleted,
1545+
InternalEngine engine)
15391546
throws IOException {
15401547
String lastFieldValue = null;
15411548
int opsPerformed = 0;
15421549
long lastOpVersion = currentOpVersion;
15431550
long lastOpSeqNo = UNASSIGNED_SEQ_NO;
1544-
long lastOpTerm = 0;
1545-
final AtomicLong currentTerm = new AtomicLong(1);
1546-
BiFunction<Long, Engine.Index, Engine.Index> indexWithVersion = (version, index) -> new Engine.Index(index.uid(), index.parsedDoc(),
1547-
UNASSIGNED_SEQ_NO, currentTerm.get(), version, index.versionType(), index.origin(), index.startTime(),
1548-
index.getAutoGeneratedIdTimestamp(), index.isRetry(), UNASSIGNED_SEQ_NO, 0);
1549-
BiFunction<Long, Engine.Delete, Engine.Delete> delWithVersion = (version, delete) -> new Engine.Delete(delete.type(), delete.id(),
1550-
delete.uid(), UNASSIGNED_SEQ_NO, currentTerm.get(), version, delete.versionType(), delete.origin(), delete.startTime(),
1551-
UNASSIGNED_SEQ_NO, 0);
1552-
TriFunction<Long, Long, Engine.Index, Engine.Index> indexWithSeq = (seqNo, term, index) -> new Engine.Index(index.uid(),
1553-
index.parsedDoc(), UNASSIGNED_SEQ_NO, currentTerm.get(), index.version(), index.versionType(), index.origin(),
1554-
index.startTime(), index.getAutoGeneratedIdTimestamp(), index.isRetry(), seqNo, term);
1555-
TriFunction<Long, Long, Engine.Delete, Engine.Delete> delWithSeq = (seqNo, term, delete) -> new Engine.Delete(delete.type(),
1556-
delete.id(), delete.uid(), UNASSIGNED_SEQ_NO, currentTerm.get(), delete.version(), delete.versionType(), delete.origin(),
1557-
delete.startTime(), seqNo, term);
1551+
long lastOpTerm = UNASSIGNED_PRIMARY_TERM;
1552+
PrimaryTermSupplier currentTerm = (PrimaryTermSupplier) engine.engineConfig.getPrimaryTermSupplier();
1553+
BiFunction<Long, Engine.Index, Engine.Index> indexWithVersion = (version, index) -> new Engine.Index(
1554+
index.uid(),
1555+
index.parsedDoc(),
1556+
UNASSIGNED_SEQ_NO,
1557+
currentTerm.get(),
1558+
version,
1559+
index.versionType(),
1560+
index.origin(),
1561+
index.startTime(),
1562+
index.getAutoGeneratedIdTimestamp(),
1563+
index.isRetry(),
1564+
UNASSIGNED_SEQ_NO,
1565+
0);
1566+
BiFunction<Long, Engine.Delete, Engine.Delete> delWithVersion = (version, delete) -> new Engine.Delete(
1567+
delete.type(),
1568+
delete.id(),
1569+
delete.uid(),
1570+
UNASSIGNED_SEQ_NO,
1571+
currentTerm.get(),
1572+
version,
1573+
delete.versionType(),
1574+
delete.origin(),
1575+
delete.startTime(),
1576+
UNASSIGNED_SEQ_NO,
1577+
0);
1578+
TriFunction<Long, Long, Engine.Index, Engine.Index> indexWithSeq = (seqNo, term, index) -> new Engine.Index(
1579+
index.uid(),
1580+
index.parsedDoc(),
1581+
UNASSIGNED_SEQ_NO,
1582+
currentTerm.get(),
1583+
index.version(),
1584+
index.versionType(),
1585+
index.origin(),
1586+
index.startTime(),
1587+
index.getAutoGeneratedIdTimestamp(),
1588+
index.isRetry(),
1589+
seqNo,
1590+
term);
1591+
TriFunction<Long, Long, Engine.Delete, Engine.Delete> delWithSeq = (seqNo, term, delete) -> new Engine.Delete(
1592+
delete.type(),
1593+
delete.id(),
1594+
delete.uid(),
1595+
UNASSIGNED_SEQ_NO,
1596+
currentTerm.get(),
1597+
delete.version(),
1598+
delete.versionType(),
1599+
delete.origin(),
1600+
delete.startTime(),
1601+
seqNo,
1602+
term);
1603+
Function<Engine.Index, Engine.Index> indexWithCurrentTerm = index -> new Engine.Index(
1604+
index.uid(),
1605+
index.parsedDoc(),
1606+
UNASSIGNED_SEQ_NO,
1607+
currentTerm.get(),
1608+
index.version(),
1609+
index.versionType(),
1610+
index.origin(),
1611+
index.startTime(),
1612+
index.getAutoGeneratedIdTimestamp(),
1613+
index.isRetry(),
1614+
index.getIfSeqNoMatch(),
1615+
index.getIfPrimaryTermMatch());
1616+
Function<Engine.Delete, Engine.Delete> deleteWithCurrentTerm = delete -> new Engine.Delete(
1617+
delete.type(),
1618+
delete.id(),
1619+
delete.uid(),
1620+
UNASSIGNED_SEQ_NO,
1621+
currentTerm.get(),
1622+
delete.version(),
1623+
delete.versionType(),
1624+
delete.origin(),
1625+
delete.startTime(),
1626+
delete.getIfSeqNoMatch(),
1627+
delete.getIfPrimaryTermMatch());
15581628
for (Engine.Operation op : ops) {
15591629
final boolean versionConflict = rarely();
15601630
final boolean versionedOp = versionConflict || randomBoolean();
@@ -1566,7 +1636,8 @@ private int assertOpsOnPrimary(List<Engine.Operation> ops, long currentOpVersion
15661636
lastOpSeqNo;
15671637
final long conflictingTerm = conflictingSeqNo == lastOpSeqNo || randomBoolean() ? lastOpTerm + 1 : lastOpTerm;
15681638
if (rarely()) {
1569-
currentTerm.incrementAndGet();
1639+
currentTerm.set(currentTerm.get() + 1L);
1640+
engine.rollTranslogGeneration();
15701641
}
15711642
final long correctVersion = docDeleted && randomBoolean() ? Versions.MATCH_DELETED : lastOpVersion;
15721643
logger.info("performing [{}]{}{}",
@@ -1597,7 +1668,7 @@ private int assertOpsOnPrimary(List<Engine.Operation> ops, long currentOpVersion
15971668
result = engine.index(indexWithVersion.apply(correctVersion, index));
15981669
}
15991670
} else {
1600-
result = engine.index(index);
1671+
result = engine.index(indexWithCurrentTerm.apply(index));
16011672
}
16021673
assertThat(result.isCreated(), equalTo(docDeleted));
16031674
assertThat(result.getVersion(), equalTo(Math.max(lastOpVersion + 1, 1)));
@@ -1631,16 +1702,16 @@ private int assertOpsOnPrimary(List<Engine.Operation> ops, long currentOpVersion
16311702
} else if (versionedOp) {
16321703
result = engine.delete(delWithVersion.apply(correctVersion, delete));
16331704
} else {
1634-
result = engine.delete(delete);
1705+
result = engine.delete(deleteWithCurrentTerm.apply(delete));
16351706
}
16361707
assertThat(result.isFound(), equalTo(docDeleted == false));
16371708
assertThat(result.getVersion(), equalTo(Math.max(lastOpVersion + 1, 1)));
16381709
assertThat(result.getResultType(), equalTo(Engine.Result.Type.SUCCESS));
16391710
assertThat(result.getFailure(), nullValue());
16401711
docDeleted = true;
16411712
lastOpVersion = result.getVersion();
1642-
lastOpSeqNo = UNASSIGNED_SEQ_NO;
1643-
lastOpTerm = 0;
1713+
lastOpSeqNo = result.getSeqNo();
1714+
lastOpTerm = result.getTerm();
16441715
opsPerformed++;
16451716
}
16461717
}
@@ -1668,6 +1739,8 @@ private int assertOpsOnPrimary(List<Engine.Operation> ops, long currentOpVersion
16681739
engine.clearDeletedTombstones();
16691740
if (docDeleted) {
16701741
lastOpVersion = Versions.NOT_FOUND;
1742+
lastOpSeqNo = UNASSIGNED_SEQ_NO;
1743+
lastOpTerm = UNASSIGNED_PRIMARY_TERM;
16711744
}
16721745
}
16731746
}

es/es-testing/src/main/java/org/elasticsearch/index/engine/EngineTestCase.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,8 @@ public abstract class EngineTestCase extends ESTestCase {
135135
protected Path primaryTranslogDir;
136136
protected Path replicaTranslogDir;
137137
// A default primary term is used by engine instances created in this test.
138-
protected AtomicLong primaryTerm = new AtomicLong();
138+
protected final PrimaryTermSupplier primaryTerm = new PrimaryTermSupplier(0L);
139139

140-
protected static void assertVisibleCount(Engine engine, int numDocs) throws IOException {
141-
assertVisibleCount(engine, numDocs, true);
142-
}
143140

144141
protected static void assertVisibleCount(Engine engine, int numDocs, boolean refresh) throws IOException {
145142
if (refresh) {
@@ -585,7 +582,7 @@ public void onFailedEngine(String reason, @Nullable Exception e) {
585582
intRefreshListenerList,
586583
new NoneCircuitBreakerService(),
587584
globalCheckpointSupplier,
588-
primaryTerm::get,
585+
primaryTerm,
589586
tombstoneDocSupplier());
590587
}
591588

@@ -981,4 +978,25 @@ public static Translog getTranslog(Engine engine) {
981978
InternalEngine internalEngine = (InternalEngine) engine;
982979
return internalEngine.getTranslog();
983980
}
981+
982+
public static final class PrimaryTermSupplier implements LongSupplier {
983+
private final AtomicLong term;
984+
985+
PrimaryTermSupplier(long initialTerm) {
986+
this.term = new AtomicLong(initialTerm);
987+
}
988+
989+
public long get() {
990+
return term.get();
991+
}
992+
993+
public void set(long newTerm) {
994+
this.term.set(newTerm);
995+
}
996+
997+
@Override
998+
public long getAsLong() {
999+
return get();
1000+
}
1001+
}
9841002
}

0 commit comments

Comments
 (0)