Skip to content

Commit b909cad

Browse files
committed
Improve Server Startup Health Check API
1 parent b844a8e commit b909cad

File tree

4 files changed

+90
-8
lines changed

4 files changed

+90
-8
lines changed

components/apimgt/org.wso2.carbon.apimgt.gateway/src/main/java/org/wso2/carbon/apimgt/gateway/internal/DataHolder.java

+20-6
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020

2121
import org.apache.commons.logging.Log;
2222
import org.apache.commons.logging.LogFactory;
23+
import org.wso2.carbon.apimgt.api.APIManagementException;
2324
import org.wso2.carbon.apimgt.api.gateway.GatewayAPIDTO;
2425
import org.wso2.carbon.apimgt.api.gateway.GraphQLSchemaDTO;
26+
import org.wso2.carbon.apimgt.gateway.utils.GatewayUtils;
2527
import org.wso2.carbon.apimgt.gateway.webhooks.SubscriptionDataStore;
2628
import org.wso2.carbon.apimgt.impl.notifier.events.APIEvent;
2729
import org.wso2.carbon.apimgt.impl.notifier.events.DeployAPIInGatewayEvent;
@@ -32,6 +34,7 @@
3234
import org.wso2.carbon.apimgt.keymgt.model.impl.SubscriptionDataLoaderImpl;
3335

3436
import java.util.*;
37+
import java.util.stream.Collectors;
3538

