diff options
author | Harald Musum <musum@verizonmedia.com> | 2021-01-05 22:01:36 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-05 22:01:36 +0100 |
commit | 97857eb376cfb7360791000995449f546f2b8fa5 (patch) | |
tree | 485f3cc415d91f2bc2c18cfb57065b12696bff8b | |
parent | 82f3c2b944a5dfc082aefe8fb8d53597475705d2 (diff) | |
parent | 38170c2c7e51ba7ca4c2088dd8b5204c18cc462d (diff) |
Merge pull request #15920 from vespa-engine/hmusum/fix-deletion-of-tenant
Fix deletion of tenant
2 files changed, 22 insertions, 17 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java index 4e3fae37d63..5c15b72eaac 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java @@ -168,19 +168,6 @@ public class TenantRepository { return curator.getChildren(tenantsPath).stream().map(TenantName::from).collect(Collectors.toSet()); } - /** Public for testing. */ - public synchronized void updateTenants() { - Set<TenantName> allTenants = readTenantsFromZooKeeper(curator); - log.log(Level.FINE, "Create tenants, tenants found in zookeeper: " + allTenants); - for (TenantName tenantName : Set.copyOf(tenants.keySet())) - if ( ! allTenants.contains(tenantName)) - zkWatcherExecutor.execute(tenantName, () -> closeTenant(tenantName)); - for (TenantName tenantName : allTenants) - if ( ! tenants.containsKey(tenantName)) - zkWatcherExecutor.execute(tenantName, () -> bootstrapTenant(tenantName)); - metricUpdater.setTenants(tenants.size()); - } - private void bootstrapTenants() { // Keep track of tenants created Map<TenantName, Future<?>> futures = new HashMap<>(); @@ -213,7 +200,7 @@ public class TenantRepository { } // Use when bootstrapping an existing tenant based on ZooKeeper data - protected void bootstrapTenant(TenantName tenantName) { + protected synchronized void bootstrapTenant(TenantName tenantName) { createTenant(tenantName, readCreatedTimeFromZooKeeper(tenantName)); } @@ -329,7 +316,9 @@ public class TenantRepository { log.log(Level.INFO, "Deleting tenant '" + name + "'"); // Deletes the tenant tree from ZooKeeper (application and session status for the tenant) // and triggers Tenant.close(). - curator.delete(tenants.get(name).getPath()); + Path path = tenants.get(name).getPath(); + closeTenant(name); + curator.delete(path); } private synchronized void closeTenant(TenantName name) { @@ -393,10 +382,27 @@ public class TenantRepository { private void childEvent(CuratorFramework framework, PathChildrenCacheEvent event) { switch (event.getType()) { case CHILD_ADDED: + TenantName t1 = getTenantNameFromEvent(event); + if ( ! tenants.containsKey(t1)) + zkWatcherExecutor.execute(t1, () -> bootstrapTenant(t1)); + break; case CHILD_REMOVED: - updateTenants(); + TenantName t2 = getTenantNameFromEvent(event); + if (tenants.containsKey(t2)) + zkWatcherExecutor.execute(t2, () -> deleteTenant(t2)); break; + default: + break; // Nothing to do } + metricUpdater.setTenants(tenants.size()); + } + + private TenantName getTenantNameFromEvent(PathChildrenCacheEvent event) { + String path = event.getData().getPath(); + String[] pathElements = path.split("/"); + if (pathElements.length == 0) + throw new IllegalArgumentException("Path " + path + " does not contain a tenant name"); + return TenantName.from(pathElements[pathElements.length - 1]); } public void close() { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/TenantsMaintainerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/TenantsMaintainerTest.java index 463e5361248..9bd7a25faf2 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/TenantsMaintainerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/TenantsMaintainerTest.java @@ -47,7 +47,6 @@ public class TenantsMaintainerTest { clock.advance(TenantsMaintainer.defaultTtlForUnusedTenant.plus(Duration.ofDays(1))); new TenantsMaintainer(applicationRepository, tester.curator(), new InMemoryFlagSource(), Duration.ofDays(1), clock).run(); - tenantRepository.updateTenants(); // One tenant should now have been deleted assertNull(tenantRepository.getTenant(shouldBeDeleted)); |