aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--searchlib/src/tests/expression/attributenode/attribute_node_test.cpp2
-rw-r--r--storage/src/vespa/storage/bucketdb/lockablemap.hpp2
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java20
-rw-r--r--vespaclient-container-plugin/src/main/resources/configdefinitions/document-operation-executor.def2
4 files changed, 18 insertions, 8 deletions
diff --git a/searchlib/src/tests/expression/attributenode/attribute_node_test.cpp b/searchlib/src/tests/expression/attributenode/attribute_node_test.cpp
index 5592edcc514..ab45ca0bdbe 100644
--- a/searchlib/src/tests/expression/attributenode/attribute_node_test.cpp
+++ b/searchlib/src/tests/expression/attributenode/attribute_node_test.cpp
@@ -114,7 +114,7 @@ AttributeManagerFixture::buildAttribute(const vespalib::string &name, BasicType
auto attr = std::dynamic_pointer_cast<AttributeType>(attrBase);
EXPECT_TRUE(attr);
attr->addReservedDoc();
- for (const auto &value : values) {
+ for (const std::conditional_t<std::is_same_v<bool, ValueType>, bool, ValueType&> value : values) {
uint32_t docId = 0;
EXPECT_TRUE(attr->addDoc(docId));
EXPECT_NOT_EQUAL(0u, docId);
diff --git a/storage/src/vespa/storage/bucketdb/lockablemap.hpp b/storage/src/vespa/storage/bucketdb/lockablemap.hpp
index d11d24c7acf..57183566964 100644
--- a/storage/src/vespa/storage/bucketdb/lockablemap.hpp
+++ b/storage/src/vespa/storage/bucketdb/lockablemap.hpp
@@ -354,7 +354,7 @@ LockableMap<Map>::print(std::ostream& out, bool verbose,
out << "LockableMap {\n" << indent << " ";
if (verbose) {
- for (const auto & entry : _map) {
+ for (const auto entry : _map) {
out << "Key: " << BucketId(BucketId::keyToBucketId(entry.first))
<< " Value: " << entry.second << "\n" << indent << " ";
}
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java
index 7074d363316..83640451601 100644
--- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java
+++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java
@@ -40,6 +40,7 @@ import java.util.StringJoiner;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
@@ -85,6 +86,7 @@ public class DocumentOperationExecutorImpl implements DocumentOperationExecutor
private final DelayQueue throttled;
private final DelayQueue timeouts;
private final Map<VisitorControlHandler, VisitorSession> visits = new ConcurrentHashMap<>();
+ private final ExecutorService visitSessionShutdownExecutor = Executors.newSingleThreadExecutor(new DaemonThreadFactory("visit-session-shutdown-"));
public DocumentOperationExecutorImpl(ClusterListConfig clustersConfig, AllClustersBucketSpacesConfig bucketsConfig,
DocumentOperationExecutorConfig executorConfig, DocumentAccess access, Clock clock) {
@@ -150,14 +152,16 @@ public class DocumentOperationExecutorImpl implements DocumentOperationExecutor
@Override
public void shutdown() {
long shutdownMillis = clock.instant().plusSeconds(20).toEpochMilli();
+ visitSessionShutdownExecutor.shutdown();
visits.values().forEach(VisitorSession::destroy);
Future<?> throttleShutdown = throttled.shutdown(Duration.ofSeconds(10),
context -> context.error(OVERLOAD, "Retry on overload failed due to shutdown"));
Future<?> timeoutShutdown = timeouts.shutdown(Duration.ofSeconds(15),
context -> context.error(TIMEOUT, "Timed out due to shutdown"));
try {
- throttleShutdown.get(Math.max(0, shutdownMillis - clock.millis()), TimeUnit.MILLISECONDS);
- timeoutShutdown.get(Math.max(0, shutdownMillis - clock.millis()), TimeUnit.MILLISECONDS);
+ throttleShutdown.get(Math.max(1, shutdownMillis - clock.millis()), TimeUnit.MILLISECONDS);
+ timeoutShutdown.get(Math.max(1, shutdownMillis - clock.millis()), TimeUnit.MILLISECONDS);
+ visitSessionShutdownExecutor.awaitTermination(Math.max(1, shutdownMillis - clock.millis()), TimeUnit.MILLISECONDS);
}
catch (InterruptedException | ExecutionException | TimeoutException e) {
throttleShutdown.cancel(true);
@@ -212,12 +216,18 @@ public class DocumentOperationExecutorImpl implements DocumentOperationExecutor
context.error(ERROR, message != null ? message : "Visiting failed");
}
done.set(true); // This may be reached before dispatching thread is done putting us in the map.
- visits.computeIfPresent(this, (__, session) -> { session.destroy(); return null; });
+ visits.computeIfPresent(this, (__, session) -> {
+ visitSessionShutdownExecutor.execute(() -> session.destroy());
+ return null;
+ });
}
});
visits.put(parameters.getControlHandler(), access.createVisitorSession(parameters));
if (done.get())
- visits.computeIfPresent(parameters.getControlHandler(), (__, session) -> { session.destroy(); return null; });
+ visits.computeIfPresent(parameters.getControlHandler(), (__, session) -> {
+ visitSessionShutdownExecutor.execute(() -> session.destroy());
+ return null;
+ });
}
catch (IllegalArgumentException | ParseException e) {
context.error(BAD_REQUEST, Exceptions.toMessageString(e));
@@ -386,7 +396,7 @@ public class DocumentOperationExecutorImpl implements DocumentOperationExecutor
synchronized (this) {
do {
notify();
- wait(Math.max(0, waitUntilMillis - clock.millis()));
+ wait(Math.max(1, waitUntilMillis - clock.millis()));
}
while (clock.millis() < waitUntilMillis);
}
diff --git a/vespaclient-container-plugin/src/main/resources/configdefinitions/document-operation-executor.def b/vespaclient-container-plugin/src/main/resources/configdefinitions/document-operation-executor.def
index 19f4f50648b..770189f90f5 100644
--- a/vespaclient-container-plugin/src/main/resources/configdefinitions/document-operation-executor.def
+++ b/vespaclient-container-plugin/src/main/resources/configdefinitions/document-operation-executor.def
@@ -11,5 +11,5 @@ defaultTimeoutSeconds int default=180
visitTimeoutSeconds int default=120
# Bound on number of document operations to keep in retry queue — further operations are rejected
-maxThrottled int default=200
+maxThrottled int default=1000