summaryrefslogtreecommitdiffstats
path: root/vespa-http-client/src/main
diff options
context:
space:
mode:
authorHaakon Dybdahl <dybdahl@yahoo-inc.com>2017-03-06 09:22:16 +0100
committerHaakon Dybdahl <dybdahl@yahoo-inc.com>2017-03-06 09:22:16 +0100
commit3fcafa4cc9a2f29c417cfbda9bed0c8390ba2ab7 (patch)
tree8a297abd0b7deb4f52098033535a12f11f290cd8 /vespa-http-client/src/main
parent351903b75e5cf8feaa6606c139ee56e1caeccd23 (diff)
Extend APIs with condition-not-met.
Diffstat (limited to 'vespa-http-client/src/main')
-rw-r--r--vespa-http-client/src/main/java/com/yahoo/vespa/http/client/Result.java20
-rw-r--r--vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/OperationStatus.java15
-rw-r--r--vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/ResultImpl.java8
-rw-r--r--vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/DryRunGatewayConnection.java2
-rw-r--r--vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/EndpointResultQueue.java2
-rw-r--r--vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/IOThread.java2
-rw-r--r--vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/operationProcessor/EndPointResultFactory.java7
-rw-r--r--vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/operationProcessor/OperationProcessor.java1
8 files changed, 47 insertions, 10 deletions
diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/Result.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/Result.java
index 3e809cfe0ad..4488f8603c2 100644
--- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/Result.java
+++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/Result.java
@@ -52,6 +52,12 @@ public abstract class Result {
*/
abstract public boolean isTransient();
+ /**
+ * Returns true if a error was caused by condition-not-met in the document operation.
+ * @return true if condition is not met.
+ */
+ abstract public boolean isConditionNotMet();
+
abstract public List<Detail> getDetails();
/**
@@ -71,14 +77,16 @@ public abstract class Result {
private final Endpoint endpoint;
private final boolean success;
private final boolean _transient;
+ private final boolean isConditionNotMet;
private final Exception exception;
private final String traceMessage;
private final long timeStampMillis = System.currentTimeMillis();
- public Detail(Endpoint endpoint, boolean success, boolean _transient, String traceMessage, Exception e) {
+ public Detail(Endpoint endpoint, boolean success, boolean _transient, boolean isConditionNotMet, String traceMessage, Exception e) {
this.endpoint = endpoint;
this.success = success;
this._transient = _transient;
+ this.isConditionNotMet = isConditionNotMet;
this.exception = e;
this.traceMessage = traceMessage;
}
@@ -87,6 +95,7 @@ public abstract class Result {
this.endpoint = endpoint;
this.success = true;
this._transient = true;
+ this.isConditionNotMet = false;
this.exception = null;
this.traceMessage = null;
}
@@ -120,6 +129,14 @@ public abstract class Result {
}
/**
+ * Returns true if a condition in the document operation was not met.
+ * @return if condition not met in operation.
+ */
+ public boolean isConditionNotMet() {
+ return isConditionNotMet;
+ }
+
+ /**
* Returns any exception related to this Detail, if unsuccessful. Might be null.
*
* @return any exception related to this Detail, if unsuccessful. Might be null.
@@ -143,6 +160,7 @@ public abstract class Result {
b.append("success=").append(success).append(" ");
if (!success) {
b.append("transient=").append(_transient).append(" ");
+ b.append("conditionNotMet=").append(isConditionNotMet).append(" ");
}
if (exception != null) {
b.append("exception='").append(Exceptions.toMessageString(exception)).append("' ");
diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/OperationStatus.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/OperationStatus.java
index 16315a1ca95..d0355b0e269 100644
--- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/OperationStatus.java
+++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/OperationStatus.java
@@ -15,16 +15,19 @@ import java.util.Iterator;
*/
@Beta
public final class OperationStatus {
+ public static final String IS_CONDITION_NOT_MET = "IS-CONDITION-NOT-MET";
public final String message;
public final String operationId;
public final ErrorCode errorCode;
public final String traceMessage;
+ public final boolean isConditionNotMet;
private static final char EOL = '\n';
private static final char SEPARATOR = ' ';
private static final Splitter spaceSep = Splitter.on(SEPARATOR);
- public OperationStatus(String message, String operationId, ErrorCode errorCode, String traceMessage) {
+ public OperationStatus(String message, String operationId, ErrorCode errorCode, boolean isConditionNotMet, String traceMessage) {
+ this.isConditionNotMet = isConditionNotMet;
this.message = message;
this.operationId = operationId;
this.errorCode = errorCode;
@@ -56,19 +59,25 @@ public final class OperationStatus {
.toString();
errorCode = ErrorCode.valueOf(Encoder.decode(input.next(),
new StringBuilder()).toString());
+
message = Encoder.decode(input.next(), new StringBuilder()).toString();
// We are backwards compatible, meaning it is ok not to supply the last argument.
+ boolean isConditionNotMet = false;
+ if (message.startsWith(IS_CONDITION_NOT_MET)) {
+ message = message.replaceFirst(IS_CONDITION_NOT_MET, "");
+ isConditionNotMet = true;
+ }
if (input.hasNext()) {
traceMessage = Encoder.decode(input.next(), new StringBuilder()).toString();
}
- return new OperationStatus(message, operationId, errorCode, traceMessage);
+ return new OperationStatus(message, operationId, errorCode, isConditionNotMet, traceMessage);
}
public String render() {
StringBuilder s = new StringBuilder();
Encoder.encode(operationId, s).append(SEPARATOR);
Encoder.encode(errorCode.toString(), s).append(SEPARATOR);
- Encoder.encode(message, s).append(SEPARATOR);
+ Encoder.encode(isConditionNotMet ? IS_CONDITION_NOT_MET + message : message, s).append(SEPARATOR);
Encoder.encode(traceMessage, s).append(EOL);
return s.toString();
}
diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/ResultImpl.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/ResultImpl.java
index 00196f793c5..3e3f6897ba8 100644
--- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/ResultImpl.java
+++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/ResultImpl.java
@@ -24,6 +24,7 @@ final public class ResultImpl extends Result {
private final Document document;
private final boolean success;
private final boolean _transient;
+ private final boolean isConditionNotMet;
private final List<Detail> details;
private final String localTrace;
@@ -32,12 +33,15 @@ final public class ResultImpl extends Result {
this.details = Collections.unmodifiableList(new ArrayList<>(values));
boolean totalSuccess = true;
boolean totalTransient = true;
+ boolean isConditionNotMet = true;
for (Detail d : details) {
if (!d.isSuccess()) {totalSuccess = false; }
if (!d.isTransient()) {totalTransient = false; }
+ if (!d.isConditionNotMet()) { isConditionNotMet = false; }
}
this.success = totalSuccess;
this._transient = totalTransient;
+ this.isConditionNotMet = isConditionNotMet;
this.localTrace = localTrace == null ? null : localTrace.toString();
}
@@ -67,6 +71,10 @@ final public class ResultImpl extends Result {
}
@Override
+ public boolean isConditionNotMet() { return isConditionNotMet; }
+
+
+ @Override
public List<Detail> getDetails() { return details; }
@Override
diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/DryRunGatewayConnection.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/DryRunGatewayConnection.java
index f634a2e22f7..53336b6899c 100644
--- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/DryRunGatewayConnection.java
+++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/DryRunGatewayConnection.java
@@ -31,7 +31,7 @@ public class DryRunGatewayConnection implements GatewayConnection {
public InputStream writeOperations(List<Document> docs) throws ServerResponseException, IOException {
StringBuilder result = new StringBuilder();
for (Document doc : docs) {
- OperationStatus operationStatus = new OperationStatus("ok", doc.getOperationId(), ErrorCode.OK, "");
+ OperationStatus operationStatus = new OperationStatus("ok", doc.getOperationId(), ErrorCode.OK, false, "");
result.append(operationStatus.render());
}
return new ByteArrayInputStream(result.toString().getBytes(StandardCharsets.UTF_8));
diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/EndpointResultQueue.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/EndpointResultQueue.java
index 37395f87fd8..948d2e7f865 100644
--- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/EndpointResultQueue.java
+++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/EndpointResultQueue.java
@@ -104,7 +104,7 @@ class EndpointResultQueue {
}
private synchronized void failedOperationId(String operationId, Exception exception) {
- EndpointResult endpointResult = EndPointResultFactory.createError(endpoint, operationId, exception);
+ EndpointResult endpointResult = EndPointResultFactory.createError(endpoint, operationId, false, exception);
operationProcessor.resultReceived(endpointResult, clusterId);
}
diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/IOThread.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/IOThread.java
index d769c5bdf0c..9697256fbde 100644
--- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/IOThread.java
+++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/IOThread.java
@@ -404,7 +404,7 @@ class IOThread implements Runnable, AutoCloseable {
for (Document document : documentQueue.removeAllDocuments()) {
EndpointResult endpointResult=
- EndPointResultFactory.createError(endpoint, document.getOperationId(), exception);
+ EndPointResultFactory.createError(endpoint, document.getOperationId(), false, exception);
resultQueue.failOperation(endpointResult, clusterId);
}
}
diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/operationProcessor/EndPointResultFactory.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/operationProcessor/EndPointResultFactory.java
index a91e170fbd5..b357efc82d4 100644
--- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/operationProcessor/EndPointResultFactory.java
+++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/operationProcessor/EndPointResultFactory.java
@@ -41,13 +41,13 @@ public final class EndPointResultFactory {
}
public static EndpointResult createError(
- Endpoint endpoint, String operationId, Exception exception) {
- return new EndpointResult(operationId, new Result.Detail(endpoint, false, false, null, exception));
+ Endpoint endpoint, String operationId, boolean isConditionNotMetError, Exception exception) {
+ return new EndpointResult(operationId, new Result.Detail(endpoint, false, false, isConditionNotMetError, null, exception));
}
public static EndpointResult createTransientError(
Endpoint endpoint, String operationId, Exception exception) {
- return new EndpointResult(operationId, new Result.Detail(endpoint, false, true, null, exception));
+ return new EndpointResult(operationId, new Result.Detail(endpoint, false, true, false, null, exception));
}
private static EndpointResult parseResult(String line, Endpoint endpoint) {
@@ -71,6 +71,7 @@ public final class EndPointResultFactory {
new Result.Detail(endpoint,
reply.errorCode.isSuccess(),
reply.errorCode.isTransient(),
+ reply.isConditionNotMet,
reply.traceMessage,
exception));
} catch (Throwable t) {
diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/operationProcessor/OperationProcessor.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/operationProcessor/OperationProcessor.java
index b736a727c8f..199c5992e8b 100644
--- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/operationProcessor/OperationProcessor.java
+++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/operationProcessor/OperationProcessor.java
@@ -247,6 +247,7 @@ public class OperationProcessor {
EndPointResultFactory.createError(
eio.getEndpoint(),
document.getOperationId(),
+ false,
eio),
clusterConnection.getClusterId());
}