summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2021-01-05 22:01:36 +0100
committerGitHub <noreply@github.com>2021-01-05 22:01:36 +0100
commit97857eb376cfb7360791000995449f546f2b8fa5 (patch)
tree485f3cc415d91f2bc2c18cfb57065b12696bff8b
parent82f3c2b944a5dfc082aefe8fb8d53597475705d2 (diff)
parent38170c2c7e51ba7ca4c2088dd8b5204c18cc462d (diff)
Merge pull request #15920 from vespa-engine/hmusum/fix-deletion-of-tenant
Fix deletion of tenant
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java38
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/TenantsMaintainerTest.java1
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));