Skip to content

Commit b34adf8

Browse files
Add validation to discovery features.
When registering a service, using an old runtime, with journal retention set, the discovery will fail.
1 parent b145f86 commit b34adf8

File tree

4 files changed

+57
-4
lines changed

4 files changed

+57
-4
lines changed

sdk-core/src/main/java/dev/restate/sdk/core/EndpointManifest.java

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,15 @@
1313
import static dev.restate.sdk.core.statemachine.ServiceProtocol.MIN_SERVICE_PROTOCOL_VERSION;
1414

1515
import com.fasterxml.jackson.core.JsonProcessingException;
16+
import dev.restate.sdk.core.generated.discovery.Discovery;
1617
import dev.restate.sdk.core.generated.manifest.*;
1718
import dev.restate.sdk.endpoint.definition.HandlerDefinition;
1819
import dev.restate.sdk.endpoint.definition.HandlerType;
1920
import dev.restate.sdk.endpoint.definition.ServiceDefinition;
2021
import dev.restate.sdk.endpoint.definition.ServiceType;
2122
import dev.restate.serde.Serde;
23+
import java.util.Objects;
24+
import java.util.function.Predicate;
2225
import java.util.stream.Collectors;
2326
import java.util.stream.Stream;
2427

@@ -83,7 +86,41 @@ final class EndpointManifest {
8386
.collect(Collectors.toList()));
8487
}
8588

86-
EndpointManifestSchema manifest() {
89+
EndpointManifestSchema manifest(Discovery.ServiceDiscoveryProtocolVersion version) {
90+
// Verify that the user didn't set fields that we don't support in the discovery version we set
91+
for (var service : this.manifest.getServices()) {
92+
if (version.getNumber() < Discovery.ServiceDiscoveryProtocolVersion.V2.getNumber()) {
93+
verifyFieldNotSet(
94+
"metadata",
95+
service,
96+
s -> s.getMetadata() != null && !s.getMetadata().getAdditionalProperties().isEmpty());
97+
}
98+
if (version.getNumber() < Discovery.ServiceDiscoveryProtocolVersion.V3.getNumber()) {
99+
verifyFieldNull("idempotency retention", service.getIdempotencyRetention());
100+
verifyFieldNull("journal retention", service.getJournalRetention());
101+
verifyFieldNull("inactivity timeout", service.getInactivityTimeout());
102+
verifyFieldNull("abort timeout", service.getAbortTimeout());
103+
verifyFieldNull("enable lazy state", service.getEnableLazyState());
104+
verifyFieldNull("ingress private", service.getIngressPrivate());
105+
}
106+
for (var handler : service.getHandlers()) {
107+
if (version.getNumber() < Discovery.ServiceDiscoveryProtocolVersion.V2.getNumber()) {
108+
verifyFieldNotSet(
109+
"metadata",
110+
handler,
111+
h -> h.getMetadata() != null && !h.getMetadata().getAdditionalProperties().isEmpty());
112+
}
113+
if (version.getNumber() < Discovery.ServiceDiscoveryProtocolVersion.V3.getNumber()) {
114+
verifyFieldNull("idempotency retention", handler.getIdempotencyRetention());
115+
verifyFieldNull("journal retention", handler.getJournalRetention());
116+
verifyFieldNull("inactivity timeout", handler.getInactivityTimeout());
117+
verifyFieldNull("abort timeout", handler.getAbortTimeout());
118+
verifyFieldNull("enable lazy state", handler.getEnableLazyState());
119+
verifyFieldNull("ingress private", handler.getIngressPrivate());
120+
}
121+
}
122+
}
123+
87124
return this.manifest;
88125
}
89126

@@ -187,4 +224,19 @@ private static Handler.Ty convertHandlerType(HandlerType handlerType) {
187224
case SHARED -> Handler.Ty.SHARED;
188225
};
189226
}
227+
228+
private static <T> void verifyFieldNotSet(
229+
String featureName, T value, Predicate<T> isSetPredicate) {
230+
if (isSetPredicate.test(value)) {
231+
throw new ProtocolException(
232+
"The code uses the new discovery feature '"
233+
+ featureName
234+
+ "' but the runtime doesn't support it yet. Either remove the usage of this feature, or upgrade the runtime.",
235+
500);
236+
}
237+
}
238+
239+
private static <T> void verifyFieldNull(String featureName, T value) {
240+
verifyFieldNotSet(featureName, value, Objects::nonNull);
241+
}
190242
}

sdk-core/src/main/java/dev/restate/sdk/core/EndpointRequestHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ StaticResponseRequestProcessor handleDiscoveryRequest(HeadersAccessor headersAcc
195195
ProtocolException.UNSUPPORTED_MEDIA_TYPE_CODE);
196196
}
197197

198-
EndpointManifestSchema response = this.deploymentManifest.manifest();
198+
EndpointManifestSchema response = this.deploymentManifest.manifest(version);
199199
LOG.info(
200200
"Replying to discovery request with services [{}]",
201201
response.getServices().stream().map(Service::getName).collect(Collectors.joining(",")));

sdk-core/src/test/java/dev/restate/sdk/core/AssertUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public static EndpointManifestSchemaAssert assertThatDiscovery(Endpoint endpoint
9696
EndpointManifestSchema.ProtocolMode.BIDI_STREAM,
9797
endpoint.getServiceDefinitions(),
9898
true)
99-
.manifest(),
99+
.manifest(DiscoveryProtocol.MAX_SERVICE_DISCOVERY_PROTOCOL_VERSION),
100100
EndpointManifestSchemaAssert.class);
101101
}
102102

sdk-core/src/test/java/dev/restate/sdk/core/ComponentDiscoveryHandlerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ void handleWithMultipleServices() {
3737
"greet", HandlerType.EXCLUSIVE, Serde.VOID, Serde.VOID, null)))),
3838
false);
3939

40-
EndpointManifestSchema manifest = deploymentManifest.manifest();
40+
EndpointManifestSchema manifest =
41+
deploymentManifest.manifest(DiscoveryProtocol.MAX_SERVICE_DISCOVERY_PROTOCOL_VERSION);
4142

4243
assertThat(manifest.getServices()).extracting(Service::getName).containsOnly("MyGreeter");
4344
assertThat(manifest.getProtocolMode())

0 commit comments

Comments
 (0)