summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@yahooinc.com>2023-04-28 13:07:55 +0200
committerHåvard Pettersen <havardpe@yahooinc.com>2023-04-28 13:07:55 +0200
commitec495469099fc26c64736fd103facc25f8370a26 (patch)
treeb79057f3f3baa05d4ba65968598563867a7464f2
parent8cf2f720a10e3d06c69fd43a6fdfab1a59274036 (diff)
pick up create flag for put operations
-rw-r--r--document/src/main/java/com/yahoo/document/json/readers/VespaJsonDocumentReader.java9
-rw-r--r--document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java6
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java15
-rw-r--r--vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/DocumentV1ApiTest.java3
-rw-r--r--vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java9
-rw-r--r--vespaclient-java/src/test/java/com/yahoo/vespafeeder/VespaFeederTestCase.java3
6 files changed, 31 insertions, 14 deletions
diff --git a/document/src/main/java/com/yahoo/document/json/readers/VespaJsonDocumentReader.java b/document/src/main/java/com/yahoo/document/json/readers/VespaJsonDocumentReader.java
index c406bcdb2b3..663c8f47b43 100644
--- a/document/src/main/java/com/yahoo/document/json/readers/VespaJsonDocumentReader.java
+++ b/document/src/main/java/com/yahoo/document/json/readers/VespaJsonDocumentReader.java
@@ -73,10 +73,13 @@ public class VespaJsonDocumentReader {
throw JsonReaderException.addDocId(e, documentParseInfo.documentId);
}
if (documentParseInfo.create.isPresent()) {
- if (! (documentOperation instanceof DocumentUpdate update)) {
- throw new IllegalArgumentException("Could not set create flag on non update operation.");
+ if (documentOperation instanceof DocumentUpdate update) {
+ update.setCreateIfNonExistent(documentParseInfo.create.get());
+ } else if (documentOperation instanceof DocumentPut put) {
+ put.setCreateIfNonExistent(documentParseInfo.create.get());
+ } else {
+ throw new IllegalArgumentException("Could not set create flag on operation.");
}
- update.setCreateIfNonExistent(documentParseInfo.create.get());
}
return new ParsedDocumentOperation(documentOperation, fullyApplied);
}
diff --git a/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java b/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java
index a761a9adfb6..96b5d2c1fb5 100644
--- a/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java
+++ b/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java
@@ -893,7 +893,7 @@ public class JsonReaderTestCase {
}
- @Test(expected=RuntimeException.class)
+ @Test
public void testCreateIfNonExistentInPut() {
JsonReader r = createReader(inputJson("[{",
" 'create':true,",
@@ -902,7 +902,9 @@ public class JsonReaderTestCase {
" 'nalle': 'bamse' },",
" 'put': 'id:unittest:smoke::whee'",
"}]"));
- r.next();
+ var op = r.next();
+ var put = (DocumentPut) op;
+ assertTrue(put.getCreateIfNonExistent());
}
@Test
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 45c93ec0755..1281bece66e 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
@@ -460,15 +460,17 @@ public class DocumentV1ApiHandler extends AbstractRequestHandler {
return new ForwardingContentChannel(in -> {
enqueueAndDispatch(request, handler, () -> {
- ParsedDocumentOperation put = parser.parsePut(in, path.id().toString());
- getProperty(request, CONDITION).map(TestAndSetCondition::new).ifPresent(c -> put.operation().setCondition(c));
+ ParsedDocumentOperation parsed = parser.parsePut(in, path.id().toString());
+ DocumentPut put = (DocumentPut)parsed.operation();
+ getProperty(request, CONDITION).map(TestAndSetCondition::new).ifPresent(c -> put.setCondition(c));
+ getProperty(request, CREATE, booleanParser).ifPresent(put::setCreateIfNonExistent);
DocumentOperationParameters parameters = parametersFromRequest(request, ROUTE)
.withResponseHandler(response -> {
outstanding.decrementAndGet();
- updatePutMetrics(response.outcome(), latencyOf(request));
- handleFeedOperation(path, put.fullyApplied(), handler, response);
+ updatePutMetrics(response.outcome(), latencyOf(request), put.getCreateIfNonExistent());
+ handleFeedOperation(path, parsed.fullyApplied(), handler, response);
});
- return () -> dispatchOperation(() -> asyncSession.put((DocumentPut)put.operation(), parameters));
+ return () -> dispatchOperation(() -> asyncSession.put(put, parameters));
});
});
}
@@ -1091,7 +1093,8 @@ public class DocumentV1ApiHandler extends AbstractRequestHandler {
private static double latencyOf(HttpRequest r) { return (System.nanoTime() - r.relativeCreatedAtNanoTime()) / 1e+9d; }
- private void updatePutMetrics(Outcome outcome, double latency) {
+ private void updatePutMetrics(Outcome outcome, double latency, boolean create) {
+ if (create && outcome == Outcome.NOT_FOUND) outcome = Outcome.SUCCESS; // >_<
incrementMetricNumOperations(); incrementMetricNumPuts(); sampleLatency(latency);
switch (outcome) {
case SUCCESS -> incrementMetricSucceeded();
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 1d81c45daf1..8f3fc27488f 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
@@ -687,6 +687,7 @@ public class DocumentV1ApiTest {
access.session.expect((put, parameters) -> {
DocumentPut expectedPut = new DocumentPut(doc2);
expectedPut.setCondition(new TestAndSetCondition("test it"));
+ expectedPut.setCreateIfNonExistent(true);
assertEquals(expectedPut, put);
assertEquals(parameters().withTraceLevel(9), parameters);
Trace trace = new Trace(9);
@@ -697,7 +698,7 @@ public class DocumentV1ApiTest {
parameters.responseHandler().get().handleResponse(new DocumentResponse(0, doc2, trace));
return new Result();
});
- response = driver.sendRequest("http://localhost/document/v1/space/music/number/1/two?condition=test%20it&tracelevel=9", POST,
+ response = driver.sendRequest("http://localhost/document/v1/space/music/number/1/two?create=true&condition=test%20it&tracelevel=9", POST,
"{" +
" \"fields\": {" +
" \"artist\": \"Asa-Chan & Jun-Ray\"," +
diff --git a/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java b/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java
index d8b69bd4a85..2b67df00e12 100644
--- a/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java
+++ b/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java
@@ -80,8 +80,13 @@ public abstract class Feeder {
while (!sender.isAborted()) {
try {
FeedOperation op = reader.read();
- if (createIfNonExistent && op.getDocumentUpdate() != null) {
- op.getDocumentUpdate().setCreateIfNonExistent(true);
+ if (createIfNonExistent) {
+ if (op.getDocumentUpdate() != null) {
+ op.getDocumentUpdate().setCreateIfNonExistent(true);
+ }
+ if (op.getDocumentPut() != null) {
+ op.getDocumentPut().setCreateIfNonExistent(true);
+ }
}
if (op.getType() == FeedOperation.Type.INVALID) break; // Done feeding
sender.sendOperation(op);
diff --git a/vespaclient-java/src/test/java/com/yahoo/vespafeeder/VespaFeederTestCase.java b/vespaclient-java/src/test/java/com/yahoo/vespafeeder/VespaFeederTestCase.java
index 80782a82c4c..60616759bea 100644
--- a/vespaclient-java/src/test/java/com/yahoo/vespafeeder/VespaFeederTestCase.java
+++ b/vespaclient-java/src/test/java/com/yahoo/vespafeeder/VespaFeederTestCase.java
@@ -10,6 +10,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import com.yahoo.clientmetrics.RouteMetricSet;
+import com.yahoo.document.DocumentPut;
import com.yahoo.document.DocumentTypeManager;
import com.yahoo.document.DocumentTypeManagerConfigurer;
import com.yahoo.document.DocumentUpdate;
@@ -190,6 +191,8 @@ public class VespaFeederTestCase {
new VespaFeeder(arguments, f.typeManager).parseFiles(System.in, f.printStream);
assertEquals(3, f.sessionFactory.messages.size());
+ DocumentPut put = ((PutDocumentMessage) f.sessionFactory.messages.get(0)).getDocumentPut();
+ assertTrue(put.getCreateIfNonExistent());
DocumentUpdate update = ((UpdateDocumentMessage) f.sessionFactory.messages.get(1)).getDocumentUpdate();
assertTrue(update.getCreateIfNonExistent());
}