diff options
author | Harald Musum <musum@verizonmedia.com> | 2020-08-26 11:54:04 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-26 11:54:04 +0200 |
commit | 1f10f6f995969674f4938764b62d8beea22cb4e9 (patch) | |
tree | 80e21d126791c83ffe035a455020256edf47a91c /configserver | |
parent | a0497ac0892be9f8372d5814cead725f656d29b7 (diff) |
Revert "Add timestamp when creating tenant to TenantMetaData"
Diffstat (limited to 'configserver')
4 files changed, 24 insertions, 82 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java index 73120e90a3e..137d0f1889e 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java @@ -25,6 +25,7 @@ import com.yahoo.io.IOUtils; import com.yahoo.jdisc.Metric; import com.yahoo.path.Path; import com.yahoo.slime.Slime; +import com.yahoo.text.Utf8; import com.yahoo.transaction.NestedTransaction; import com.yahoo.transaction.Transaction; import com.yahoo.vespa.config.server.application.Application; @@ -64,6 +65,8 @@ import com.yahoo.vespa.config.server.tenant.TenantMetaData; import com.yahoo.vespa.config.server.tenant.TenantRepository; import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.curator.Lock; +import com.yahoo.vespa.curator.transaction.CuratorOperations; +import com.yahoo.vespa.curator.transaction.CuratorTransaction; import com.yahoo.vespa.defaults.Defaults; import com.yahoo.vespa.flags.BooleanFlag; import com.yahoo.vespa.flags.FlagSource; @@ -412,18 +415,24 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye } if (useTenantMetaData.value()) - transaction.add(updateMetaDataWithDeployTimestamp(tenant, clock.instant())); + transaction.add(writeTenantMetaData(tenant).operations()); return transaction; } - private List<Transaction.Operation> updateMetaDataWithDeployTimestamp(Tenant tenant, Instant deployTimestamp) { - TenantMetaData tenantMetaData = getTenantMetaData(tenant).withLastDeployTimestamp(deployTimestamp); - return tenantRepository.createWriteTenantMetaDataTransaction(tenantMetaData).operations(); + private byte[] createMetaData(Tenant tenant) { + return new TenantMetaData(tenant.getSessionRepository().clock().instant()).asJsonBytes(); } TenantMetaData getTenantMetaData(Tenant tenant) { - return tenantRepository.getTenantMetaData(tenant); + Optional<byte[]> data = tenantRepository.getCurator().getData(TenantRepository.getTenantPath(tenant.getName())); + return data.map(bytes -> TenantMetaData.fromJsonString(Utf8.toString(bytes))).orElse(new TenantMetaData(tenant.getCreatedTime())); + } + + private Transaction writeTenantMetaData(Tenant tenant) { + return new CuratorTransaction(tenantRepository.getCurator()) + .add(CuratorOperations.setData(TenantRepository.getTenantPath(tenant.getName()).getAbsolute(), + createMetaData(tenant))); } static void checkIfActiveHasChanged(LocalSession session, Session currentActiveSession, boolean ignoreStaleSessionFailure) { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantMetaData.java b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantMetaData.java index b8db47e371f..24862b82fb0 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantMetaData.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantMetaData.java @@ -1,50 +1,30 @@ // Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server.tenant; -import com.yahoo.config.provision.TenantName; import com.yahoo.slime.Cursor; import com.yahoo.slime.Inspector; import com.yahoo.slime.Slime; import com.yahoo.slime.SlimeUtils; -import com.yahoo.text.Utf8; import java.io.IOException; import java.time.Instant; /** - * Meta data for a tenant like tenant name, tenant creation time and last deployment time, stored in ZooKeeper + * Metadata for a tenant. At the moment only stores last deploy time, to be used by TenantsMaintainer + * to GC unused tenants * * @author hmusum */ public class TenantMetaData { - private static final String createTimestampKey = "createTimestampKey"; - private static final String lastDeployTimestampKey = "lastDeployTimestamp"; + private final Instant lastDeployTimestamp; - private final TenantName tenantName; - private final Instant created; - private final Instant lastDeployed; - - public TenantMetaData(TenantName tenantName, Instant lastDeployed, Instant created) { - this.tenantName = tenantName; - this.created = created; - this.lastDeployed = lastDeployed; - } - - public TenantMetaData withLastDeployTimestamp(Instant deployTimestamp) { - return new TenantMetaData(tenantName, deployTimestamp, created); - } - - public TenantName tenantName() { - return tenantName; + public TenantMetaData(Instant instant) { + this.lastDeployTimestamp = instant; } public Instant lastDeployTimestamp() { - return lastDeployed; - } - - public Instant createdTimestamp() { - return created; + return lastDeployTimestamp; } public byte[] asJsonBytes() { @@ -55,16 +35,13 @@ public class TenantMetaData { } } - public static TenantMetaData fromJsonString(TenantName tenantName, String jsonString) { + public static TenantMetaData fromJsonString(String jsonString) { try { Slime data = SlimeUtils.jsonToSlime(jsonString); Inspector root = data.get(); - Inspector created = root.field(createTimestampKey); - Inspector lastDeployTimestamp = root.field(lastDeployTimestampKey); + Inspector lastDeployTimestamp = root.field("lastDeployTimestamp"); - return new TenantMetaData(tenantName, - Instant.ofEpochMilli(lastDeployTimestamp.asLong()), - Instant.ofEpochMilli(created.asLong())); + return new TenantMetaData(Instant.ofEpochMilli(lastDeployTimestamp.asLong())); } catch (Exception e) { throw new IllegalArgumentException("Error parsing json metadata", e); } @@ -73,14 +50,8 @@ public class TenantMetaData { private Slime getSlime() { Slime slime = new Slime(); Cursor meta = slime.setObject(); - meta.setLong(createTimestampKey, created.toEpochMilli()); - meta.setLong(lastDeployTimestampKey, lastDeployed.toEpochMilli()); + meta.setLong("lastDeployTimestamp", lastDeployTimestamp.toEpochMilli()); return slime; } - @Override - public String toString() { - return tenantName + ": " + Utf8.toString(asJsonBytes()); - } - } 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 2f05b7e7fe8..d6e3c6905fb 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 @@ -8,18 +8,12 @@ import com.yahoo.concurrent.StripedExecutor; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.TenantName; import com.yahoo.path.Path; -import com.yahoo.text.Utf8; -import com.yahoo.transaction.Transaction; import com.yahoo.vespa.config.server.GlobalComponentRegistry; import com.yahoo.vespa.config.server.application.TenantApplications; import com.yahoo.vespa.config.server.deploy.TenantFileSystemDirs; import com.yahoo.vespa.config.server.monitoring.MetricUpdater; import com.yahoo.vespa.config.server.session.SessionRepository; import com.yahoo.vespa.curator.Curator; -import com.yahoo.vespa.curator.transaction.CuratorOperations; -import com.yahoo.vespa.curator.transaction.CuratorTransaction; -import com.yahoo.vespa.flags.BooleanFlag; -import com.yahoo.vespa.flags.Flags; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent; import org.apache.curator.framework.state.ConnectionState; @@ -88,7 +82,6 @@ public class TenantRepository { private final ExecutorService bootstrapExecutor; private final ScheduledExecutorService checkForRemovedApplicationsService = new ScheduledThreadPoolExecutor(1); private final Optional<Curator.DirectoryCache> directoryCache; - private final BooleanFlag useTenantMetaData; /** * Creates a new tenant repository @@ -116,7 +109,6 @@ public class TenantRepository { this.tenantListeners.add(componentRegistry.getTenantListener()); this.zkCacheExecutor = componentRegistry.getZkCacheExecutor(); this.zkWatcherExecutor = componentRegistry.getZkWatcherExecutor(); - this.useTenantMetaData = Flags.USE_TENANT_META_DATA.bindTo(componentRegistry.getFlagSource()); curator.framework().getConnectionStateListenable().addListener(this::stateChanged); curator.create(tenantsPath); @@ -150,30 +142,6 @@ public class TenantRepository { createTenant(tenantName, componentRegistry.getClock().instant()); } - public void createAndWriteTenantMetaData(Tenant tenant) { - createWriteTenantMetaDataTransaction(createMetaData(tenant)).commit(); - } - - public Transaction createWriteTenantMetaDataTransaction(TenantMetaData tenantMetaData) { - return new CuratorTransaction(curator).add( - CuratorOperations.setData(TenantRepository.getTenantPath(tenantMetaData.tenantName()).getAbsolute(), - tenantMetaData.asJsonBytes())); - } - - private TenantMetaData createMetaData(Tenant tenant) { - Instant deployTime = tenant.getSessionRepository().clock().instant(); - Instant createdTime = getTenantMetaData(tenant).createdTimestamp(); - if (createdTime.equals(Instant.EPOCH)) - createdTime = deployTime; - return new TenantMetaData(tenant.getName(), deployTime, createdTime); - } - - public TenantMetaData getTenantMetaData(Tenant tenant) { - Optional<byte[]> data = getCurator().getData(TenantRepository.getTenantPath(tenant.getName())); - return data.map(bytes -> TenantMetaData.fromJsonString(tenant.getName(), Utf8.toString(bytes))) - .orElse(new TenantMetaData(tenant.getName(), tenant.getCreatedTime(), tenant.getCreatedTime())); - } - private static Set<TenantName> readTenantsFromZooKeeper(Curator curator) { return curator.getChildren(tenantsPath).stream().map(TenantName::from).collect(Collectors.toSet()); } @@ -258,8 +226,6 @@ public class TenantRepository { Tenant tenant = new Tenant(tenantName, sessionRepository, applicationRepo, applicationRepo, created); notifyNewTenant(tenant); tenants.putIfAbsent(tenantName, tenant); - if (useTenantMetaData.value()) - createAndWriteTenantMetaData(tenant); } /** diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java index cb43e80e82d..beac308cf77 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java @@ -167,7 +167,6 @@ public class ApplicationRepositoryTest { session.getAllocatedHosts(); assertEquals(Instant.EPOCH, applicationRepository.getTenantMetaData(tenant).lastDeployTimestamp()); - assertEquals(Instant.EPOCH, applicationRepository.getTenantMetaData(tenant).createdTimestamp()); } @Test @@ -175,7 +174,6 @@ public class ApplicationRepositoryTest { FlagSource flagSource = new InMemoryFlagSource().withBooleanFlag(Flags.USE_TENANT_META_DATA.id(), true); setup(flagSource); - Instant startTime = clock.instant(); Duration duration = Duration.ofHours(1); clock.advance(duration); Instant deployTime = clock.instant(); @@ -190,8 +188,6 @@ public class ApplicationRepositoryTest { assertEquals(deployTime.toEpochMilli(), applicationRepository.getTenantMetaData(tenant).lastDeployTimestamp().toEpochMilli()); - assertEquals(startTime.toEpochMilli(), - applicationRepository.getTenantMetaData(tenant).createdTimestamp().toEpochMilli()); } @Test |