Skip to content

Commit adafa21

Browse files
committed
Fix RFGIT#testReusePeerRecovery test bug
1 parent 76f8807 commit adafa21

File tree

3 files changed

+27
-4
lines changed

3 files changed

+27
-4
lines changed

core/src/main/java/org/elasticsearch/indices/recovery/PeerRecoveryTargetService.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,9 @@ class FilesInfoRequestHandler implements TransportRequestHandler<RecoveryFilesIn
529529
public void messageReceived(RecoveryFilesInfoRequest request, TransportChannel channel) throws Exception {
530530
try (RecoveryRef recoveryRef = onGoingRecoveries.getRecoverySafe(request.recoveryId(), request.shardId()
531531
)) {
532-
recoveryRef.target().receiveFileInfo(request.phase1FileNames, request.phase1FileSizes, request.phase1ExistingFileNames,
532+
final RecoveryTarget target = recoveryRef.target();
533+
target.state().setSequenceNumberBasedRecovery(false);
534+
target.receiveFileInfo(request.phase1FileNames, request.phase1FileSizes, request.phase1ExistingFileNames,
533535
request.phase1ExistingFileSizes, request.totalTranslogOps);
534536
channel.sendResponse(TransportResponse.Empty.INSTANCE);
535537
}

core/src/main/java/org/elasticsearch/indices/recovery/RecoveryState.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.elasticsearch.indices.recovery;
2121

22+
import org.elasticsearch.Version;
2223
import org.elasticsearch.cluster.node.DiscoveryNode;
2324
import org.elasticsearch.cluster.routing.RecoverySource;
2425
import org.elasticsearch.cluster.routing.ShardRouting;
@@ -110,6 +111,7 @@ public static Stage fromId(byte id) {
110111
private DiscoveryNode sourceNode;
111112
private DiscoveryNode targetNode;
112113
private boolean primary = false;
114+
private boolean sequenceNumberBasedRecovery = true;
113115

114116
private RecoveryState() {
115117
}
@@ -219,6 +221,14 @@ public boolean getPrimary() {
219221
return primary;
220222
}
221223

224+
public boolean getSequenceNumberBasedRecovery() {
225+
return sequenceNumberBasedRecovery;
226+
}
227+
228+
public void setSequenceNumberBasedRecovery(final boolean sequenceNumberBasedRecovery) {
229+
this.sequenceNumberBasedRecovery = sequenceNumberBasedRecovery;
230+
}
231+
222232
public static RecoveryState readRecoveryState(StreamInput in) throws IOException {
223233
RecoveryState recoveryState = new RecoveryState();
224234
recoveryState.readFrom(in);
@@ -237,6 +247,11 @@ public synchronized void readFrom(StreamInput in) throws IOException {
237247
translog.readFrom(in);
238248
verifyIndex.readFrom(in);
239249
primary = in.readBoolean();
250+
if (in.getVersion().onOrAfter(Version.V_6_0_0_alpha1_UNRELEASED)) {
251+
sequenceNumberBasedRecovery = in.readBoolean();
252+
} else {
253+
sequenceNumberBasedRecovery = false;
254+
}
240255
}
241256

242257
@Override
@@ -251,6 +266,9 @@ public void writeTo(StreamOutput out) throws IOException {
251266
translog.writeTo(out);
252267
verifyIndex.writeTo(out);
253268
out.writeBoolean(primary);
269+
if (out.getVersion().onOrAfter(Version.V_6_0_0_alpha1_UNRELEASED)) {
270+
out.writeBoolean(sequenceNumberBasedRecovery);
271+
}
254272
}
255273

256274
@Override
@@ -260,6 +278,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
260278
builder.field(Fields.TYPE, recoverySource.getType());
261279
builder.field(Fields.STAGE, stage.toString());
262280
builder.field(Fields.PRIMARY, primary);
281+
builder.field(Fields.SEQUENCE_NUMBER_BASED_RECOVERY, sequenceNumberBasedRecovery);
263282
builder.dateField(Fields.START_TIME_IN_MILLIS, Fields.START_TIME, timer.startTime);
264283
if (timer.stopTime > 0) {
265284
builder.dateField(Fields.STOP_TIME_IN_MILLIS, Fields.STOP_TIME, timer.stopTime);
@@ -308,6 +327,7 @@ static final class Fields {
308327
static final String TYPE = "type";
309328
static final String STAGE = "stage";
310329
static final String PRIMARY = "primary";
330+
static final String SEQUENCE_NUMBER_BASED_RECOVERY = "sequence_number_based_recovery";
311331
static final String START_TIME = "start_time";
312332
static final String START_TIME_IN_MILLIS = "start_time_in_millis";
313333
static final String STOP_TIME = "stop_time";

core/src/test/java/org/elasticsearch/gateway/RecoveryFromGatewayIT.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
6969
import static org.hamcrest.Matchers.equalTo;
7070
import static org.hamcrest.Matchers.greaterThan;
71+
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
7172
import static org.hamcrest.Matchers.hasSize;
7273
import static org.hamcrest.Matchers.not;
7374
import static org.hamcrest.Matchers.notNullValue;
@@ -385,8 +386,6 @@ public void testLatestVersionLoaded() throws Exception {
385386
assertThat(state.metaData().index("test").getAliases().get("test_alias").filter(), notNullValue());
386387
}
387388

388-
// test fails with seed FE6770A74885D66E
389-
@TestLogging("org.elasticsearch.indices.recovery:TRACE,org.elasticsearch.index.shard.StoreRecovery:TRACE")
390389
public void testReusePeerRecovery() throws Exception {
391390
final Settings settings = Settings.builder()
392391
.put(MockFSIndexStore.INDEX_CHECK_INDEX_ON_CLOSE_SETTING.getKey(), false)
@@ -465,7 +464,9 @@ public void testReusePeerRecovery() throws Exception {
465464
recovered += file.length();
466465
}
467466
}
468-
if (!recoveryState.getPrimary() && (useSyncIds == false)) {
467+
if (recoveryState.getSequenceNumberBasedRecovery()) {
468+
assertThat(recoveryState.getTranslog().recoveredOperations(), greaterThanOrEqualTo(0));
469+
} else if (!recoveryState.getPrimary() && (useSyncIds == false)) {
469470
logger.info("--> replica shard {} recovered from {} to {}, recovered {}, reuse {}",
470471
recoveryState.getShardId().getId(), recoveryState.getSourceNode().getName(), recoveryState.getTargetNode().getName(),
471472
recoveryState.getIndex().recoveredBytes(), recoveryState.getIndex().reusedBytes());

0 commit comments

Comments
 (0)