diff --git a/core/connection-pool/src/main/java/datawave/core/common/cache/AccumuloTableCache.java b/core/connection-pool/src/main/java/datawave/core/common/cache/AccumuloTableCache.java index 674dfe3183c..d151ee304ba 100644 --- a/core/connection-pool/src/main/java/datawave/core/common/cache/AccumuloTableCache.java +++ b/core/connection-pool/src/main/java/datawave/core/common/cache/AccumuloTableCache.java @@ -22,7 +22,9 @@ public interface AccumuloTableCache extends AutoCloseable { void submitReloadTasks(); - public void reloadTableCache(String tableName); + void reloadTableCache(String tableName); - public List getTableCaches(); + List getTableCaches(); + + boolean isAvailable(); } diff --git a/core/connection-pool/src/main/java/datawave/core/common/cache/AccumuloTableCacheImpl.java b/core/connection-pool/src/main/java/datawave/core/common/cache/AccumuloTableCacheImpl.java index 827fa239560..5ebc53998c6 100644 --- a/core/connection-pool/src/main/java/datawave/core/common/cache/AccumuloTableCacheImpl.java +++ b/core/connection-pool/src/main/java/datawave/core/common/cache/AccumuloTableCacheImpl.java @@ -241,4 +241,14 @@ public List getTableCaches() { } return tableCaches; } + + @Override + public boolean isAvailable() { + for (Entry entry : details.entrySet()) { + if (!entry.getValue().isAvailable()) { + return false; + } + } + return true; + } } diff --git a/core/connection-pool/src/main/java/datawave/core/common/cache/BaseTableCache.java b/core/connection-pool/src/main/java/datawave/core/common/cache/BaseTableCache.java index 54eabdfac6d..0d0a2072dad 100644 --- a/core/connection-pool/src/main/java/datawave/core/common/cache/BaseTableCache.java +++ b/core/connection-pool/src/main/java/datawave/core/common/cache/BaseTableCache.java @@ -18,7 +18,6 @@ import org.apache.accumulo.core.client.BatchWriterConfig; import org.apache.accumulo.core.client.IteratorSetting; import org.apache.accumulo.core.client.NamespaceExistsException; -import org.apache.accumulo.core.client.TableNotFoundException; import org.apache.accumulo.core.client.admin.NamespaceOperations; import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Mutation; @@ -34,6 +33,7 @@ import datawave.accumulo.inmemory.InMemoryAccumuloClient; import datawave.accumulo.inmemory.InMemoryInstance; +import datawave.accumulo.inmemory.InMemoryTableOperations; import datawave.core.common.connection.AccumuloConnectionFactory; import datawave.webservice.common.connection.WrappedAccumuloClient; @@ -51,6 +51,7 @@ public class BaseTableCache implements Serializable, TableCache { private long maxRows = Long.MAX_VALUE; /** set programatically **/ + private boolean available = false; private Date lastRefresh = new Date(0); private AccumuloConnectionFactory connectionFactory = null; private transient InMemoryInstance instance = null; @@ -84,6 +85,11 @@ public Date getLastRefresh() { return lastRefresh; } + @Override + public boolean isAvailable() { + return available; + } + @Override public AccumuloConnectionFactory getConnectionFactory() { return connectionFactory; @@ -216,13 +222,9 @@ public Boolean call() throws Exception { count++; } this.lastRefresh = new Date(); - try { - instanceClient.tableOperations().delete(tableName); - } catch (TableNotFoundException e) { - // the table will not exist the first time this is run - } - instanceClient.tableOperations().rename(tempTableName, tableName); + ((InMemoryTableOperations) instanceClient.tableOperations()).rename(tempTableName, tableName, true); log.info("Cached {} k,v for table: {}", count, tableName); + this.available = true; } catch (Exception e) { log.error(e.getMessage(), e); throw e; diff --git a/core/connection-pool/src/main/java/datawave/core/common/cache/TableCache.java b/core/connection-pool/src/main/java/datawave/core/common/cache/TableCache.java index 5296146c1d5..1f4439e483d 100644 --- a/core/connection-pool/src/main/java/datawave/core/common/cache/TableCache.java +++ b/core/connection-pool/src/main/java/datawave/core/common/cache/TableCache.java @@ -20,6 +20,8 @@ public interface TableCache extends Callable, Serializable { Date getLastRefresh(); + boolean isAvailable(); + AccumuloConnectionFactory getConnectionFactory(); InMemoryInstance getInstance(); diff --git a/microservices/services/dictionary/service/pom.xml b/microservices/services/dictionary/service/pom.xml index 0a46ce94e4a..a233c9d87c8 100644 --- a/microservices/services/dictionary/service/pom.xml +++ b/microservices/services/dictionary/service/pom.xml @@ -29,7 +29,7 @@ 4.0.5 4.0.5 3.0.2 - 4.0.0 + 4.0.2 1.11.4 3.6.0 0.50 diff --git a/microservices/services/modification/service/pom.xml b/microservices/services/modification/service/pom.xml index fd56bc60362..55271c6aedf 100644 --- a/microservices/services/modification/service/pom.xml +++ b/microservices/services/modification/service/pom.xml @@ -22,7 +22,7 @@ 7.1.3 1.0.0 3.0.2 - 4.0.0 + 4.0.2 3.8.0 diff --git a/microservices/services/query-executor/service/pom.xml b/microservices/services/query-executor/service/pom.xml index bb75cb9edd4..027bd8ac567 100644 --- a/microservices/services/query-executor/service/pom.xml +++ b/microservices/services/query-executor/service/pom.xml @@ -24,7 +24,7 @@ 7.3.0 1.0.7 1.0.8 - 4.0.0 + 4.0.2 3.8.0 diff --git a/microservices/services/query-metric/service/pom.xml b/microservices/services/query-metric/service/pom.xml index 754ef2d3172..9b3bfaa9748 100644 --- a/microservices/services/query-metric/service/pom.xml +++ b/microservices/services/query-metric/service/pom.xml @@ -31,7 +31,7 @@ 3.0.2 3.0.3 2.2.3 - 4.0.0 + 4.0.2 3.16.3 2.0.12 2.0.2 diff --git a/microservices/starters/datawave/pom.xml b/microservices/starters/datawave/pom.xml index 6aac4949c42..aa9ba419c12 100644 --- a/microservices/starters/datawave/pom.xml +++ b/microservices/starters/datawave/pom.xml @@ -33,7 +33,7 @@ 4.0.16 3.0.0 4.1.2 - 4.0.0 + 4.0.2 2.10.1 1.1.3 3.1.3 diff --git a/microservices/starters/metadata/pom.xml b/microservices/starters/metadata/pom.xml index 7f883a48bc0..1b64e31bae2 100644 --- a/microservices/starters/metadata/pom.xml +++ b/microservices/starters/metadata/pom.xml @@ -26,7 +26,7 @@ 7.1.3 4.0.16 4.0.5 - 4.0.0 + 4.0.2 diff --git a/pom.xml b/pom.xml index d63bec7c8f3..8584854b883 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ 1.3 4.5.13 4.4.8 - 4.0.1 + 4.0.2 9.4.21.Final 2.10.0.pr1 1.9.13 diff --git a/web-services/common/src/main/java/datawave/webservice/common/cache/AccumuloTableCacheBean.java b/web-services/common/src/main/java/datawave/webservice/common/cache/AccumuloTableCacheBean.java index 0c9bc484c50..850ef6728ed 100644 --- a/web-services/common/src/main/java/datawave/webservice/common/cache/AccumuloTableCacheBean.java +++ b/web-services/common/src/main/java/datawave/webservice/common/cache/AccumuloTableCacheBean.java @@ -199,6 +199,11 @@ public AccumuloTableCacheStatus getStatus() { return response; } + @Override + public boolean isAvailable() { + return tableCache.isAvailable(); + } + @Override public List getTableCaches() { return tableCache.getTableCaches(); diff --git a/web-services/common/src/main/java/datawave/webservice/common/health/HealthBean.java b/web-services/common/src/main/java/datawave/webservice/common/health/HealthBean.java index 75596461af0..8679f877143 100644 --- a/web-services/common/src/main/java/datawave/webservice/common/health/HealthBean.java +++ b/web-services/common/src/main/java/datawave/webservice/common/health/HealthBean.java @@ -46,6 +46,7 @@ import com.sun.management.OperatingSystemMXBean; import datawave.configuration.DatawaveEmbeddedProjectStageHolder; +import datawave.core.common.cache.AccumuloTableCache; import datawave.core.common.connection.AccumuloConnectionFactory; import datawave.webservice.result.GenericResponse; @@ -65,6 +66,9 @@ public class HealthBean { private static boolean shutdownInProgress = false; private static String status = "ready"; + @Inject + private AccumuloTableCache tableCache; + @Inject private AccumuloConnectionFactory accumuloConnectionFactoryBean; @@ -97,7 +101,10 @@ public Response health() { ServerHealth health = new ServerHealth(); health.status = status; health.connectionUsagePercent = accumuloConnectionFactoryBean.getConnectionUsagePercent(); - if (health.connectionUsagePercent >= maxUsedPercent) { + if (!tableCache.isAvailable()) { + health.details = "Accumulo table cache is not ready yet"; + return Response.status(Status.SERVICE_UNAVAILABLE).entity(health).build(); + } else if (health.connectionUsagePercent >= maxUsedPercent) { health.details = health.connectionUsagePercent + " of connections used [>= max of " + maxUsedPercent + " allowed]"; return Response.status(Status.SERVICE_UNAVAILABLE).entity(health).build(); } else if (shutdownInProgress) {