private PinotResourceManagerResponse scaleDownBroker(Tenant tenant, String brokerTenantTag, List<String> instancesInClusterWithTag) { int numberBrokersToUntag = instancesInClusterWithTag.size() - tenant.getNumberOfInstances(); for (int i = 0; i < numberBrokersToUntag; ++i) { retagInstance(instancesInClusterWithTag.get(i), brokerTenantTag, CommonConstants.Helix.UNTAGGED_BROKER_INSTANCE); } return PinotResourceManagerResponse.SUCCESS; }
public PinotResourceManagerResponse createBrokerTenant(Tenant brokerTenant) { List<String> unTaggedInstanceList = getOnlineUnTaggedBrokerInstanceList(); int numberOfInstances = brokerTenant.getNumberOfInstances(); if (unTaggedInstanceList.size() < numberOfInstances) { String message = "Failed to allocate broker instances to Tag : " + brokerTenant.getTenantName() + ", Current number of untagged server instances : " + unTaggedInstanceList.size() + ", Request asked number is : " + brokerTenant.getNumberOfInstances(); LOGGER.error(message); return PinotResourceManagerResponse.failure(message); } String brokerTag = TagNameUtils.getBrokerTagForTenant(brokerTenant.getTenantName()); for (int i = 0; i < brokerTenant.getNumberOfInstances(); ++i) { retagInstance(unTaggedInstanceList.get(i), CommonConstants.Helix.UNTAGGED_BROKER_INSTANCE, brokerTag); } return PinotResourceManagerResponse.SUCCESS; }
public PinotResourceManagerResponse updateBrokerTenant(Tenant tenant) { String brokerTenantTag = TagNameUtils.getBrokerTagForTenant(tenant.getTenantName()); List<String> instancesInClusterWithTag = HelixHelper.getInstancesWithTag(_helixZkManager, brokerTenantTag); if (instancesInClusterWithTag.size() > tenant.getNumberOfInstances()) { return scaleDownBroker(tenant, brokerTenantTag, instancesInClusterWithTag); } if (instancesInClusterWithTag.size() < tenant.getNumberOfInstances()) { return scaleUpBroker(tenant, brokerTenantTag, instancesInClusterWithTag); } return PinotResourceManagerResponse.SUCCESS; }
private PinotResourceManagerResponse scaleUpBroker(Tenant tenant, String brokerTenantTag, List<String> instancesInClusterWithTag) { List<String> unTaggedInstanceList = getOnlineUnTaggedBrokerInstanceList(); int numberOfInstancesToAdd = tenant.getNumberOfInstances() - instancesInClusterWithTag.size(); if (unTaggedInstanceList.size() < numberOfInstancesToAdd) { String message = "Failed to allocate broker instances to Tag : " + tenant.getTenantName() + ", Current number of untagged broker instances : " + unTaggedInstanceList.size() + ", Current number of tagged broker instances : " + instancesInClusterWithTag.size() + ", Request asked number is : " + tenant.getNumberOfInstances(); LOGGER.error(message); return PinotResourceManagerResponse.failure(message); } for (int i = 0; i < numberOfInstancesToAdd; ++i) { String instanceName = unTaggedInstanceList.get(i); retagInstance(instanceName, CommonConstants.Helix.UNTAGGED_BROKER_INSTANCE, brokerTenantTag); // Update idealState by adding new instance to table mapping. addInstanceToBrokerIdealState(brokerTenantTag, instanceName); } return PinotResourceManagerResponse.SUCCESS; }
private PinotResourceManagerResponse scaleUpServerTenant(Tenant serverTenant, String realtimeServerTag, List<String> taggedRealtimeServers, String offlineServerTag, List<String> taggedOfflineServers, Set<String> allServingServers) { int incInstances = serverTenant.getNumberOfInstances() - allServingServers.size(); List<String> unTaggedInstanceList = getOnlineUnTaggedServerInstanceList(); if (unTaggedInstanceList.size() < incInstances) { String message = "Failed to allocate hardware resources with tenant info: " + serverTenant + ", Current number of untagged instances : " + unTaggedInstanceList.size() + ", Current number of serving instances : " + allServingServers.size() + ", Current number of tagged offline server instances : " + taggedOfflineServers.size() + ", Current number of tagged realtime server instances : " + taggedRealtimeServers.size(); LOGGER.error(message); return PinotResourceManagerResponse.failure(message); } if (serverTenant.isCoLocated()) { return updateColocatedServerTenant(serverTenant, realtimeServerTag, taggedRealtimeServers, offlineServerTag, taggedOfflineServers, incInstances, unTaggedInstanceList); } else { return updateIndependentServerTenant(serverTenant, realtimeServerTag, taggedRealtimeServers, offlineServerTag, taggedOfflineServers, incInstances, unTaggedInstanceList); } }
public PinotResourceManagerResponse createServerTenant(Tenant serverTenant) { int numberOfInstances = serverTenant.getNumberOfInstances(); List<String> unTaggedInstanceList = getOnlineUnTaggedServerInstanceList(); if (unTaggedInstanceList.size() < numberOfInstances) { String message = "Failed to allocate server instances to Tag : " + serverTenant.getTenantName() + ", Current number of untagged server instances : " + unTaggedInstanceList.size() + ", Request asked number is : " + serverTenant.getNumberOfInstances(); LOGGER.error(message); return PinotResourceManagerResponse.failure(message); } else { if (serverTenant.isCoLocated()) { assignColocatedServerTenant(serverTenant, numberOfInstances, unTaggedInstanceList); } else { assignIndependentServerTenant(serverTenant, numberOfInstances, unTaggedInstanceList); } } return PinotResourceManagerResponse.SUCCESS; }
public PinotResourceManagerResponse updateServerTenant(Tenant serverTenant) { String realtimeServerTag = TagNameUtils.getRealtimeTagForTenant(serverTenant.getTenantName()); List<String> taggedRealtimeServers = HelixHelper.getInstancesWithTag(_helixZkManager, realtimeServerTag); String offlineServerTag = TagNameUtils.getOfflineTagForTenant(serverTenant.getTenantName()); List<String> taggedOfflineServers = HelixHelper.getInstancesWithTag(_helixZkManager, offlineServerTag); Set<String> allServingServers = new HashSet<>(); allServingServers.addAll(taggedOfflineServers); allServingServers.addAll(taggedRealtimeServers); boolean isCurrentTenantColocated = (allServingServers.size() < taggedOfflineServers.size() + taggedRealtimeServers.size()); if (isCurrentTenantColocated != serverTenant.isCoLocated()) { String message = "Not support different colocated type request for update request: " + serverTenant; LOGGER.error(message); return PinotResourceManagerResponse.failure(message); } if (serverTenant.getNumberOfInstances() < allServingServers.size() || serverTenant.getOfflineInstances() < taggedOfflineServers.size() || serverTenant.getRealtimeInstances() < taggedRealtimeServers.size()) { return scaleDownServer(serverTenant, taggedRealtimeServers, taggedOfflineServers, allServingServers); } return scaleUpServerTenant(serverTenant, realtimeServerTag, taggedRealtimeServers, offlineServerTag, taggedOfflineServers, allServingServers); }
@Test public void testDeserializeFromJson() throws IOException { Tenant tenant = new Tenant(); tenant.setTenantRole(TenantRole.SERVER); tenant.setTenantName("newTenant"); tenant.setNumberOfInstances(10); tenant.setOfflineInstances(5); tenant.setRealtimeInstances(5); tenant = JsonUtils.stringToObject(JsonUtils.objectToString(tenant), Tenant.class); assertEquals(tenant.getTenantRole(), TenantRole.SERVER); assertEquals(tenant.getTenantName(), "newTenant"); assertEquals(tenant.getNumberOfInstances(), 10); assertEquals(tenant.getOfflineInstances(), 5); assertEquals(tenant.getRealtimeInstances(), 5); } }