RANGER-4267: moved GDS service creation to init, instead of at resource services creation
diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/store/EmbeddedServiceDefsUtil.java b/agents-common/src/main/java/org/apache/ranger/plugin/store/EmbeddedServiceDefsUtil.java
index 75be1e7..92ce183 100755
--- a/agents-common/src/main/java/org/apache/ranger/plugin/store/EmbeddedServiceDefsUtil.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/store/EmbeddedServiceDefsUtil.java
@@ -27,7 +27,9 @@
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.ranger.authorization.hadoop.config.RangerAdminConfig;
+import org.apache.ranger.plugin.model.RangerService;
 import org.apache.ranger.plugin.model.RangerServiceDef;
+import org.apache.ranger.plugin.policyengine.gds.GdsPolicyEngine;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -180,6 +182,8 @@
 
 			// Ensure that tag service def is updated with access types of all service defs
 			store.updateTagServiceDefForAccessTypes();
+
+			getOrCreateService(store, EMBEDDED_SERVICEDEF_GDS_NAME, GdsPolicyEngine.GDS_SERVICE_NAME);
 		} catch(Throwable excp) {
 			LOG.error("EmbeddedServiceDefsUtil.init(): failed", excp);
 		}
@@ -377,4 +381,38 @@
 		}
 		return supportedServiceDef;
 	}
+
+	private RangerService getOrCreateService(ServiceStore store, String serviceType, String serviceName) {
+		if(LOG.isDebugEnabled()) {
+			LOG.debug("==> EmbeddedServiceDefsUtil.getOrCreateService(" + serviceType + ", " + serviceName + ")");
+		}
+
+		RangerService ret = null;
+
+		try {
+			ret = store.getServiceByName(serviceName);
+
+			if(ret == null) {
+				LOG.info("Creating service " + serviceName + " of type " + serviceType);
+
+				ret = new RangerService();
+
+				ret.setName(serviceName);
+				ret.setDisplayName(serviceName);
+				ret.setType(serviceType);
+
+				ret = store.createService(ret);
+
+				LOG.info("Created service " + serviceName + ". ID=" + (ret != null ? ret.getId() : null));
+			}
+		} catch(Exception excp) {
+			LOG.error("EmbeddedServiceDefsUtil.getOrCreateService(): failed to load/create service " + serviceName, excp);
+		}
+
+		if(LOG.isDebugEnabled()) {
+			LOG.debug("<== EmbeddedServiceDefsUtil.getOrCreateService(" + serviceType + ", " + serviceName + "): " + ret);
+		}
+
+		return ret;
+	}
 }
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
index a14c7a9..49386d0 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
@@ -4329,17 +4329,7 @@
 			}
 		};
 
-		Runnable createGdsServiceTask = new Runnable() {
-			@Override
-			public void run() {
-				final LinkedServiceCreator creator = new LinkedServiceCreator(resourceService.getName(), EMBEDDED_SERVICEDEF_GDS_NAME, ServiceDBStore.GDS_SERVICE_NAME, true, false);
-
-				creator.doCreateAndLinkService();
-			}
-		};
-
 		rangerTransactionSynchronizationAdapter.executeOnTransactionCommit(createAndLinkTagServiceTask);
-		rangerTransactionSynchronizationAdapter.executeOnTransactionCommit(createGdsServiceTask);
 
 		if (LOG.isDebugEnabled()) {
 			LOG.debug("<== createOrGetLinkedServices(resourceService=" + resourceService.getName() + ")");
@@ -4363,14 +4353,6 @@
 			this.isAutoLink          = config.getBoolean("ranger." + linkedServiceType + "service.auto.link", true);
 		}
 
-		LinkedServiceCreator(@Nonnull String resourceServiceName, @Nonnull String linkedServiceType, String linkedServiceName, boolean autoCreate, boolean autoLink) {
-			this.resourceServiceName = resourceServiceName;
-			this.linkedServiceType   = linkedServiceType;
-			this.linkedServiceName   = linkedServiceName;
-			this.isAutoCreate        = autoCreate;
-			this.isAutoLink          = autoLink;
-		}
-
 		void doCreateAndLinkService() {
 			if (LOG.isDebugEnabled()) {
 				LOG.debug("==> doCreateAndLinkService()");