diff --git a/build.gradle b/build.gradle index 63c1d15eccbd4..17cd5f6b93cd0 100644 --- a/build.gradle +++ b/build.gradle @@ -222,8 +222,8 @@ task verifyVersions { * after the backport of the backcompat code is complete. */ -boolean bwc_tests_enabled = false -final String bwc_tests_disabled_issue = "https://github.com/elastic/elasticsearch/pull/53793" /* place a PR link here when committing bwc changes */ +boolean bwc_tests_enabled = true +final String bwc_tests_disabled_issue = "" /* place a PR link here when committing bwc changes */ if (bwc_tests_enabled == false) { if (bwc_tests_disabled_issue.isEmpty()) { throw new GradleException("bwc_tests_disabled_issue must be set when bwc_tests_enabled == false") diff --git a/server/src/main/java/org/elasticsearch/common/io/stream/DelayableWriteable.java b/server/src/main/java/org/elasticsearch/common/io/stream/DelayableWriteable.java index e75b81fff4ef4..b27010017e5ee 100644 --- a/server/src/main/java/org/elasticsearch/common/io/stream/DelayableWriteable.java +++ b/server/src/main/java/org/elasticsearch/common/io/stream/DelayableWriteable.java @@ -19,12 +19,12 @@ package org.elasticsearch.common.io.stream; -import org.elasticsearch.Version; -import org.elasticsearch.common.bytes.BytesReference; - import java.io.IOException; import java.util.function.Supplier; +import org.elasticsearch.Version; +import org.elasticsearch.common.bytes.BytesReference; + /** * A holder for {@link Writeable}s that can delays reading the underlying * {@linkplain Writeable} when it is read from a remote node. @@ -60,6 +60,7 @@ private static class Referencing extends DelayableWriteable @Override public void writeTo(StreamOutput out) throws IOException { try (BytesStreamOutput buffer = new BytesStreamOutput()) { + buffer.setVersion(out.getVersion()); reference.writeTo(buffer); out.writeBytesReference(buffer.bytes()); } diff --git a/server/src/test/java/org/elasticsearch/common/io/stream/DelayableWriteableTests.java b/server/src/test/java/org/elasticsearch/common/io/stream/DelayableWriteableTests.java index fbd8702608ead..d12a15c1a7207 100644 --- a/server/src/test/java/org/elasticsearch/common/io/stream/DelayableWriteableTests.java +++ b/server/src/test/java/org/elasticsearch/common/io/stream/DelayableWriteableTests.java @@ -19,25 +19,25 @@ package org.elasticsearch.common.io.stream; -import org.elasticsearch.Version; -import org.elasticsearch.test.ESTestCase; -import org.elasticsearch.test.VersionUtils; +import static java.util.Collections.singletonList; +import static org.hamcrest.Matchers.equalTo; import java.io.IOException; -import static java.util.Collections.singletonList; -import static org.hamcrest.Matchers.equalTo; +import org.elasticsearch.Version; +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.test.VersionUtils; public class DelayableWriteableTests extends ESTestCase { // NOTE: we don't use AbstractWireSerializingTestCase because we don't implement equals and hashCode. - public static class Example implements NamedWriteable { + private static class Example implements NamedWriteable { private final String s; - public Example(String s) { + Example(String s) { this.s = s; } - public Example(StreamInput in) throws IOException { + Example(StreamInput in) throws IOException { s = in.readString(); } @@ -66,14 +66,14 @@ public int hashCode() { } } - public static class NamedHolder implements Writeable { + private static class NamedHolder implements Writeable { private final Example e; - public NamedHolder(Example e) { + NamedHolder(Example e) { this.e = e; } - public NamedHolder(StreamInput in) throws IOException { + NamedHolder(StreamInput in) throws IOException { e = in.readNamedWriteable(Example.class); } @@ -97,6 +97,23 @@ public int hashCode() { } } + private static class SneakOtherSideVersionOnWire implements Writeable { + private final Version version; + + SneakOtherSideVersionOnWire() { + version = Version.CURRENT; + } + + SneakOtherSideVersionOnWire(StreamInput in) throws IOException { + version = Version.readVersion(in); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + Version.writeVersion(out.getVersion(), out); + } + } + public void testRoundTripFromReferencing() throws IOException { Example e = new Example(randomAlphaOfLength(5)); DelayableWriteable original = DelayableWriteable.referencing(e); @@ -139,6 +156,12 @@ public void testRoundTripFromDelayedFromOldVersionWithNamedWriteable() throws IO roundTripTestCase(original, NamedHolder::new); } + public void testSerializesWithRemoteVersion() throws IOException { + Version remoteVersion = VersionUtils.randomCompatibleVersion(random(), Version.CURRENT); + DelayableWriteable original = DelayableWriteable.referencing(new SneakOtherSideVersionOnWire()); + assertThat(roundTrip(original, SneakOtherSideVersionOnWire::new, remoteVersion).get().version, equalTo(remoteVersion)); + } + private void roundTripTestCase(DelayableWriteable original, Writeable.Reader reader) throws IOException { DelayableWriteable roundTripped = roundTrip(original, reader, Version.CURRENT); assertTrue(roundTripped.isDelayed());