|
@@ -98,11 +98,9 @@ import org.elasticsearch.index.translog.Translog;
|
|
|
import org.elasticsearch.index.translog.TranslogConfig;
|
|
|
import org.elasticsearch.indices.IndicesModule;
|
|
|
import org.elasticsearch.indices.mapper.MapperRegistry;
|
|
|
-import org.elasticsearch.plugins.Plugin;
|
|
|
import org.elasticsearch.test.DummyShardLock;
|
|
|
import org.elasticsearch.test.ESTestCase;
|
|
|
import org.elasticsearch.test.IndexSettingsModule;
|
|
|
-import org.elasticsearch.test.InternalSettingsPlugin;
|
|
|
import org.elasticsearch.threadpool.TestThreadPool;
|
|
|
import org.elasticsearch.threadpool.ThreadPool;
|
|
|
import org.hamcrest.MatcherAssert;
|
|
@@ -118,7 +116,6 @@ import java.nio.file.Path;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
|
import java.util.Base64;
|
|
|
-import java.util.Collection;
|
|
|
import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
import java.util.Locale;
|
|
@@ -129,6 +126,7 @@ import java.util.concurrent.CyclicBarrier;
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
+import java.util.function.IntFunction;
|
|
|
|
|
|
import static java.util.Collections.emptyMap;
|
|
|
import static org.elasticsearch.index.engine.Engine.Operation.Origin.PRIMARY;
|
|
@@ -615,7 +613,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
for (int i = 0; i < ops; i++) {
|
|
|
final ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocumentWithTextField(), new BytesArray("{}".getBytes(Charset.defaultCharset())), null);
|
|
|
if (randomBoolean()) {
|
|
|
- final Engine.Index operation = new Engine.Index(newUid("test#1"), doc, i, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime());
|
|
|
+ final Engine.Index operation = new Engine.Index(newUid("test#1"), doc, i, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime(), -1, false);
|
|
|
operations.add(operation);
|
|
|
initialEngine.index(operation);
|
|
|
} else {
|
|
@@ -946,7 +944,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
engine.flush();
|
|
|
final boolean forceMergeFlushes = randomBoolean();
|
|
|
if (forceMergeFlushes) {
|
|
|
- engine.index(new Engine.Index(newUid("3"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime() - engine.engineConfig.getFlushMergesAfter().nanos()));
|
|
|
+ engine.index(new Engine.Index(newUid("3"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime() - engine.engineConfig.getFlushMergesAfter().nanos(), -1, false));
|
|
|
} else {
|
|
|
engine.index(new Engine.Index(newUid("3"), doc));
|
|
|
}
|
|
@@ -1033,7 +1031,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
engine.index(create);
|
|
|
assertThat(create.version(), equalTo(1L));
|
|
|
|
|
|
- create = new Engine.Index(newUid("1"), doc, create.version(), create.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0);
|
|
|
+ create = new Engine.Index(newUid("1"), doc, create.version(), create.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0, -1, false);
|
|
|
replicaEngine.index(create);
|
|
|
assertThat(create.version(), equalTo(1L));
|
|
|
}
|
|
@@ -1044,18 +1042,18 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
engine.index(index);
|
|
|
assertThat(index.version(), equalTo(1L));
|
|
|
|
|
|
- index = new Engine.Index(newUid("1"), doc, index.version(), index.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, index.version(), index.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0, -1, false);
|
|
|
replicaEngine.index(index);
|
|
|
assertThat(index.version(), equalTo(1L));
|
|
|
}
|
|
|
|
|
|
public void testExternalVersioningNewIndex() {
|
|
|
ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, null);
|
|
|
- Engine.Index index = new Engine.Index(newUid("1"), doc, 12, VersionType.EXTERNAL, PRIMARY, 0);
|
|
|
+ Engine.Index index = new Engine.Index(newUid("1"), doc, 12, VersionType.EXTERNAL, PRIMARY, 0, -1, false);
|
|
|
engine.index(index);
|
|
|
assertThat(index.version(), equalTo(12L));
|
|
|
|
|
|
- index = new Engine.Index(newUid("1"), doc, index.version(), index.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, index.version(), index.versionType().versionTypeForReplicationAndRecovery(), REPLICA, 0, -1, false);
|
|
|
replicaEngine.index(index);
|
|
|
assertThat(index.version(), equalTo(12L));
|
|
|
}
|
|
@@ -1070,7 +1068,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
engine.index(index);
|
|
|
assertThat(index.version(), equalTo(2L));
|
|
|
|
|
|
- index = new Engine.Index(newUid("1"), doc, 1L, VersionType.INTERNAL, Engine.Operation.Origin.PRIMARY, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, 1L, VersionType.INTERNAL, Engine.Operation.Origin.PRIMARY, 0, -1, false);
|
|
|
try {
|
|
|
engine.index(index);
|
|
|
fail();
|
|
@@ -1079,7 +1077,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
}
|
|
|
|
|
|
// future versions should not work as well
|
|
|
- index = new Engine.Index(newUid("1"), doc, 3L, VersionType.INTERNAL, PRIMARY, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, 3L, VersionType.INTERNAL, PRIMARY, 0, -1, false);
|
|
|
try {
|
|
|
engine.index(index);
|
|
|
fail();
|
|
@@ -1090,15 +1088,15 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
|
|
|
public void testExternalVersioningIndexConflict() {
|
|
|
ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, null);
|
|
|
- Engine.Index index = new Engine.Index(newUid("1"), doc, 12, VersionType.EXTERNAL, PRIMARY, 0);
|
|
|
+ Engine.Index index = new Engine.Index(newUid("1"), doc, 12, VersionType.EXTERNAL, PRIMARY, 0, -1, false);
|
|
|
engine.index(index);
|
|
|
assertThat(index.version(), equalTo(12L));
|
|
|
|
|
|
- index = new Engine.Index(newUid("1"), doc, 14, VersionType.EXTERNAL, PRIMARY, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, 14, VersionType.EXTERNAL, PRIMARY, 0, -1, false);
|
|
|
engine.index(index);
|
|
|
assertThat(index.version(), equalTo(14L));
|
|
|
|
|
|
- index = new Engine.Index(newUid("1"), doc, 13, VersionType.EXTERNAL, PRIMARY, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, 13, VersionType.EXTERNAL, PRIMARY, 0, -1, false);
|
|
|
try {
|
|
|
engine.index(index);
|
|
|
fail();
|
|
@@ -1119,7 +1117,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
|
|
|
engine.flush();
|
|
|
|
|
|
- index = new Engine.Index(newUid("1"), doc, 1L, VersionType.INTERNAL, PRIMARY, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, 1L, VersionType.INTERNAL, PRIMARY, 0, -1, false);
|
|
|
try {
|
|
|
engine.index(index);
|
|
|
fail();
|
|
@@ -1128,7 +1126,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
}
|
|
|
|
|
|
// future versions should not work as well
|
|
|
- index = new Engine.Index(newUid("1"), doc, 3L, VersionType.INTERNAL, PRIMARY, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, 3L, VersionType.INTERNAL, PRIMARY, 0, -1, false);
|
|
|
try {
|
|
|
engine.index(index);
|
|
|
fail();
|
|
@@ -1139,17 +1137,17 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
|
|
|
public void testExternalVersioningIndexConflictWithFlush() {
|
|
|
ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, null);
|
|
|
- Engine.Index index = new Engine.Index(newUid("1"), doc, 12, VersionType.EXTERNAL, PRIMARY, 0);
|
|
|
+ Engine.Index index = new Engine.Index(newUid("1"), doc, 12, VersionType.EXTERNAL, PRIMARY, 0, -1, false);
|
|
|
engine.index(index);
|
|
|
assertThat(index.version(), equalTo(12L));
|
|
|
|
|
|
- index = new Engine.Index(newUid("1"), doc, 14, VersionType.EXTERNAL, PRIMARY, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, 14, VersionType.EXTERNAL, PRIMARY, 0, -1, false);
|
|
|
engine.index(index);
|
|
|
assertThat(index.version(), equalTo(14L));
|
|
|
|
|
|
engine.flush();
|
|
|
|
|
|
- index = new Engine.Index(newUid("1"), doc, 13, VersionType.EXTERNAL, PRIMARY, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, 13, VersionType.EXTERNAL, PRIMARY, 0, -1, false);
|
|
|
try {
|
|
|
engine.index(index);
|
|
|
fail();
|
|
@@ -1286,7 +1284,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
assertThat(delete.version(), equalTo(3L));
|
|
|
|
|
|
// now check if we can index to a delete doc with version
|
|
|
- index = new Engine.Index(newUid("1"), doc, 2L, VersionType.INTERNAL, PRIMARY, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, 2L, VersionType.INTERNAL, PRIMARY, 0, -1, false);
|
|
|
try {
|
|
|
engine.index(index);
|
|
|
fail();
|
|
@@ -1295,7 +1293,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
}
|
|
|
|
|
|
// we shouldn't be able to create as well
|
|
|
- Engine.Index create = new Engine.Index(newUid("1"), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, 0);
|
|
|
+ Engine.Index create = new Engine.Index(newUid("1"), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, 0, -1, false);
|
|
|
try {
|
|
|
engine.index(create);
|
|
|
} catch (VersionConflictEngineException e) {
|
|
@@ -1342,7 +1340,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
engine.flush();
|
|
|
|
|
|
// now check if we can index to a delete doc with version
|
|
|
- index = new Engine.Index(newUid("1"), doc, 2L, VersionType.INTERNAL, PRIMARY, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, 2L, VersionType.INTERNAL, PRIMARY, 0, -1, false);
|
|
|
try {
|
|
|
engine.index(index);
|
|
|
fail();
|
|
@@ -1351,7 +1349,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
}
|
|
|
|
|
|
// we shouldn't be able to create as well
|
|
|
- Engine.Index create = new Engine.Index(newUid("1"), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, 0);
|
|
|
+ Engine.Index create = new Engine.Index(newUid("1"), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, 0, -1, false);
|
|
|
try {
|
|
|
engine.index(create);
|
|
|
} catch (VersionConflictEngineException e) {
|
|
@@ -1361,11 +1359,11 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
|
|
|
public void testVersioningCreateExistsException() {
|
|
|
ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, null);
|
|
|
- Engine.Index create = new Engine.Index(newUid("1"), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, 0);
|
|
|
+ Engine.Index create = new Engine.Index(newUid("1"), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, 0, -1, false);
|
|
|
engine.index(create);
|
|
|
assertThat(create.version(), equalTo(1L));
|
|
|
|
|
|
- create = new Engine.Index(newUid("1"), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, 0);
|
|
|
+ create = new Engine.Index(newUid("1"), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, 0, -1, false);
|
|
|
try {
|
|
|
engine.index(create);
|
|
|
fail();
|
|
@@ -1376,13 +1374,13 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
|
|
|
public void testVersioningCreateExistsExceptionWithFlush() {
|
|
|
ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, testDocument(), B_1, null);
|
|
|
- Engine.Index create = new Engine.Index(newUid("1"), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, 0);
|
|
|
+ Engine.Index create = new Engine.Index(newUid("1"), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, 0, -1, false);
|
|
|
engine.index(create);
|
|
|
assertThat(create.version(), equalTo(1L));
|
|
|
|
|
|
engine.flush();
|
|
|
|
|
|
- create = new Engine.Index(newUid("1"), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, 0);
|
|
|
+ create = new Engine.Index(newUid("1"), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, 0, -1, false);
|
|
|
try {
|
|
|
engine.index(create);
|
|
|
fail();
|
|
@@ -1402,12 +1400,12 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
assertThat(index.version(), equalTo(2L));
|
|
|
|
|
|
// apply the second index to the replica, should work fine
|
|
|
- index = new Engine.Index(newUid("1"), doc, index.version(), VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, index.version(), VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0, -1, false);
|
|
|
replicaEngine.index(index);
|
|
|
assertThat(index.version(), equalTo(2L));
|
|
|
|
|
|
// now, the old one should not work
|
|
|
- index = new Engine.Index(newUid("1"), doc, 1L, VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, 1L, VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0, -1, false);
|
|
|
try {
|
|
|
replicaEngine.index(index);
|
|
|
fail();
|
|
@@ -1418,7 +1416,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
// second version on replica should fail as well
|
|
|
try {
|
|
|
index = new Engine.Index(newUid("1"), doc, 2L
|
|
|
- , VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0);
|
|
|
+ , VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0, -1, false);
|
|
|
replicaEngine.index(index);
|
|
|
assertThat(index.version(), equalTo(2L));
|
|
|
} catch (VersionConflictEngineException e) {
|
|
@@ -1434,7 +1432,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
|
|
|
// apply the first index to the replica, should work fine
|
|
|
index = new Engine.Index(newUid("1"), doc, 1L
|
|
|
- , VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0);
|
|
|
+ , VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0, -1, false);
|
|
|
replicaEngine.index(index);
|
|
|
assertThat(index.version(), equalTo(1L));
|
|
|
|
|
@@ -1466,7 +1464,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
|
|
|
// now do the second index on the replica, it should fail
|
|
|
try {
|
|
|
- index = new Engine.Index(newUid("1"), doc, 2L, VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0);
|
|
|
+ index = new Engine.Index(newUid("1"), doc, 2L, VersionType.INTERNAL.versionTypeForReplicationAndRecovery(), REPLICA, 0, -1, false);
|
|
|
replicaEngine.index(index);
|
|
|
fail("excepted VersionConflictEngineException to be thrown");
|
|
|
} catch (VersionConflictEngineException e) {
|
|
@@ -1612,7 +1610,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
document.add(new TextField("value", "test1", Field.Store.YES));
|
|
|
|
|
|
ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, document, B_2, null);
|
|
|
- engine.index(new Engine.Index(newUid("1"), doc, 1, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime()));
|
|
|
+ engine.index(new Engine.Index(newUid("1"), doc, 1, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime(), -1, false));
|
|
|
|
|
|
// Delete document we just added:
|
|
|
engine.delete(new Engine.Delete("test", "1", newUid("1"), 10, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime(), false));
|
|
@@ -1637,7 +1635,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
|
|
|
// Try to index uid=1 with a too-old version, should fail:
|
|
|
try {
|
|
|
- engine.index(new Engine.Index(newUid("1"), doc, 2, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime()));
|
|
|
+ engine.index(new Engine.Index(newUid("1"), doc, 2, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime(), -1, false));
|
|
|
fail("did not hit expected exception");
|
|
|
} catch (VersionConflictEngineException vcee) {
|
|
|
// expected
|
|
@@ -1649,7 +1647,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
|
|
|
// Try to index uid=2 with a too-old version, should fail:
|
|
|
try {
|
|
|
- engine.index(new Engine.Index(newUid("2"), doc, 2, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime()));
|
|
|
+ engine.index(new Engine.Index(newUid("2"), doc, 2, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime(), -1, false));
|
|
|
fail("did not hit expected exception");
|
|
|
} catch (VersionConflictEngineException vcee) {
|
|
|
// expected
|
|
@@ -1748,7 +1746,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
final int numDocs = randomIntBetween(1, 10);
|
|
|
for (int i = 0; i < numDocs; i++) {
|
|
|
ParsedDocument doc = testParsedDocument(Integer.toString(i), Integer.toString(i), "test", null, -1, -1, testDocument(), new BytesArray("{}"), null);
|
|
|
- Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(i)), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, System.nanoTime());
|
|
|
+ Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(i)), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, System.nanoTime(), -1, false);
|
|
|
engine.index(firstIndexRequest);
|
|
|
assertThat(firstIndexRequest.version(), equalTo(1L));
|
|
|
}
|
|
@@ -1798,7 +1796,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
final int numDocs = randomIntBetween(1, 10);
|
|
|
for (int i = 0; i < numDocs; i++) {
|
|
|
ParsedDocument doc = testParsedDocument(Integer.toString(i), Integer.toString(i), "test", null, -1, -1, testDocument(), new BytesArray("{}"), null);
|
|
|
- Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(i)), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, System.nanoTime());
|
|
|
+ Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(i)), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, System.nanoTime(), -1, false);
|
|
|
engine.index(firstIndexRequest);
|
|
|
assertThat(firstIndexRequest.version(), equalTo(1L));
|
|
|
}
|
|
@@ -1888,7 +1886,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
final int numExtraDocs = randomIntBetween(1, 10);
|
|
|
for (int i = 0; i < numExtraDocs; i++) {
|
|
|
ParsedDocument doc = testParsedDocument("extra" + Integer.toString(i), "extra" + Integer.toString(i), "test", null, -1, -1, testDocument(), new BytesArray("{}"), null);
|
|
|
- Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(i)), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, System.nanoTime());
|
|
|
+ Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(i)), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, System.nanoTime(), -1, false);
|
|
|
engine.index(firstIndexRequest);
|
|
|
assertThat(firstIndexRequest.version(), equalTo(1L));
|
|
|
}
|
|
@@ -1917,7 +1915,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
final int numDocs = randomIntBetween(1, 10);
|
|
|
for (int i = 0; i < numDocs; i++) {
|
|
|
ParsedDocument doc = testParsedDocument(Integer.toString(i), Integer.toString(i), "test", null, -1, -1, testDocument(), new BytesArray("{}"), null);
|
|
|
- Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(i)), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, System.nanoTime());
|
|
|
+ Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(i)), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, System.nanoTime(), -1, false);
|
|
|
engine.index(firstIndexRequest);
|
|
|
assertThat(firstIndexRequest.version(), equalTo(1L));
|
|
|
}
|
|
@@ -1960,7 +1958,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
int randomId = randomIntBetween(numDocs + 1, numDocs + 10);
|
|
|
String uuidValue = "test#" + Integer.toString(randomId);
|
|
|
ParsedDocument doc = testParsedDocument(uuidValue, Integer.toString(randomId), "test", null, -1, -1, testDocument(), new BytesArray("{}"), null);
|
|
|
- Engine.Index firstIndexRequest = new Engine.Index(newUid(uuidValue), doc, 1, VersionType.EXTERNAL, PRIMARY, System.nanoTime());
|
|
|
+ Engine.Index firstIndexRequest = new Engine.Index(newUid(uuidValue), doc, 1, VersionType.EXTERNAL, PRIMARY, System.nanoTime(), -1, false);
|
|
|
engine.index(firstIndexRequest);
|
|
|
assertThat(firstIndexRequest.version(), equalTo(1L));
|
|
|
if (flush) {
|
|
@@ -1968,7 +1966,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
}
|
|
|
|
|
|
doc = testParsedDocument(uuidValue, Integer.toString(randomId), "test", null, -1, -1, testDocument(), new BytesArray("{}"), null);
|
|
|
- Engine.Index idxRequest = new Engine.Index(newUid(uuidValue), doc, 2, VersionType.EXTERNAL, PRIMARY, System.nanoTime());
|
|
|
+ Engine.Index idxRequest = new Engine.Index(newUid(uuidValue), doc, 2, VersionType.EXTERNAL, PRIMARY, System.nanoTime(), -1, false);
|
|
|
engine.index(idxRequest);
|
|
|
engine.refresh("test");
|
|
|
assertThat(idxRequest.version(), equalTo(2L));
|
|
@@ -2034,7 +2032,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
final int numDocs = randomIntBetween(1, 10);
|
|
|
for (int i = 0; i < numDocs; i++) {
|
|
|
ParsedDocument doc = testParsedDocument(Integer.toString(i), Integer.toString(i), "test", null, -1, -1, testDocument(), new BytesArray("{}"), null);
|
|
|
- Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(i)), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, System.nanoTime());
|
|
|
+ Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(i)), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, System.nanoTime(), -1, false);
|
|
|
engine.index(firstIndexRequest);
|
|
|
assertThat(firstIndexRequest.version(), equalTo(1L));
|
|
|
}
|
|
@@ -2120,7 +2118,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
// create
|
|
|
{
|
|
|
ParsedDocument doc = testParsedDocument(Integer.toString(0), Integer.toString(0), "test", null, -1, -1, testDocument(), new BytesArray("{}"), null);
|
|
|
- Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(0)), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, System.nanoTime());
|
|
|
+ Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(0)), doc, Versions.MATCH_DELETED, VersionType.INTERNAL, PRIMARY, System.nanoTime(), -1, false);
|
|
|
|
|
|
try (InternalEngine engine = new InternalEngine(copy(config, EngineConfig.OpenMode.CREATE_INDEX_AND_TRANSLOG))){
|
|
|
engine.index(firstIndexRequest);
|
|
@@ -2180,7 +2178,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
final int numDocs = randomIntBetween(2, 10); // at least 2 documents otherwise we don't see any deletes below
|
|
|
for (int i = 0; i < numDocs; i++) {
|
|
|
ParsedDocument doc = testParsedDocument(Integer.toString(i), Integer.toString(i), "test", null, -1, -1, testDocument(), new BytesArray("{}"), null);
|
|
|
- Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(i)), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, System.nanoTime());
|
|
|
+ Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(i)), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, System.nanoTime(), -1, false);
|
|
|
engine.index(firstIndexRequest);
|
|
|
assertThat(firstIndexRequest.version(), equalTo(1L));
|
|
|
}
|
|
@@ -2190,7 +2188,7 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
engine.forceMerge(randomBoolean(), 1, false, false, false);
|
|
|
|
|
|
ParsedDocument doc = testParsedDocument(Integer.toString(0), Integer.toString(0), "test", null, -1, -1, testDocument(), new BytesArray("{}"), null);
|
|
|
- Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(0)), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, System.nanoTime());
|
|
|
+ Engine.Index firstIndexRequest = new Engine.Index(newUid(Integer.toString(0)), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, System.nanoTime(), -1, false);
|
|
|
engine.index(firstIndexRequest);
|
|
|
assertThat(firstIndexRequest.version(), equalTo(2L));
|
|
|
engine.flush(); // flush - buffered deletes are not counted
|
|
@@ -2202,4 +2200,233 @@ public class InternalEngineTests extends ESTestCase {
|
|
|
assertEquals(0, docStats.getDeleted());
|
|
|
assertEquals(numDocs, docStats.getCount());
|
|
|
}
|
|
|
+
|
|
|
+ public void testDoubleDelivery() throws IOException {
|
|
|
+ final ParsedDocument doc = testParsedDocument("1", "1", "test", null, 100, -1, testDocumentWithTextField(), new BytesArray("{}".getBytes(Charset.defaultCharset())), null);
|
|
|
+ Engine.Index operation = randomAppendOnly(1, doc, false);
|
|
|
+ Engine.Index retry = randomAppendOnly(1, doc, true);
|
|
|
+ if (randomBoolean()) {
|
|
|
+ engine.index(operation);
|
|
|
+ assertFalse(engine.indexWriterHasDeletions());
|
|
|
+ assertEquals(0, engine.getNumVersionLookups());
|
|
|
+ assertNotNull(operation.getTranslogLocation());
|
|
|
+ engine.index(retry);
|
|
|
+ assertTrue(engine.indexWriterHasDeletions());
|
|
|
+ assertEquals(0, engine.getNumVersionLookups());
|
|
|
+ assertNotNull(retry.getTranslogLocation());
|
|
|
+ assertTrue(retry.getTranslogLocation().compareTo(operation.getTranslogLocation()) > 0);
|
|
|
+ } else {
|
|
|
+ engine.index(retry);
|
|
|
+ assertTrue(engine.indexWriterHasDeletions());
|
|
|
+ assertEquals(0, engine.getNumVersionLookups());
|
|
|
+ assertNotNull(retry.getTranslogLocation());
|
|
|
+ engine.index(operation);
|
|
|
+ assertTrue(engine.indexWriterHasDeletions());
|
|
|
+ assertEquals(0, engine.getNumVersionLookups());
|
|
|
+ assertNotNull(retry.getTranslogLocation());
|
|
|
+ assertTrue(retry.getTranslogLocation().compareTo(operation.getTranslogLocation()) < 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ engine.refresh("test");
|
|
|
+ try (Engine.Searcher searcher = engine.acquireSearcher("test")) {
|
|
|
+ TopDocs topDocs = searcher.searcher().search(new MatchAllDocsQuery(), 10);
|
|
|
+ assertEquals(1, topDocs.totalHits);
|
|
|
+ }
|
|
|
+ operation = randomAppendOnly(1, doc, false);
|
|
|
+ retry = randomAppendOnly(1, doc, true);
|
|
|
+ if (randomBoolean()) {
|
|
|
+ engine.index(operation);
|
|
|
+ assertNotNull(operation.getTranslogLocation());
|
|
|
+ engine.index(retry);
|
|
|
+ assertNotNull(retry.getTranslogLocation());
|
|
|
+ assertTrue(retry.getTranslogLocation().compareTo(operation.getTranslogLocation()) > 0);
|
|
|
+ } else {
|
|
|
+ engine.index(retry);
|
|
|
+ assertNotNull(retry.getTranslogLocation());
|
|
|
+ engine.index(operation);
|
|
|
+ assertNotNull(retry.getTranslogLocation());
|
|
|
+ assertTrue(retry.getTranslogLocation().compareTo(operation.getTranslogLocation()) < 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ engine.refresh("test");
|
|
|
+ try (Engine.Searcher searcher = engine.acquireSearcher("test")) {
|
|
|
+ TopDocs topDocs = searcher.searcher().search(new MatchAllDocsQuery(), 10);
|
|
|
+ assertEquals(1, topDocs.totalHits);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public void testRetryWithAutogeneratedIdWorksAndNoDuplicateDocs() throws IOException {
|
|
|
+
|
|
|
+ final ParsedDocument doc = testParsedDocument("1", "1", "test", null, 100, -1, testDocumentWithTextField(), new BytesArray("{}".getBytes(Charset.defaultCharset())), null);
|
|
|
+ boolean isRetry = false;
|
|
|
+ long autoGeneratedIdTimestamp = 0;
|
|
|
+
|
|
|
+ Engine.Index index = new Engine.Index(newUid("1"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, System.nanoTime(), autoGeneratedIdTimestamp, isRetry);
|
|
|
+ engine.index(index);
|
|
|
+ assertThat(index.version(), equalTo(1L));
|
|
|
+
|
|
|
+ index = new Engine.Index(newUid("1"), doc, index.version(), index.versionType().versionTypeForReplicationAndRecovery(), REPLICA, System.nanoTime(), autoGeneratedIdTimestamp, isRetry);
|
|
|
+ replicaEngine.index(index);
|
|
|
+ assertThat(index.version(), equalTo(1L));
|
|
|
+
|
|
|
+ isRetry = true;
|
|
|
+ index = new Engine.Index(newUid("1"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, System.nanoTime(), autoGeneratedIdTimestamp, isRetry);
|
|
|
+ engine.index(index);
|
|
|
+ assertThat(index.version(), equalTo(1L));
|
|
|
+ engine.refresh("test");
|
|
|
+ try (Engine.Searcher searcher = engine.acquireSearcher("test")) {
|
|
|
+ TopDocs topDocs = searcher.searcher().search(new MatchAllDocsQuery(), 10);
|
|
|
+ assertEquals(1, topDocs.totalHits);
|
|
|
+ }
|
|
|
+
|
|
|
+ index = new Engine.Index(newUid("1"), doc, index.version(), index.versionType().versionTypeForReplicationAndRecovery(), REPLICA, System.nanoTime(), autoGeneratedIdTimestamp, isRetry);
|
|
|
+ replicaEngine.index(index);
|
|
|
+ replicaEngine.refresh("test");
|
|
|
+ try (Engine.Searcher searcher = replicaEngine.acquireSearcher("test")) {
|
|
|
+ TopDocs topDocs = searcher.searcher().search(new MatchAllDocsQuery(), 10);
|
|
|
+ assertEquals(1, topDocs.totalHits);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testRetryWithAutogeneratedIdsAndWrongOrderWorksAndNoDuplicateDocs() throws IOException {
|
|
|
+
|
|
|
+ final ParsedDocument doc = testParsedDocument("1", "1", "test", null, 100, -1, testDocumentWithTextField(), new BytesArray("{}".getBytes(Charset.defaultCharset())), null);
|
|
|
+ boolean isRetry = true;
|
|
|
+ long autoGeneratedIdTimestamp = 0;
|
|
|
+
|
|
|
+
|
|
|
+ Engine.Index firstIndexRequest = new Engine.Index(newUid("1"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, System.nanoTime(), autoGeneratedIdTimestamp, isRetry);
|
|
|
+ engine.index(firstIndexRequest);
|
|
|
+ assertThat(firstIndexRequest.version(), equalTo(1L));
|
|
|
+
|
|
|
+ Engine.Index firstIndexRequestReplica = new Engine.Index(newUid("1"), doc, firstIndexRequest.version(), firstIndexRequest.versionType().versionTypeForReplicationAndRecovery(), REPLICA, System.nanoTime(), autoGeneratedIdTimestamp, isRetry);
|
|
|
+ replicaEngine.index(firstIndexRequestReplica);
|
|
|
+ assertThat(firstIndexRequestReplica.version(), equalTo(1L));
|
|
|
+
|
|
|
+ isRetry = false;
|
|
|
+ Engine.Index secondIndexRequest = new Engine.Index(newUid("1"), doc, Versions.MATCH_ANY, VersionType.INTERNAL, PRIMARY, System.nanoTime(), autoGeneratedIdTimestamp, isRetry);
|
|
|
+ engine.index(secondIndexRequest);
|
|
|
+ assertTrue(secondIndexRequest.isCreated());
|
|
|
+ engine.refresh("test");
|
|
|
+ try (Engine.Searcher searcher = engine.acquireSearcher("test")) {
|
|
|
+ TopDocs topDocs = searcher.searcher().search(new MatchAllDocsQuery(), 10);
|
|
|
+ assertEquals(1, topDocs.totalHits);
|
|
|
+ }
|
|
|
+
|
|
|
+ Engine.Index secondIndexRequestReplica = new Engine.Index(newUid("1"), doc, firstIndexRequest.version(), firstIndexRequest.versionType().versionTypeForReplicationAndRecovery(), REPLICA, System.nanoTime(), autoGeneratedIdTimestamp, isRetry);
|
|
|
+ replicaEngine.index(secondIndexRequestReplica);
|
|
|
+ replicaEngine.refresh("test");
|
|
|
+ try (Engine.Searcher searcher = replicaEngine.acquireSearcher("test")) {
|
|
|
+ TopDocs topDocs = searcher.searcher().search(new MatchAllDocsQuery(), 10);
|
|
|
+ assertEquals(1, topDocs.totalHits);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public Engine.Index randomAppendOnly(int docId, ParsedDocument doc, boolean retry) {
|
|
|
+ if (randomBoolean()) {
|
|
|
+ return new Engine.Index(newUid(Integer.toString(docId)), doc, Versions.MATCH_ANY, VersionType.INTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime(), docId, retry);
|
|
|
+ }
|
|
|
+ return new Engine.Index(newUid(Integer.toString(docId)), doc, 1, VersionType.EXTERNAL, Engine.Operation.Origin.REPLICA, System.nanoTime(), docId, retry);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testRetryConcurrently() throws InterruptedException, IOException {
|
|
|
+ Thread[] thread = new Thread[randomIntBetween(3, 5)];
|
|
|
+ int numDocs = randomIntBetween(1000, 10000);
|
|
|
+ List<Engine.Index> docs = new ArrayList<>();
|
|
|
+ for (int i = 0; i < numDocs; i++) {
|
|
|
+ final ParsedDocument doc = testParsedDocument(Integer.toString(i), Integer.toString(i), "test", null, i, -1, testDocumentWithTextField(), new BytesArray("{}".getBytes(Charset.defaultCharset())), null);
|
|
|
+ Engine.Index originalIndex = randomAppendOnly(i, doc, false);
|
|
|
+ Engine.Index retryIndex = randomAppendOnly(i, doc, true);
|
|
|
+ docs.add(originalIndex);
|
|
|
+ docs.add(retryIndex);
|
|
|
+ }
|
|
|
+ Collections.shuffle(docs, random());
|
|
|
+ CountDownLatch startGun = new CountDownLatch(thread.length);
|
|
|
+ AtomicInteger offset = new AtomicInteger(-1);
|
|
|
+ for (int i = 0; i < thread.length; i++) {
|
|
|
+ thread[i] = new Thread() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ startGun.countDown();
|
|
|
+ try {
|
|
|
+ startGun.await();
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ throw new AssertionError(e);
|
|
|
+ }
|
|
|
+ int docOffset;
|
|
|
+ while ((docOffset = offset.incrementAndGet()) < docs.size()) {
|
|
|
+ engine.index(docs.get(docOffset));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ thread[i].start();
|
|
|
+ }
|
|
|
+ for (int i = 0; i < thread.length; i++) {
|
|
|
+ thread[i].join();
|
|
|
+ }
|
|
|
+ assertEquals(0, engine.getNumVersionLookups());
|
|
|
+ assertEquals(0, engine.getNumIndexVersionsLookups());
|
|
|
+ engine.refresh("test");
|
|
|
+ try (Engine.Searcher searcher = engine.acquireSearcher("test")) {
|
|
|
+ TopDocs topDocs = searcher.searcher().search(new MatchAllDocsQuery(), 10);
|
|
|
+ assertEquals(numDocs, topDocs.totalHits);
|
|
|
+ }
|
|
|
+ assertTrue(engine.indexWriterHasDeletions());
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testAppendConcurrently() throws InterruptedException, IOException {
|
|
|
+ Thread[] thread = new Thread[randomIntBetween(3, 5)];
|
|
|
+ int numDocs = randomIntBetween(1000, 10000);
|
|
|
+ assertEquals(0, engine.getNumVersionLookups());
|
|
|
+ assertEquals(0, engine.getNumIndexVersionsLookups());
|
|
|
+ List<Engine.Index> docs = new ArrayList<>();
|
|
|
+ for (int i = 0; i < numDocs; i++) {
|
|
|
+ final ParsedDocument doc = testParsedDocument(Integer.toString(i), Integer.toString(i), "test", null, i, -1, testDocumentWithTextField(), new BytesArray("{}".getBytes(Charset.defaultCharset())), null);
|
|
|
+ Engine.Index index = randomAppendOnly(i, doc, false);
|
|
|
+ docs.add(index);
|
|
|
+ }
|
|
|
+ Collections.shuffle(docs, random());
|
|
|
+ CountDownLatch startGun = new CountDownLatch(thread.length);
|
|
|
+ AtomicInteger offset = new AtomicInteger(-1);
|
|
|
+ for (int i = 0; i < thread.length; i++) {
|
|
|
+ thread[i] = new Thread() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ startGun.countDown();
|
|
|
+ try {
|
|
|
+ startGun.await();
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ throw new AssertionError(e);
|
|
|
+ }
|
|
|
+ int docOffset;
|
|
|
+ while ((docOffset = offset.incrementAndGet()) < docs.size()) {
|
|
|
+ engine.index(docs.get(docOffset));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ thread[i].start();
|
|
|
+ }
|
|
|
+ for (int i = 0; i < thread.length; i++) {
|
|
|
+ thread[i].join();
|
|
|
+ }
|
|
|
+
|
|
|
+ engine.refresh("test");
|
|
|
+ try (Engine.Searcher searcher = engine.acquireSearcher("test")) {
|
|
|
+ TopDocs topDocs = searcher.searcher().search(new MatchAllDocsQuery(), 10);
|
|
|
+ assertEquals(docs.size(), topDocs.totalHits);
|
|
|
+ }
|
|
|
+ assertEquals(0, engine.getNumVersionLookups());
|
|
|
+ assertEquals(0, engine.getNumIndexVersionsLookups());
|
|
|
+ assertFalse(engine.indexWriterHasDeletions());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public static long getNumVersionLookups(InternalEngine engine) { // for other tests to access this
|
|
|
+ return engine.getNumVersionLookups();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static long getNumIndexVersionsLookups(InternalEngine engine) { // for other tests to access this
|
|
|
+ return engine.getNumIndexVersionsLookups();
|
|
|
+ }
|
|
|
}
|