summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Marius Venstad <jonmv@users.noreply.github.com>2023-03-10 16:21:37 +0100
committerGitHub <noreply@github.com>2023-03-10 16:21:37 +0100
commit86748ce4fadf24108eb5a459fd7f6caa01623cc4 (patch)
treecc4fd971f6595769bbe001efe9dbcb267c6a82a5
parent9294bc18f31ee14b45ffc892e01f5409f965a383 (diff)
parentc01ce2ca128ecfc6609a496ba7c5de579407aac3 (diff)
Merge pull request #26395 from vespa-engine/vekterli/expose-from-to-timestamps-in-doc-v1
Expose from/to visitor timestamps in Document V1 API
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java8
-rw-r--r--vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/DocumentV1ApiTest.java15
2 files changed, 22 insertions, 1 deletions
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java
index 373928a3e22..fe1e2b46830 100644
--- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java
+++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java
@@ -171,6 +171,8 @@ public class DocumentV1ApiHandler extends AbstractRequestHandler {
private static final String SLICES = "slices";
private static final String SLICE_ID = "sliceId";
private static final String DRY_RUN = "dryRun";
+ private static final String FROM_TIMESTAMP = "fromTimestamp";
+ private static final String TO_TIMESTAMP = "toTimestamp";
private final Clock clock;
private final Duration handlerTimeout;
@@ -1227,6 +1229,12 @@ public class DocumentV1ApiHandler extends AbstractRequestHandler {
getProperty(request, CONTINUATION).map(ProgressToken::fromSerializedString).ifPresent(parameters::setResumeToken);
parameters.setPriority(DocumentProtocol.Priority.NORMAL_4);
+ getProperty(request, FROM_TIMESTAMP, unsignedLongParser).ifPresent(parameters::setFromTimestamp);
+ getProperty(request, TO_TIMESTAMP, unsignedLongParser).ifPresent(parameters::setToTimestamp);
+ if (Long.compareUnsigned(parameters.getFromTimestamp(), parameters.getToTimestamp()) > 0) {
+ throw new IllegalArgumentException("toTimestamp must be greater than, or equal to, fromTimestamp");
+ }
+
StorageCluster storageCluster = resolveCluster(cluster, clusters);
parameters.setRoute(storageCluster.name());
parameters.setBucketSpace(resolveBucket(storageCluster,
diff --git a/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/DocumentV1ApiTest.java b/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/DocumentV1ApiTest.java
index b6ad7ba5570..851a0949266 100644
--- a/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/DocumentV1ApiTest.java
+++ b/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/DocumentV1ApiTest.java
@@ -223,6 +223,8 @@ public class DocumentV1ApiTest {
assertEquals("(all the things)", parameters.getDocumentSelection());
assertEquals(6000, parameters.getSessionTimeoutMs());
assertEquals(9, parameters.getTraceLevel());
+ assertEquals(1_000_000, parameters.getFromTimestamp());
+ assertEquals(2_000_000, parameters.getToTimestamp());
// Put some documents in the response
parameters.getLocalDataHandler().onMessage(new PutDocumentMessage(new DocumentPut(doc1)), tokens.get(0));
parameters.getLocalDataHandler().onMessage(new PutDocumentMessage(new DocumentPut(doc2)), tokens.get(1));
@@ -234,7 +236,7 @@ public class DocumentV1ApiTest {
parameters.getControlHandler().onDone(VisitorControlHandler.CompletionCode.TIMEOUT, "timeout is OK");
});
response = driver.sendRequest("http://localhost/document/v1?cluster=content&bucketSpace=default&wantedDocumentCount=1025&concurrency=123" +
- "&selection=all%20the%20things&fieldSet=[id]&timeout=6&tracelevel=9");
+ "&selection=all%20the%20things&fieldSet=[id]&timeout=6&tracelevel=9&fromTimestamp=1000000&toTimestamp=2000000");
assertSameJson("""
{
"pathId": "/document/v1",
@@ -284,6 +286,8 @@ public class DocumentV1ApiTest {
assertEquals(6000, parameters.getTimeoutMs());
assertEquals(4, parameters.getSlices());
assertEquals(1, parameters.getSliceId());
+ assertEquals(0, parameters.getFromTimestamp()); // not set; 0 is default
+ assertEquals(0, parameters.getToTimestamp()); // not set; 0 is default
// Put some documents in the response
parameters.getLocalDataHandler().onMessage(new PutDocumentMessage(new DocumentPut(doc1)), tokens.get(0));
parameters.getLocalDataHandler().onMessage(new PutDocumentMessage(new DocumentPut(doc2)), tokens.get(1));
@@ -500,6 +504,15 @@ public class DocumentV1ApiTest {
"}", response.readAll());
assertEquals(200, response.getStatus());
+ // GET with from timestamp > to timestamp is an error
+ access.expect(parameters -> { fail("unreachable"); });
+ response = driver.sendRequest("http://localhost/document/v1/?cluster=content&fromTimestamp=100&toTimestamp=99");
+ assertSameJson("{" +
+ " \"pathId\": \"/document/v1/\"," +
+ " \"message\": \"toTimestamp must be greater than, or equal to, fromTimestamp\"" +
+ "}", response.readAll());
+ assertEquals(400, response.getStatus());
+
// GET with full document ID is a document get operation which returns 404 when no document is found
access.session.expect((id, parameters) -> {
assertEquals(doc1.getId(), id);