summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2020-06-24 13:06:55 +0200
committerHarald Musum <musum@verizonmedia.com>2020-06-24 13:06:55 +0200
commitfcc44803ad12c6a4be9e5eec268114744d32c940 (patch)
treec9a1e541809c83c92b4ab1b1a63d97ff9f011928
parent66302ab7fb3bd1047ceb73623a27308f7f1471df (diff)
Inject time of creation in Tenant constructor
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java15
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java28
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/tenant/TenantRepositoryTest.java2
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);
}
}