summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-06-30 23:40:36 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2021-06-30 23:40:36 +0200
commitd78f33d83656b483f8402646135f78caceea3601 (patch)
tree3fae72b73af4d8e40764c6924b70b97260a1eede /node-repository
parentacb9012216c3e9b438b6ef2c41dcc524c7e51ced (diff)
Use a resourcepool instead of thread locals.
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDb.java31
1 files changed, 21 insertions, 10 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDb.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDb.java
index 09434b91ac9..b90b8e24f91 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDb.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/QuestMetricsDb.java
@@ -9,6 +9,8 @@ import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.io.IOUtils;
import com.yahoo.vespa.defaults.Defaults;
+import com.yahoo.yolean.concurrent.ConcurrentResourcePool;
+import com.yahoo.yolean.concurrent.ResourceFactory;
import io.questdb.cairo.CairoEngine;
import io.questdb.cairo.CairoException;
import io.questdb.cairo.DefaultCairoConfiguration;
@@ -58,9 +60,7 @@ public class QuestMetricsDb extends AbstractComponent implements MetricsDb {
private final Clock clock;
private final String dataDir;
private final AtomicReference<CairoEngine> engine = new AtomicReference<>();
- // TODO Is this safe, or even possible. ThreadLocal members should be static
- //
- private final ThreadLocal<SqlCompiler> sqlCompiler;
+ private final ConcurrentResourcePool<SqlCompiler> sqlCompilerPool;
private final AtomicInteger nullRecords = new AtomicInteger();
@Inject
@@ -83,7 +83,12 @@ public class QuestMetricsDb extends AbstractComponent implements MetricsDb {
this.dataDir = dataDir;
engine.set(new CairoEngine(new DefaultCairoConfiguration(dataDir)));
- sqlCompiler = ThreadLocal.withInitial(() -> new SqlCompiler(engine.get()));
+ sqlCompilerPool = new ConcurrentResourcePool<>(new ResourceFactory<>() {
+ @Override
+ public SqlCompiler create() {
+ return new SqlCompiler(engine.get());
+ }
+ });
nodeTable = new Table(dataDir, "metrics", clock);
clusterTable = new Table(dataDir, "clusterMetrics", clock);
ensureTablesExist();
@@ -199,11 +204,12 @@ public class QuestMetricsDb extends AbstractComponent implements MetricsDb {
@Override
public void close() {
- synchronized (clusterTable.writeLock) {
- CairoEngine myEngine = engine.getAndSet(null);
- if (myEngine != null) {
- myEngine.close();
- }
+ CairoEngine myEngine = engine.getAndSet(null);
+ for (SqlCompiler sqlCompiler : sqlCompilerPool) {
+ sqlCompiler.close();
+ }
+ if (myEngine != null) {
+ myEngine.close();
}
}
@@ -330,7 +336,12 @@ public class QuestMetricsDb extends AbstractComponent implements MetricsDb {
/** Issues an SQL statement against the QuestDb engine */
private CompiledQuery issue(String sql, SqlExecutionContext context) throws SqlException {
- return sqlCompiler.get().compile(sql, context);
+ SqlCompiler sqlCompiler = sqlCompilerPool.alloc();
+ try {
+ return sqlCompiler.compile(sql, context);
+ } finally {
+ sqlCompilerPool.free(sqlCompiler);
+ }
}
private SqlExecutionContext newContext() {