From 342e88022cffa3c0392ec7f3e5d753dd53c7caa2 Mon Sep 17 00:00:00 2001 From: HÃ¥kon Hallingstad Date: Tue, 23 Jun 2020 22:21:25 +0200 Subject: Revert "From 0 to 1 spare" --- .../com/yahoo/vespa/hosted/provision/NodeRepository.java | 12 ++---------- .../provision/maintenance/SpareCapacityMaintainer.java | 7 +++---- .../provision/provisioning/NodeRepositoryProvisioner.java | 7 +++++-- .../hosted/provision/testutils/MockNodeRepository.java | 4 +--- .../vespa/hosted/provision/NodeRepositoryTester.java | 4 +--- .../provision/maintenance/CapacityCheckerTester.java | 4 +--- .../hosted/provision/maintenance/FailedExpirerTest.java | 4 +--- .../hosted/provision/maintenance/MaintenanceTester.java | 4 +--- .../hosted/provision/maintenance/MetricsReporterTest.java | 8 ++------ .../hosted/provision/maintenance/NodeFailTester.java | 4 +--- .../OperatorChangeApplicationMaintainerTest.java | 4 +--- .../maintenance/PeriodicApplicationMaintainerTest.java | 4 +--- .../provision/maintenance/ReservationExpirerTest.java | 4 +--- .../hosted/provision/maintenance/RetiredExpirerTest.java | 4 +--- .../maintenance/SpareCapacityMaintainerTest.java | 9 +++------ .../provisioning/DynamicDockerAllocationTest.java | 8 ++------ .../hosted/provision/provisioning/ProvisioningTester.java | 15 +++------------ 17 files changed, 30 insertions(+), 76 deletions(-) diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java index ff65dc18181..bec35e7ee4f 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java @@ -8,7 +8,6 @@ import com.yahoo.component.Version; import com.yahoo.concurrent.maintenance.JobControl; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.DockerImage; -import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeType; @@ -104,7 +103,6 @@ public class NodeRepository extends AbstractComponent { private final JobControl jobControl; private final Applications applications; private final boolean canProvisionHosts; - private final int spareCount; /** * Creates a node repository from a zookeeper provider. @@ -123,8 +121,7 @@ public class NodeRepository extends AbstractComponent { zone, new DnsNameResolver(), DockerImage.fromString(config.dockerImage()), config.useCuratorClientCache(), - provisionServiceProvider.getHostProvisioner().isPresent(), - zone.environment() == Environment.prod ? 1 : 0); + provisionServiceProvider.getHostProvisioner().isPresent()); } /** @@ -139,8 +136,7 @@ public class NodeRepository extends AbstractComponent { NameResolver nameResolver, DockerImage dockerImage, boolean useCuratorClientCache, - boolean canProvisionHosts, - int spareCount) { + boolean canProvisionHosts) { this.db = new CuratorDatabaseClient(flavors, curator, clock, zone, useCuratorClientCache); this.zone = zone; this.clock = clock; @@ -154,7 +150,6 @@ public class NodeRepository extends AbstractComponent { this.jobControl = new JobControl(db); this.applications = new Applications(db); this.canProvisionHosts = canProvisionHosts; - this.spareCount = spareCount; // read and write all nodes to make sure they are stored in the latest version of the serialized format for (State state : State.values()) @@ -197,9 +192,6 @@ public class NodeRepository extends AbstractComponent { public HostResourcesCalculator resourcesCalculator() { return resourcesCalculator; } - /** The number of nodes we should ensure has free capacity for node failures whenever possible */ - public int spareCount() { return spareCount; } - // ---------------- Query API ---------------------------------------------------------------- /** diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainer.java index 90c3a277080..9c042c6cdb9 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainer.java @@ -48,7 +48,7 @@ public class SpareCapacityMaintainer extends NodeRepositoryMaintainer { Duration interval) { this(deployer, nodeRepository, metric, interval, 10_000 // Should take less than a few minutes - ); + ); } public SpareCapacityMaintainer(Deployer deployer, @@ -109,11 +109,10 @@ public class SpareCapacityMaintainer extends NodeRepositoryMaintainer { Node node = nodeWhichCantMove.get(); NodeList allNodes = nodeRepository().list(); - // Allocation will assign the spareCount most empty nodes as "spares", which will not be allocated on + // Allocation will assign the two most empty nodes as "spares", which will not be allocated on // unless needed for node failing. Our goal here is to make room on these spares for the given node HostCapacity hostCapacity = new HostCapacity(allNodes, nodeRepository().resourcesCalculator()); - Set spareHosts = hostCapacity.findSpareHosts(allNodes.hosts().satisfies(node.resources()).asList(), - nodeRepository().spareCount()); + Set spareHosts = hostCapacity.findSpareHosts(allNodes.hosts().satisfies(node.resources()).asList(), 2); List hosts = allNodes.hosts().except(spareHosts).asList(); CapacitySolver capacitySolver = new CapacitySolver(hostCapacity, maxIterations); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java index faae52c72ec..f9d8213072e 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java @@ -46,6 +46,8 @@ import java.util.logging.Logger; public class NodeRepositoryProvisioner implements Provisioner { private static final Logger log = Logger.getLogger(NodeRepositoryProvisioner.class.getName()); + private static final int SPARE_CAPACITY_PROD = 0; + private static final int SPARE_CAPACITY_NONPROD = 0; private final NodeRepository nodeRepository; private final AllocationOptimizer allocationOptimizer; @@ -67,14 +69,13 @@ public class NodeRepositoryProvisioner implements Provisioner { .map(lbService -> new LoadBalancerProvisioner(nodeRepository, lbService, flagSource)); this.nodeResourceLimits = new NodeResourceLimits(nodeRepository); this.preparer = new Preparer(nodeRepository, - nodeRepository.spareCount(), + zone.environment() == Environment.prod ? SPARE_CAPACITY_PROD : SPARE_CAPACITY_NONPROD, provisionServiceProvider.getHostProvisioner(), flagSource, loadBalancerProvisioner); this.activator = new Activator(nodeRepository, loadBalancerProvisioner); } - /** * Returns a list of nodes in the prepared or active state, matching the given constraints. * The nodes are ordered by increasing index number. @@ -132,6 +133,8 @@ public class NodeRepositoryProvisioner implements Provisioner { loadBalancerProvisioner.ifPresent(lbProvisioner -> lbProvisioner.deactivate(application, transaction)); } + int getSpareCapacityProd() { return SPARE_CAPACITY_PROD; } + /** * Returns the target cluster resources, a value between the min and max in the requested capacity, * and updates the application store with the received min and max. diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java index bf56be4598c..151bd80a7b7 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java @@ -64,9 +64,7 @@ public class MockNodeRepository extends NodeRepository { Zone.defaultZone(), new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - true, - false, - 0); + true, false); this.flavors = flavors; curator.setZooKeeperEnsembleConnectionSpec("cfg1:1234,cfg2:1234,cfg3:1234"); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java index 034a9fb27d0..52c68cd74b2 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java @@ -40,9 +40,7 @@ public class NodeRepositoryTester { Zone.defaultZone(), new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - true, - false, - 0); + true, false); } public NodeRepository nodeRepository() { return nodeRepository; } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/CapacityCheckerTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/CapacityCheckerTester.java index cb3c7af797f..62e9a227109 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/CapacityCheckerTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/CapacityCheckerTester.java @@ -63,9 +63,7 @@ public class CapacityCheckerTester { zone, new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - true, - false, - 0); + true, false); } private void updateCapacityChecker() { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java index 7965293cf87..24a0020df4f 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java @@ -258,9 +258,7 @@ public class FailedExpirerTest { zone, new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-image"), - true, - false, - 0); + true, false); this.provisioner = new NodeRepositoryProvisioner(nodeRepository, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource()); this.expirer = new FailedExpirer(nodeRepository, zone, clock, Duration.ofMinutes(30)); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java index 59540223797..754870e798e 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java @@ -40,9 +40,7 @@ public class MaintenanceTester { zone, new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - true, - false, - 0); + true, false); public MaintenanceTester() { curator.setZooKeeperEnsembleConnectionSpec("zk1.host:1,zk2.host:2,zk3.host:3"); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java index 567cec7ff3e..727232e5c7c 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java @@ -84,9 +84,7 @@ public class MetricsReporterTest { Zone.defaultZone(), new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - true, - false, - 0); + true, false); Node node = nodeRepository.createNode("openStackId", "hostname", Optional.empty(), nodeFlavors.getFlavorOrThrow("default"), NodeType.tenant); nodeRepository.addNodes(List.of(node), Agent.system); Node hostNode = nodeRepository.createNode("openStackId2", "parent", Optional.empty(), nodeFlavors.getFlavorOrThrow("default"), NodeType.proxy); @@ -152,9 +150,7 @@ public class MetricsReporterTest { Zone.defaultZone(), new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - true, - false, - 0); + true, false); // Allow 4 containers Set ipAddressPool = Set.of("::2", "::3", "::4", "::5"); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java index a97675f5d5e..9cf03c6f33b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java @@ -82,9 +82,7 @@ public class NodeFailTester { zone, new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - true, - false, - 0); + true, false); provisioner = new NodeRepositoryProvisioner(nodeRepository, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource()); hostLivenessTracker = new TestHostLivenessTracker(clock); orchestrator = new OrchestratorMock(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java index e342e3b7302..b9c57e013c3 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java @@ -61,9 +61,7 @@ public class OperatorChangeApplicationMaintainerTest { zone, new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - true, - false, - 0); + true, false); this.fixture = new Fixture(zone, nodeRepository); createReadyNodes(15, this.fixture.nodeResources, nodeRepository); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java index 6d2b9a47e9f..b6ffe4ebe26 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java @@ -67,9 +67,7 @@ public class PeriodicApplicationMaintainerTest { zone, new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - true, - false, - 0); + true, false); this.fixture = new Fixture(zone, nodeRepository); createReadyNodes(15, fixture.nodeResources, nodeRepository); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java index 705a038a79f..2c0dac10f9f 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java @@ -52,9 +52,7 @@ public class ReservationExpirerTest { Zone.defaultZone(), new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - true, - false, - 0); + true, false); NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, Zone.defaultZone(), new MockProvisionServiceProvider(), new InMemoryFlagSource()); List nodes = new ArrayList<>(2); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java index 6a85654a2dd..29451d7b690 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java @@ -71,9 +71,7 @@ public class RetiredExpirerTest { zone, new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - true, - false, - 0); + true, false); private final NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource()); private final Orchestrator orchestrator = mock(Orchestrator.class); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainerTest.java index ccb35e758bb..fb84dc0a32a 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainerTest.java @@ -137,7 +137,7 @@ public class SpareCapacityMaintainerTest { // By moving the 4 small nodes from host 2 we free up sufficient space on the third host to act as a spare for // application 0 var tester = new SpareCapacityMaintainerTester(); - setupMultipleHosts(tester, 4); + setupMultipleHosts(tester, 5); tester.maintainer.maintain(); assertEquals(1, tester.deployer.redeployments); @@ -148,7 +148,7 @@ public class SpareCapacityMaintainerTest { @Test public void testMultipleNodesMustMoveFromOneHostButInsufficientCapacity() { var tester = new SpareCapacityMaintainerTester(); - setupMultipleHosts(tester, 3); + setupMultipleHosts(tester, 4); tester.maintainer.maintain(); assertEquals(0, tester.deployer.redeployments); @@ -244,10 +244,7 @@ public class SpareCapacityMaintainerTest { new ManualClock(), new Zone(Environment.prod, RegionName.from("us-east-3")), new MockNameResolver().mockAnyLookup(), - DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - true, - false, - 1); + DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), true, false); deployer = new MockDeployer(nodeRepository); maintainer = new SpareCapacityMaintainer(deployer, nodeRepository, metric, Duration.ofDays(1), maxIterations); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java index 100cf5704eb..98ec01e8e95 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java @@ -60,11 +60,7 @@ public class DynamicDockerAllocationTest { */ @Test public void relocate_nodes_from_spare_hosts() { - int spareCount = 1; - ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))) - .flavorsConfig(flavorsConfig()) - .spareCount(spareCount) - .build(); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build(); tester.makeReadyNodes(4, "host-small", NodeType.host, 32); tester.deployZoneApp(); List dockerHosts = tester.nodeRepository().getNodes(NodeType.host, Node.State.active); @@ -93,7 +89,7 @@ public class DynamicDockerAllocationTest { hostsWithChildren.add(node.parentHostname().get()); } } - assertEquals(4 - spareCount, hostsWithChildren.size()); + assertEquals(4 - tester.provisioner().getSpareCapacityProd(), hostsWithChildren.size()); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java index 204d1171919..e73aeb05ce3 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java @@ -91,8 +91,7 @@ public class ProvisioningTester { Orchestrator orchestrator, HostProvisioner hostProvisioner, LoadBalancerServiceMock loadBalancerService, - FlagSource flagSource, - int spareCount) { + FlagSource flagSource) { this.curator = curator; this.nodeFlavors = nodeFlavors; this.clock = new ManualClock(); @@ -105,8 +104,7 @@ public class ProvisioningTester { nameResolver, DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), true, - provisionServiceProvider.getHostProvisioner().isPresent(), - spareCount); + provisionServiceProvider.getHostProvisioner().isPresent()); this.orchestrator = orchestrator; this.provisioner = new NodeRepositoryProvisioner(nodeRepository, zone, provisionServiceProvider, flagSource); this.capacityPolicies = new CapacityPolicies(nodeRepository); @@ -543,7 +541,6 @@ public class ProvisioningTester { private HostProvisioner hostProvisioner; private LoadBalancerServiceMock loadBalancerService; private FlagSource flagSource; - private int spareCount = 0; public Builder curator(Curator curator) { this.curator = curator; @@ -601,11 +598,6 @@ public class ProvisioningTester { return this; } - public Builder spareCount(int spareCount) { - this.spareCount = spareCount; - return this; - } - public ProvisioningTester build() { Orchestrator orchestrator = Optional.ofNullable(this.orchestrator) .orElseGet(() -> { @@ -626,8 +618,7 @@ public class ProvisioningTester { orchestrator, hostProvisioner, Optional.ofNullable(loadBalancerService).orElseGet(LoadBalancerServiceMock::new), - Optional.ofNullable(flagSource).orElseGet(InMemoryFlagSource::new), - spareCount); + Optional.ofNullable(flagSource).orElseGet(InMemoryFlagSource::new)); } private static FlavorsConfig asConfig(List flavors) { -- cgit v1.2.3