diff options
author | Harald Musum <musum@verizonmedia.com> | 2020-06-24 13:06:55 +0200 |
---|---|---|
committer | Harald Musum <musum@verizonmedia.com> | 2020-06-24 13:06:55 +0200 |
commit | fcc44803ad12c6a4be9e5eec268114744d32c940 (patch) | |
tree | c9a1e541809c83c92b4ab1b1a63d97ff9f011928 | |
parent | 66302ab7fb3bd1047ceb73623a27308f7f1471df (diff) |
Inject time of creation in Tenant constructor
3 files changed, 24 insertions, 21 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java index 7e0db0a00a2..7a9a4f950b5 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java @@ -6,11 +6,8 @@ import com.yahoo.path.Path; import com.yahoo.vespa.config.server.RequestHandler; import com.yahoo.vespa.config.server.application.TenantApplications; import com.yahoo.vespa.config.server.session.SessionRepository; -import com.yahoo.vespa.curator.Curator; -import org.apache.zookeeper.data.Stat; import java.time.Instant; -import java.util.Optional; /** * Contains all tenant-level components for a single tenant, dealing with editing sessions and @@ -29,19 +26,19 @@ public class Tenant implements TenantHandlerProvider { private final SessionRepository sessionRepository; private final TenantApplications applicationRepo; private final RequestHandler requestHandler; - private final Curator curator; + private final Instant created; Tenant(TenantName name, SessionRepository sessionRepository, RequestHandler requestHandler, TenantApplications applicationRepo, - Curator curator) { + Instant created) { this.name = name; this.path = TenantRepository.getTenantPath(name); this.requestHandler = requestHandler; this.sessionRepository = sessionRepository; this.applicationRepo = applicationRepo; - this.curator = curator; + this.created = created; } /** @@ -73,11 +70,7 @@ public class Tenant implements TenantHandlerProvider { } public Instant getCreatedTime() { - Optional<Stat> stat = curator.getStat(path); - if (stat.isPresent()) - return Instant.ofEpochMilli(stat.get().getCtime()); - else - return Instant.now(); + return created; } @Override 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 61043608066..5afb99e81e3 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 @@ -20,8 +20,10 @@ import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent; import org.apache.curator.framework.state.ConnectionState; import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.data.Stat; import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -146,7 +148,7 @@ public class TenantRepository { public synchronized void addTenant(TenantName tenantName, RequestHandler requestHandler, ReloadHandler reloadHandler) { writeTenantPath(tenantName); - createTenant(tenantName, requestHandler, reloadHandler); + createTenant(tenantName, componentRegistry.getClock().instant(), requestHandler, reloadHandler); } private static Set<TenantName> readTenantsFromZooKeeper(Curator curator) { @@ -162,14 +164,14 @@ public class TenantRepository { zkWatcherExecutor.execute(tenantName, () -> closeTenant(tenantName)); for (TenantName tenantName : allTenants) if ( ! tenants.containsKey(tenantName)) - zkWatcherExecutor.execute(tenantName, () -> createTenant(tenantName)); + zkWatcherExecutor.execute(tenantName, () -> bootstrapTenant(tenantName)); metricUpdater.setTenants(tenants.size()); } private void bootstrapTenants() { // Keep track of tenants created Map<TenantName, Future<?>> futures = new HashMap<>(); - readTenantsFromZooKeeper(curator).forEach(t -> futures.put(t, bootstrapExecutor.submit(() -> createTenant(t)))); + readTenantsFromZooKeeper(curator).forEach(t -> futures.put(t, bootstrapExecutor.submit(() -> bootstrapTenant(t)))); // Wait for all tenants to be created Set<TenantName> failed = new HashSet<>(); @@ -197,12 +199,21 @@ public class TenantRepository { } } - protected void createTenant(TenantName tenantName) { - createTenant(tenantName, null, null); + // Use when bootstrapping an existing tenant based on ZooKeeper data + protected void bootstrapTenant(TenantName tenantName) { + createTenant(tenantName, readCreatedTimeFromZooKeeper(tenantName), null, null); + } + + public Instant readCreatedTimeFromZooKeeper(TenantName tenantName) { + Optional<Stat> stat = curator.getStat(getTenantPath(tenantName)); + if (stat.isPresent()) + return Instant.ofEpochMilli(stat.get().getCtime()); + else + return componentRegistry.getClock().instant(); } // Creates tenant and all its dependencies. This also includes loading active applications - private void createTenant(TenantName tenantName, RequestHandler requestHandler, ReloadHandler reloadHandler) { + private void createTenant(TenantName tenantName, Instant created, RequestHandler requestHandler, ReloadHandler reloadHandler) { if (tenants.containsKey(tenantName)) return; TenantApplications applicationRepo = @@ -223,9 +234,8 @@ public class TenantRepository { applicationRepo, reloadHandler, componentRegistry.getFlagSource(), componentRegistry.getSessionPreparer()); - log.log(Level.INFO, "Creating tenant '" + tenantName + "'"); - Tenant tenant = new Tenant(tenantName, sessionRepository, requestHandler, applicationRepo, - componentRegistry.getCurator()); + log.log(Level.INFO, "Adding tenant '" + tenantName + "'" + ", created " + created); + Tenant tenant = new Tenant(tenantName, sessionRepository, requestHandler, applicationRepo, created); notifyNewTenant(tenant); tenants.putIfAbsent(tenantName, tenant); } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRepositoryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRepositoryTest.java index d73fb98214f..8d0285ac12b 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRepositoryTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRepositoryTest.java @@ -202,7 +202,7 @@ public class TenantRepositoryTest { } @Override - public void createTenant(TenantName tenantName) { + public void bootstrapTenant(TenantName tenantName) { throw new RuntimeException("Failed to create: " + tenantName); } } |