diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-06-30 23:40:36 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-06-30 23:40:36 +0200 |
commit | d78f33d83656b483f8402646135f78caceea3601 (patch) | |
tree | 3fae72b73af4d8e40764c6924b70b97260a1eede /node-repository | |
parent | acb9012216c3e9b438b6ef2c41dcc524c7e51ced (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.java | 31 |
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() { |