|
@@ -67,9 +67,6 @@ import java.io.IOException;
|
|
|
import java.util.Collections;
|
|
import java.util.Collections;
|
|
|
import java.util.HashSet;
|
|
import java.util.HashSet;
|
|
|
import java.util.Locale;
|
|
import java.util.Locale;
|
|
|
-import java.util.concurrent.BrokenBarrierException;
|
|
|
|
|
-import java.util.concurrent.CountDownLatch;
|
|
|
|
|
-import java.util.concurrent.CyclicBarrier;
|
|
|
|
|
import java.util.concurrent.ExecutionException;
|
|
import java.util.concurrent.ExecutionException;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
@@ -143,7 +140,7 @@ public class TransportWriteActionTests extends ESTestCase {
|
|
|
testAction.shardOperationOnPrimary(request, indexShard,
|
|
testAction.shardOperationOnPrimary(request, indexShard,
|
|
|
ActionTestUtils.assertNoFailureListener(result -> {
|
|
ActionTestUtils.assertNoFailureListener(result -> {
|
|
|
CapturingActionListener<TestResponse> listener = new CapturingActionListener<>();
|
|
CapturingActionListener<TestResponse> listener = new CapturingActionListener<>();
|
|
|
- result.respond(listener);
|
|
|
|
|
|
|
+ result.runPostReplicationActions(ActionListener.map(listener, ignore -> result.finalResponseIfSuccessful));
|
|
|
assertNotNull(listener.response);
|
|
assertNotNull(listener.response);
|
|
|
assertNull(listener.failure);
|
|
assertNull(listener.failure);
|
|
|
verify(indexShard, never()).refresh(any());
|
|
verify(indexShard, never()).refresh(any());
|
|
@@ -158,7 +155,7 @@ public class TransportWriteActionTests extends ESTestCase {
|
|
|
TransportWriteAction.WriteReplicaResult<TestRequest> result =
|
|
TransportWriteAction.WriteReplicaResult<TestRequest> result =
|
|
|
testAction.shardOperationOnReplica(request, indexShard);
|
|
testAction.shardOperationOnReplica(request, indexShard);
|
|
|
CapturingActionListener<TransportResponse.Empty> listener = new CapturingActionListener<>();
|
|
CapturingActionListener<TransportResponse.Empty> listener = new CapturingActionListener<>();
|
|
|
- result.respond(listener);
|
|
|
|
|
|
|
+ result.runPostReplicaActions(ActionListener.map(listener, ignore -> TransportResponse.Empty.INSTANCE));
|
|
|
assertNotNull(listener.response);
|
|
assertNotNull(listener.response);
|
|
|
assertNull(listener.failure);
|
|
assertNull(listener.failure);
|
|
|
verify(indexShard, never()).refresh(any());
|
|
verify(indexShard, never()).refresh(any());
|
|
@@ -172,7 +169,7 @@ public class TransportWriteActionTests extends ESTestCase {
|
|
|
testAction.shardOperationOnPrimary(request, indexShard,
|
|
testAction.shardOperationOnPrimary(request, indexShard,
|
|
|
ActionTestUtils.assertNoFailureListener(result -> {
|
|
ActionTestUtils.assertNoFailureListener(result -> {
|
|
|
CapturingActionListener<TestResponse> listener = new CapturingActionListener<>();
|
|
CapturingActionListener<TestResponse> listener = new CapturingActionListener<>();
|
|
|
- result.respond(listener);
|
|
|
|
|
|
|
+ result.runPostReplicationActions(ActionListener.map(listener, ignore -> result.finalResponseIfSuccessful));
|
|
|
assertNotNull(listener.response);
|
|
assertNotNull(listener.response);
|
|
|
assertNull(listener.failure);
|
|
assertNull(listener.failure);
|
|
|
assertTrue(listener.response.forcedRefresh);
|
|
assertTrue(listener.response.forcedRefresh);
|
|
@@ -188,7 +185,7 @@ public class TransportWriteActionTests extends ESTestCase {
|
|
|
TransportWriteAction.WriteReplicaResult<TestRequest> result =
|
|
TransportWriteAction.WriteReplicaResult<TestRequest> result =
|
|
|
testAction.shardOperationOnReplica(request, indexShard);
|
|
testAction.shardOperationOnReplica(request, indexShard);
|
|
|
CapturingActionListener<TransportResponse.Empty> listener = new CapturingActionListener<>();
|
|
CapturingActionListener<TransportResponse.Empty> listener = new CapturingActionListener<>();
|
|
|
- result.respond(listener);
|
|
|
|
|
|
|
+ result.runPostReplicaActions(ActionListener.map(listener, ignore -> TransportResponse.Empty.INSTANCE));
|
|
|
assertNotNull(listener.response);
|
|
assertNotNull(listener.response);
|
|
|
assertNull(listener.failure);
|
|
assertNull(listener.failure);
|
|
|
verify(indexShard).refresh("refresh_flag_index");
|
|
verify(indexShard).refresh("refresh_flag_index");
|
|
@@ -203,7 +200,7 @@ public class TransportWriteActionTests extends ESTestCase {
|
|
|
testAction.shardOperationOnPrimary(request, indexShard,
|
|
testAction.shardOperationOnPrimary(request, indexShard,
|
|
|
ActionTestUtils.assertNoFailureListener(result -> {
|
|
ActionTestUtils.assertNoFailureListener(result -> {
|
|
|
CapturingActionListener<TestResponse> listener = new CapturingActionListener<>();
|
|
CapturingActionListener<TestResponse> listener = new CapturingActionListener<>();
|
|
|
- result.respond(listener);
|
|
|
|
|
|
|
+ result.runPostReplicationActions(ActionListener.map(listener, ignore -> result.finalResponseIfSuccessful));
|
|
|
assertNull(listener.response); // Haven't really responded yet
|
|
assertNull(listener.response); // Haven't really responded yet
|
|
|
|
|
|
|
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
|
@@ -226,7 +223,7 @@ public class TransportWriteActionTests extends ESTestCase {
|
|
|
TestAction testAction = new TestAction();
|
|
TestAction testAction = new TestAction();
|
|
|
TransportWriteAction.WriteReplicaResult<TestRequest> result = testAction.shardOperationOnReplica(request, indexShard);
|
|
TransportWriteAction.WriteReplicaResult<TestRequest> result = testAction.shardOperationOnReplica(request, indexShard);
|
|
|
CapturingActionListener<TransportResponse.Empty> listener = new CapturingActionListener<>();
|
|
CapturingActionListener<TransportResponse.Empty> listener = new CapturingActionListener<>();
|
|
|
- result.respond(listener);
|
|
|
|
|
|
|
+ result.runPostReplicaActions(ActionListener.map(listener, ignore -> TransportResponse.Empty.INSTANCE));
|
|
|
assertNull(listener.response); // Haven't responded yet
|
|
assertNull(listener.response); // Haven't responded yet
|
|
|
@SuppressWarnings({ "unchecked", "rawtypes" })
|
|
@SuppressWarnings({ "unchecked", "rawtypes" })
|
|
|
ArgumentCaptor<Consumer<Boolean>> refreshListener = ArgumentCaptor.forClass((Class) Consumer.class);
|
|
ArgumentCaptor<Consumer<Boolean>> refreshListener = ArgumentCaptor.forClass((Class) Consumer.class);
|
|
@@ -244,9 +241,9 @@ public class TransportWriteActionTests extends ESTestCase {
|
|
|
TestRequest request = new TestRequest();
|
|
TestRequest request = new TestRequest();
|
|
|
TestAction testAction = new TestAction(true, true);
|
|
TestAction testAction = new TestAction(true, true);
|
|
|
testAction.shardOperationOnPrimary(request, indexShard,
|
|
testAction.shardOperationOnPrimary(request, indexShard,
|
|
|
- ActionTestUtils.assertNoFailureListener(writePrimaryResult -> {
|
|
|
|
|
|
|
+ ActionTestUtils.assertNoFailureListener(result -> {
|
|
|
CapturingActionListener<TestResponse> listener = new CapturingActionListener<>();
|
|
CapturingActionListener<TestResponse> listener = new CapturingActionListener<>();
|
|
|
- writePrimaryResult.respond(listener);
|
|
|
|
|
|
|
+ result.runPostReplicationActions(ActionListener.map(listener, ignore -> result.finalResponseIfSuccessful));
|
|
|
assertNull(listener.response);
|
|
assertNull(listener.response);
|
|
|
assertNotNull(listener.failure);
|
|
assertNotNull(listener.failure);
|
|
|
}));
|
|
}));
|
|
@@ -255,10 +252,10 @@ public class TransportWriteActionTests extends ESTestCase {
|
|
|
public void testDocumentFailureInShardOperationOnReplica() throws Exception {
|
|
public void testDocumentFailureInShardOperationOnReplica() throws Exception {
|
|
|
TestRequest request = new TestRequest();
|
|
TestRequest request = new TestRequest();
|
|
|
TestAction testAction = new TestAction(randomBoolean(), true);
|
|
TestAction testAction = new TestAction(randomBoolean(), true);
|
|
|
- TransportWriteAction.WriteReplicaResult<TestRequest> writeReplicaResult =
|
|
|
|
|
|
|
+ TransportWriteAction.WriteReplicaResult<TestRequest> result =
|
|
|
testAction.shardOperationOnReplica(request, indexShard);
|
|
testAction.shardOperationOnReplica(request, indexShard);
|
|
|
CapturingActionListener<TransportResponse.Empty> listener = new CapturingActionListener<>();
|
|
CapturingActionListener<TransportResponse.Empty> listener = new CapturingActionListener<>();
|
|
|
- writeReplicaResult.respond(listener);
|
|
|
|
|
|
|
+ result.runPostReplicaActions(ActionListener.map(listener, ignore -> TransportResponse.Empty.INSTANCE));
|
|
|
assertNull(listener.response);
|
|
assertNull(listener.response);
|
|
|
assertNotNull(listener.failure);
|
|
assertNotNull(listener.failure);
|
|
|
}
|
|
}
|
|
@@ -350,41 +347,6 @@ public class TransportWriteActionTests extends ESTestCase {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public void testConcurrentWriteReplicaResultCompletion() throws InterruptedException {
|
|
|
|
|
- IndexShard replica = mock(IndexShard.class);
|
|
|
|
|
- when(replica.getTranslogDurability()).thenReturn(Translog.Durability.ASYNC);
|
|
|
|
|
- TestRequest request = new TestRequest();
|
|
|
|
|
- request.setRefreshPolicy(RefreshPolicy.WAIT_UNTIL);
|
|
|
|
|
- TransportWriteAction.WriteReplicaResult<TestRequest> replicaResult = new TransportWriteAction.WriteReplicaResult<>(
|
|
|
|
|
- request, new Translog.Location(0, 0, 0), null, replica, logger);
|
|
|
|
|
- CyclicBarrier barrier = new CyclicBarrier(2);
|
|
|
|
|
- Runnable waitForBarrier = () -> {
|
|
|
|
|
- try {
|
|
|
|
|
- barrier.await();
|
|
|
|
|
- } catch (InterruptedException | BrokenBarrierException e) {
|
|
|
|
|
- throw new AssertionError(e);
|
|
|
|
|
- }
|
|
|
|
|
- };
|
|
|
|
|
- CountDownLatch completionLatch = new CountDownLatch(1);
|
|
|
|
|
- threadPool.generic().execute(() -> {
|
|
|
|
|
- waitForBarrier.run();
|
|
|
|
|
- replicaResult.respond(ActionListener.wrap(completionLatch::countDown));
|
|
|
|
|
- });
|
|
|
|
|
- if (randomBoolean()) {
|
|
|
|
|
- threadPool.generic().execute(() -> {
|
|
|
|
|
- waitForBarrier.run();
|
|
|
|
|
- replicaResult.onFailure(null);
|
|
|
|
|
- });
|
|
|
|
|
- } else {
|
|
|
|
|
- threadPool.generic().execute(() -> {
|
|
|
|
|
- waitForBarrier.run();
|
|
|
|
|
- replicaResult.onSuccess(false);
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- assertTrue(completionLatch.await(30, TimeUnit.SECONDS));
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
private class TestAction extends TransportWriteAction<TestRequest, TestRequest, TestResponse> {
|
|
private class TestAction extends TransportWriteAction<TestRequest, TestRequest, TestResponse> {
|
|
|
|
|
|
|
|
private final boolean withDocumentFailureOnPrimary;
|
|
private final boolean withDocumentFailureOnPrimary;
|