3639
public class DataHolder {
3740
private static final Log log = LogFactory.getLog(DataHolder.class);
@@ -41,11 +44,11 @@ public class DataHolder {
4144
private Map<String, GraphQLSchemaDTO> apiToGraphQLSchemaDTOMap = new HashMap<>();
4245
private Map<String, List<String>> apiToKeyManagersMap = new HashMap<>();
4346
private Map<String,Map<String, API>> tenantAPIMap = new HashMap<>();
44-
private boolean isAllApisDeployed = false;
47+
private Map<String, Boolean> tenantDeployStatus = new HashMap<>();
4548
private boolean isAllGatewayPoliciesDeployed = false;
4649

4750
private DataHolder() {
48-
51+
initializeTenantDeploymentStatusMap();
4952
}
5053

5154
public Map<String, List<String>> getApiToCertificatesMap() {
@@ -104,13 +107,15 @@ public void addApiToGraphQLSchemaDTO(String apiId, GraphQLSchemaDTO graphQLSchem
104107
}
105108

106109
public boolean isAllApisDeployed() {
107-
108-
return isAllApisDeployed;
110+
return tenantDeployStatus.values().stream().allMatch(Boolean::booleanValue);
109111
}
110112

111-
public void setAllApisDeployed(boolean allApisDeployed) {
113+
public Map<String, Boolean> getTenantDeployStatus() {
114+
return tenantDeployStatus;
115+
}
112116

113-
isAllApisDeployed = allApisDeployed;
117+
public void setTenantDeployStatus(String tenant) {
118+
tenantDeployStatus.put(tenant, true);
114119
}
115120

116121
public void addKeyManagerToAPIMapping(String uuid, List<String> keyManagers) {
@@ -227,4 +232,13 @@ public void markApisAsUnDeployedInTenant(String tenantDomain) {
227232
apiMap.values().forEach(api -> api.setDeployed(false));
228233
}
229234
}
235+
236+
private void initializeTenantDeploymentStatusMap() {
237+
try {
238+
List<String> tenants = GatewayUtils.getTenantsToBeDeployed();
239+
tenantDeployStatus = tenants.stream().collect(Collectors.toMap(str -> str, str -> false));
240+
} catch (APIManagementException e) {
241+
log.error("Error while initializing tenant deployment status map", e);
242+
}
243+
}
230244
}

components/apimgt/org.wso2.carbon.apimgt.gateway/src/main/java/org/wso2/carbon/apimgt/gateway/listeners/GatewayStartupListener.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,6 @@ private void deployAPIsInSyncMode(String tenantDomain) throws ArtifactSynchroniz
292292
}
293293
syncModeDeploymentCount++;
294294
isAPIsDeployedInSyncMode = deployArtifactsAtStartup(tenantDomain);
295-
DataHolder.getInstance().setAllApisDeployed(isAPIsDeployedInSyncMode);
296295
if (!isAPIsDeployedInSyncMode) {
297296
log.error("Deployment attempt : " + syncModeDeploymentCount + " was unsuccessful");
298297
if (!(syncModeDeploymentCount > retryCount)) {
@@ -301,6 +300,7 @@ private void deployAPIsInSyncMode(String tenantDomain) throws ArtifactSynchroniz
301300
log.error("Maximum retry limit exceeded. Server is starting without deploying all synapse artifacts");
302301
}
303302
} else {
303+
DataHolder.getInstance().setTenantDeployStatus(tenantDomain);
304304
log.info("Deployment attempt : " + syncModeDeploymentCount + " was successful");
305305
}
306306
}
@@ -370,8 +370,8 @@ private void deployArtifactsInGateway(String tenantDomain) throws ArtifactSynchr
370370
while (retry) {
371371
try {
372372
boolean isArtifactsDeployed = deployArtifactsAtStartup(tenantDomain);
373-
DataHolder.getInstance().setAllApisDeployed(isArtifactsDeployed);
374373
if (isArtifactsDeployed) {
374+
DataHolder.getInstance().setTenantDeployStatus(tenantDomain);
375375
log.info("Synapse Artifacts deployed Successfully in the Gateway");
376376
retry = false;
377377
} else {

components/apimgt/org.wso2.carbon.apimgt.gateway/src/main/java/org/wso2/carbon/apimgt/gateway/utils/GatewayUtils.java

+67
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,16 @@
8080
import org.wso2.carbon.apimgt.tracing.telemetry.TelemetrySpan;
8181
import org.wso2.carbon.apimgt.tracing.telemetry.TelemetryTracer;
8282
import org.wso2.carbon.apimgt.tracing.telemetry.TelemetryUtil;
83+
import org.wso2.carbon.base.ServerConfiguration;
8384
import org.wso2.carbon.context.PrivilegedCarbonContext;
8485
import org.wso2.carbon.identity.oauth.config.OAuthServerConfiguration;
8586
import org.wso2.carbon.mediation.registry.RegistryServiceHolder;
8687
import org.wso2.carbon.registry.core.Resource;
8788
import org.wso2.carbon.registry.core.exceptions.RegistryException;
8889
import org.wso2.carbon.registry.core.session.UserRegistry;
90+
import org.wso2.carbon.user.api.UserStoreException;
8991
import org.wso2.carbon.user.core.UserCoreConstants;
92+
import org.wso2.carbon.utils.CarbonUtils;
9093
import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
9194
import org.wso2.carbon.utils.multitenancy.MultitenantUtils;
9295

@@ -1716,4 +1719,68 @@ public static boolean isOnDemandLoading() {
17161719
.getGatewayArtifactSynchronizerProperties();
17171720
return gatewayArtifactSynchronizerProperties.isOnDemandLoading();
17181721
}
1722+
1723+
/**
1724+
* This method return the carbon.xml config value for tenant eager loading
1725+
*
1726+
* @return config string
1727+
*/
1728+
public static String getEagerLoadingEnabledTenantsConfig() {
1729+
ServerConfiguration carbonConfig = CarbonUtils.getServerConfiguration();
1730+
return carbonConfig.getFirstProperty(APIConstants.EAGER_LOADING_ENABLED_TENANTS);
1731+
}
1732+
1733+
/**
1734+
* This method returns the list of tenants for which eager loading is enabled
1735+
*
1736+
* @return List of eager loading enabled tenants
1737+
*/
1738+
public static List<String> getTenantsToBeDeployed() throws APIManagementException {
1739+
List<String> tenantsToBeDeployed = new ArrayList<>();
1740+
tenantsToBeDeployed.add(APIConstants.SUPER_TENANT_DOMAIN);
1741+
1742+
//Read eager loading config from carbon server config, and extract include and exclude tenant lists
1743+
String eagerLoadingConfig = getEagerLoadingEnabledTenantsConfig();
1744+
if (StringUtils.isNotEmpty(eagerLoadingConfig)) {
1745+
boolean includeAllTenants = false;
1746+
List<String> includeTenantList = new ArrayList<>();
1747+
List<String> excludeTenantList = new ArrayList<>();
1748+
1749+
1750+
if (StringUtils.isNotEmpty(eagerLoadingConfig)) {
1751+
String[] tenants = eagerLoadingConfig.split(",");
1752+
for (String tenant : tenants) {
1753+
tenant = tenant.trim();
1754+
if (tenant.equals("*")) {
1755+
includeAllTenants = true;
1756+
} else if (tenant.contains("!")) {
1757+
if (tenant.contains("*")) {
1758+
// "!*" is not a valid config
1759+
throw new IllegalArgumentException(tenant + " is not a valid tenant domain");
1760+
}
1761+
excludeTenantList.add(tenant.replace("!", ""));
1762+
} else {
1763+
includeTenantList.add(tenant);
1764+
}
1765+
}
1766+
}
1767+
1768+
//Fetch all active tenant domains
1769+
try {
1770+
Set<String> allTenants = APIUtil.getTenantDomainsByState(APIConstants.TENANT_STATE_ACTIVE);
1771+
if (includeAllTenants) {
1772+
tenantsToBeDeployed.addAll(allTenants);
1773+
// Now that we have included all tenants, let's see whether any tenant have been excluded
1774+
if (!excludeTenantList.isEmpty()) {
1775+
tenantsToBeDeployed.removeAll(excludeTenantList);
1776+
}
1777+
} else {
1778+
tenantsToBeDeployed.addAll(includeTenantList);
1779+
}
1780+
} catch (UserStoreException e) {
1781+
throw new APIManagementException("Error while fetching active tenants list.", e);
1782+
}
1783+
}
1784+
return tenantsToBeDeployed;
1785+
}
17191786
}

components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConstants.java

+1
Original file line numberDiff line numberDiff line change
@@ -3142,6 +3142,7 @@ public static class APILogHandler {
31423142

31433143
// Constants related to basic health check APIs
31443144
public static final String WEB_SOCKET_HEALTH_CHECK_PATH = "/health";
3145+
public static final String EAGER_LOADING_ENABLED_TENANTS = "Tenant.LoadingPolicy.EagerLoading.Include";
31453146

31463147
public static final String CASE_SENSITIVE_CHECK_PATH = "caseSensitiveRoleValidation";
31473148
public static final String SOAP_TO_REST_PRESERVE_ELEMENT_ORDER = "soapToRestPreserveElementOrder";

0 commit comments

Comments
 (0)