RANGER-2186: Increment service-specific policy and tag versions after update 
transaction is committed


Project: http://git-wip-us.apache.org/repos/asf/ranger/repo
Commit: http://git-wip-us.apache.org/repos/asf/ranger/commit/fbcaaaf6
Tree: http://git-wip-us.apache.org/repos/asf/ranger/tree/fbcaaaf6
Diff: http://git-wip-us.apache.org/repos/asf/ranger/diff/fbcaaaf6

Branch: refs/heads/ranger-1.1
Commit: fbcaaaf6d780d959ee5fe6b5aae6c71ba289050f
Parents: b66e98d
Author: Abhay Kulkarni <[email protected]>
Authored: Wed Aug 15 21:03:41 2018 -0700
Committer: Mehul Parikh <[email protected]>
Committed: Tue Sep 4 11:45:03 2018 +0530

----------------------------------------------------------------------
 .../plugin/store/AbstractServiceStore.java      |   2 +-
 .../org/apache/ranger/biz/ServiceDBStore.java   | 148 ++++++++----------
 ...RangerTransactionSynchronizationAdapter.java | 154 ++++++++++++++-----
 .../org/apache/ranger/db/RangerDaoManager.java  |   8 +
 .../apache/ranger/db/RangerDaoManagerBase.java  |   6 -
 .../ranger/db/XXServiceVersionInfoDao.java      |  17 +-
 .../apache/ranger/biz/TestServiceDBStore.java   |  64 ++++----
 7 files changed, 236 insertions(+), 163 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ranger/blob/fbcaaaf6/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractServiceStore.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractServiceStore.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractServiceStore.java
index 69ded6d..b0dd283 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractServiceStore.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractServiceStore.java
@@ -138,7 +138,7 @@ public abstract class AbstractServiceStore implements 
ServiceStore {
                }
        }
 
-       protected final long getNextVersion(Long currentVersion) {
+       public static long getNextVersion(Long currentVersion) {
                return currentVersion == null ? 1L : currentVersion + 1;
        }
 

http://git-wip-us.apache.org/repos/asf/ranger/blob/fbcaaaf6/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
index 0773616..cb5f240 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
@@ -57,6 +57,7 @@ import org.apache.ranger.common.AppConstants;
 import org.apache.ranger.common.ContextUtil;
 import org.apache.ranger.common.MessageEnums;
 import org.apache.ranger.common.RangerCommonEnums;
+import org.apache.ranger.common.db.RangerTransactionSynchronizationAdapter;
 import org.apache.ranger.plugin.policyengine.RangerPolicyEngine;
 import 
org.apache.ranger.plugin.policyresourcematcher.RangerDefaultPolicyResourceMatcher;
 import 
org.apache.ranger.plugin.policyresourcematcher.RangerPolicyResourceMatcher;
@@ -304,6 +305,9 @@ public class ServiceDBStore extends AbstractServiceStore {
         @Autowired
         AssetMgr assetMgr;
 
+       @Autowired
+       RangerTransactionSynchronizationAdapter 
transactionSynchronizationAdapter;
+
        private static volatile boolean legacyServiceDefsInitDone = false;
        private Boolean populateExistingBaseFields = false;
        
@@ -2032,7 +2036,7 @@ public class ServiceDBStore extends AbstractServiceStore {
                dataHistService.createObjectDataHistory(updPolicy, 
RangerDataHistService.ACTION_UPDATE);
                
                bizUtil.createTrxLog(trxLogList);
-               
+
                return updPolicy;
        }
 
@@ -2814,6 +2818,8 @@ public class ServiceDBStore extends AbstractServiceStore {
                updatePolicyVersion(service, isTagVersionUpdateNeeded);
        }
 
+       public enum VERSION_TYPE { POLICY_VERSION, TAG_VERSION, 
POLICY_AND_TAG_VERSION }
+
        private void updatePolicyVersion(RangerService service, boolean 
isTagVersionUpdateNeeded) throws Exception {
                if(service == null || service.getId() == null) {
                        return;
@@ -2830,28 +2836,14 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                        return;
                }
 
-               XXServiceVersionInfoDao serviceVersionInfoDao = 
daoMgr.getXXServiceVersionInfo();
-
-               XXServiceVersionInfo serviceVersionInfoDbObj = 
serviceVersionInfoDao.findByServiceId(service.getId());
-
-               if(serviceVersionInfoDbObj != null) {
-                       
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(serviceVersionInfoDbObj.getPolicyVersion()));
-                       serviceVersionInfoDbObj.setPolicyUpdateTime(new Date());
-
-                       serviceVersionInfoDao.update(serviceVersionInfoDbObj);
-
-               } else {
-                       LOG.warn("updatePolicyVersion(service=" + 
serviceDbObj.getName() + "): serviceVersionInfo not found, creating it..");
+               Runnable commitWork = new Runnable() {
+                       @Override
+                       public void run() {
+                               persistVersionChange(daoMgr, 
serviceDbObj.getId(), VERSION_TYPE.POLICY_VERSION);
+                       }
+               };
 
-                       serviceVersionInfoDbObj = new XXServiceVersionInfo();
-                       
serviceVersionInfoDbObj.setServiceId(serviceDbObj.getId());
-                       
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(serviceDbObj.getPolicyVersion()));
-                       serviceVersionInfoDbObj.setPolicyUpdateTime(new Date());
-                       
serviceVersionInfoDbObj.setTagVersion(serviceDbObj.getTagVersion());
-                       
serviceVersionInfoDbObj.setTagUpdateTime(serviceDbObj.getTagUpdateTime());
-
-                       serviceVersionInfoDao.create(serviceVersionInfoDbObj);
-               }
+               
transactionSynchronizationAdapter.executeOnTransactionCommit(commitWork);
 
                // if this is a tag service, update all services that refer to 
this tag service
                // so that next policy-download from plugins will get updated 
tag policies
@@ -2861,37 +2853,50 @@ public class ServiceDBStore extends 
AbstractServiceStore {
 
                        if(CollectionUtils.isNotEmpty(referringServices)) {
                                for(XXService referringService : 
referringServices) {
-                                       serviceVersionInfoDbObj = 
serviceVersionInfoDao.findByServiceId(referringService.getId());
-                                       if (serviceVersionInfoDbObj != null) {
-
-                                               
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(serviceVersionInfoDbObj.getPolicyVersion()));
-                                               
serviceVersionInfoDbObj.setPolicyUpdateTime(new Date());
-
-                                               if (filterForServicePlugin && 
isTagVersionUpdateNeeded) {
-                                                       
serviceVersionInfoDbObj.setTagVersion(getNextVersion(serviceVersionInfoDbObj.getTagVersion()));
-                                                       
serviceVersionInfoDbObj.setTagUpdateTime(new Date());
-                                               }
-                                               
serviceVersionInfoDao.update(serviceVersionInfoDbObj);
-                                       } else {
-                                               
LOG.warn("updatePolicyVersion(service=" + referringService.getName() + "): 
serviceVersionInfo not found, creating it..");
-                                               serviceVersionInfoDbObj = new 
XXServiceVersionInfo();
-                                               
serviceVersionInfoDbObj.setServiceId(referringService.getId());
-                                               
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(referringService.getPolicyVersion()));
-                                               
serviceVersionInfoDbObj.setPolicyUpdateTime(new Date());
-                                               if (filterForServicePlugin && 
isTagVersionUpdateNeeded) {
-                                                       
serviceVersionInfoDbObj.setTagVersion(getNextVersion(referringService.getTagVersion()));
-                                                       
serviceVersionInfoDbObj.setTagUpdateTime(new Date());
-                                               } else {
-                                                       
serviceVersionInfoDbObj.setTagVersion(referringService.getTagVersion());
-                                                       
serviceVersionInfoDbObj.setTagUpdateTime(referringService.getTagUpdateTime());
+                                       commitWork = new Runnable() {
+                                               @Override
+                                               public void run() {
+                                                       
persistVersionChange(daoMgr, referringService.getId(),
+                                                                       
filterForServicePlugin && isTagVersionUpdateNeeded ? 
VERSION_TYPE.POLICY_AND_TAG_VERSION : VERSION_TYPE.POLICY_VERSION);
                                                }
-                                               
serviceVersionInfoDao.create(serviceVersionInfoDbObj);
-                                       }
+                                       };
+                                       
transactionSynchronizationAdapter.executeOnTransactionCommit(commitWork);
                                }
                        }
                }
        }
 
+       public static void persistVersionChange(RangerDaoManager daoMgr, Long 
id, VERSION_TYPE versionType) {
+               XXServiceVersionInfoDao serviceVersionInfoDao = 
daoMgr.getXXServiceVersionInfo();
+
+               XXServiceVersionInfo serviceVersionInfoDbObj = 
serviceVersionInfoDao.findByServiceId(id);
+
+               if(serviceVersionInfoDbObj != null) {
+                       if (versionType == VERSION_TYPE.POLICY_VERSION || 
versionType == VERSION_TYPE.POLICY_AND_TAG_VERSION) {
+                               
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(serviceVersionInfoDbObj.getPolicyVersion()));
+                               serviceVersionInfoDbObj.setPolicyUpdateTime(new 
Date());
+                       }
+                       if (versionType == VERSION_TYPE.TAG_VERSION || 
versionType == VERSION_TYPE.POLICY_AND_TAG_VERSION) {
+
+                               
serviceVersionInfoDbObj.setTagVersion(getNextVersion(serviceVersionInfoDbObj.getTagVersion()));
+                               serviceVersionInfoDbObj.setTagUpdateTime(new 
Date());
+                       }
+
+                       serviceVersionInfoDao.update(serviceVersionInfoDbObj);
+
+               } else {
+                       XXService service = daoMgr.getXXService().getById(id);
+                       serviceVersionInfoDbObj = new XXServiceVersionInfo();
+                       serviceVersionInfoDbObj.setServiceId(service.getId());
+                       serviceVersionInfoDbObj.setPolicyVersion(1L);
+                       serviceVersionInfoDbObj.setPolicyUpdateTime(new Date());
+                       serviceVersionInfoDbObj.setTagVersion(1L);
+                       serviceVersionInfoDbObj.setTagUpdateTime(new Date());
+
+                       serviceVersionInfoDao.create(serviceVersionInfoDbObj);
+               }
+       }
+
        private XXPolicyItem createNewPolicyItemForPolicy(RangerPolicy policy, 
XXPolicy xPolicy, RangerPolicyItem policyItem, XXServiceDef xServiceDef, int 
itemOrder, int policyItemType) throws Exception {
                XXPolicyItem xPolicyItem = new XXPolicyItem();
 
@@ -3308,52 +3313,31 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                boolean isTagServiceDef = 
StringUtils.equals(serviceDef.getName(), 
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME);
 
                XXServiceDao serviceDao = daoMgr.getXXService();
-               XXServiceVersionInfoDao serviceVersionInfoDao = 
daoMgr.getXXServiceVersionInfo();
 
                List<XXService> services = 
serviceDao.findByServiceDefId(serviceDef.getId());
 
                if(CollectionUtils.isNotEmpty(services)) {
                        for(XXService service : services) {
-                               XXServiceVersionInfo serviceVersionInfo = 
serviceVersionInfoDao.findByServiceId(service.getId());
-                               if (serviceVersionInfo != null) {
-                                       
serviceVersionInfo.setPolicyVersion(getNextVersion(serviceVersionInfo.getPolicyVersion()));
-                                       
serviceVersionInfo.setPolicyUpdateTime(serviceDef.getUpdateTime());
-
-                                       
serviceVersionInfoDao.update(serviceVersionInfo);
-                               } else {
-                                       
LOG.warn("updateServicesForServiceDefUpdate(service=" + service.getName() + "): 
serviceVersionInfo not found, creating it..");
-                                       serviceVersionInfo = new 
XXServiceVersionInfo();
-                                       
serviceVersionInfo.setServiceId(service.getId());
-                                       
serviceVersionInfo.setPolicyVersion(getNextVersion(service.getPolicyVersion()));
-                                       
serviceVersionInfo.setTagVersion(service.getTagVersion());
-                                       
serviceVersionInfo.setPolicyUpdateTime(new Date());
-                                       
serviceVersionInfo.setTagUpdateTime(service.getTagUpdateTime());
-
-                                       
serviceVersionInfoDao.create(serviceVersionInfo);
-                               }
+                               Runnable commitWork = new Runnable() {
+                                       @Override
+                                       public void run() {
+                                               persistVersionChange(daoMgr, 
service.getId(), VERSION_TYPE.POLICY_VERSION);
+                                       }
+                               };
+                               
transactionSynchronizationAdapter.executeOnTransactionCommit(commitWork);
 
                                if(isTagServiceDef) {
                                        List<XXService> referrringServices = 
serviceDao.findByTagServiceId(service.getId());
 
                                        
if(CollectionUtils.isNotEmpty(referrringServices)) {
                                                for(XXService referringService 
: referrringServices) {
-                                                       serviceVersionInfo = 
serviceVersionInfoDao.findByServiceId(referringService.getId());
-                                                       if (serviceVersionInfo 
!= null) {
-                                                               
serviceVersionInfo.setPolicyVersion(getNextVersion(serviceVersionInfo.getPolicyVersion()));
-                                                               
serviceVersionInfo.setPolicyUpdateTime(serviceDef.getUpdateTime());
-
-                                                               
serviceVersionInfoDao.update(serviceVersionInfo);
-                                                       } else {
-                                                               
LOG.warn("updateServicesForServiceDefUpdate(service=" + 
referringService.getName() + "): serviceVersionInfo not found, creating it..");
-                                                               
serviceVersionInfo = new XXServiceVersionInfo();
-                                                               
serviceVersionInfo.setServiceId(referringService.getId());
-                                                               
serviceVersionInfo.setPolicyVersion(getNextVersion(referringService.getPolicyVersion()));
-                                                               
serviceVersionInfo.setTagVersion(referringService.getTagVersion());
-                                                               
serviceVersionInfo.setPolicyUpdateTime(new Date());
-                                                               
serviceVersionInfo.setTagUpdateTime(referringService.getTagUpdateTime());
-
-                                                               
serviceVersionInfoDao.create(serviceVersionInfo);
-                                                       }
+                                                       commitWork = new 
Runnable() {
+                                                               @Override
+                                                               public void 
run() {
+                                                                       
persistVersionChange(daoMgr, referringService.getId(), 
VERSION_TYPE.POLICY_VERSION);
+                                                               }
+                                                       };
+                                                       
transactionSynchronizationAdapter.executeOnTransactionCommit(commitWork);
                                                }
                                        }
                                }

http://git-wip-us.apache.org/repos/asf/ranger/blob/fbcaaaf6/security-admin/src/main/java/org/apache/ranger/common/db/RangerTransactionSynchronizationAdapter.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/common/db/RangerTransactionSynchronizationAdapter.java
 
b/security-admin/src/main/java/org/apache/ranger/common/db/RangerTransactionSynchronizationAdapter.java
index 2a62fb4..536ca29 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/common/db/RangerTransactionSynchronizationAdapter.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/common/db/RangerTransactionSynchronizationAdapter.java
@@ -22,6 +22,7 @@ package org.apache.ranger.common.db;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -46,6 +47,7 @@ public class RangerTransactionSynchronizationAdapter extends 
TransactionSynchron
     private static final Log LOG = 
LogFactory.getLog(RangerTransactionSynchronizationAdapter.class);
 
     private static final ThreadLocal<List<Runnable>> RUNNABLES = new 
ThreadLocal<List<Runnable>>();
+    private static final ThreadLocal<List<Runnable>> RUNNABLES_AFTER_COMMIT = 
new ThreadLocal<List<Runnable>>();
 
     public void executeOnTransactionCompletion(Runnable runnable) {
         if (LOG.isDebugEnabled()) {
@@ -64,7 +66,7 @@ public class RangerTransactionSynchronizationAdapter extends 
TransactionSynchron
         TransactionSynchronizationAdapter
         */
 
-        if (!TransactionSynchronizationManager.isSynchronizationActive()) {
+        if (!registerSynchronization()) {
             LOG.info("Transaction synchronization is NOT ACTIVE. Executing 
right now runnable {" + runnable + "}");
             runnable.run();
             return;
@@ -73,9 +75,36 @@ public class RangerTransactionSynchronizationAdapter extends 
TransactionSynchron
         if (threadRunnables == null) {
             threadRunnables = new ArrayList<Runnable>();
             RUNNABLES.set(threadRunnables);
-            // Register a new transaction synchronization for the current 
thread.
-            // TransactionSynchronizationManage will call afterCompletion() 
when current transaction completes.
-            TransactionSynchronizationManager.registerSynchronization(this);
+        }
+        threadRunnables.add(runnable);
+    }
+
+    public void executeOnTransactionCommit(Runnable runnable) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Submitting new runnable {" + runnable + "} to run after 
transaction is committed");
+        }
+
+        /*
+        From TransactionSynchronizationManager documentation:
+        TransactionSynchronizationManager is a central helper that manages 
resources and transaction synchronizations per thread.
+        Resource management code should only register synchronizations when 
this manager is active,
+        which can be checked via isSynchronizationActive(); it should perform 
immediate resource cleanup else.
+        If transaction synchronization isn't active, there is either no 
current transaction,
+        or the transaction manager doesn't support transaction synchronization.
+
+        Note: Synchronization is an Interface for transaction synchronization 
callbacks which is implemented by
+        TransactionSynchronizationAdapter
+        */
+
+        if (!registerSynchronization()) {
+            LOG.info("Transaction synchronization is NOT ACTIVE. Executing 
right now runnable {" + runnable + "}");
+            runnable.run();
+            return;
+        }
+        List<Runnable> threadRunnables = RUNNABLES_AFTER_COMMIT.get();
+        if (threadRunnables == null) {
+            threadRunnables = new ArrayList<Runnable>();
+            RUNNABLES_AFTER_COMMIT.set(threadRunnables);
         }
         threadRunnables.add(runnable);
     }
@@ -83,48 +112,93 @@ public class RangerTransactionSynchronizationAdapter 
extends TransactionSynchron
     @Override
     public void afterCompletion(int status) {
         if (LOG.isDebugEnabled()) {
-            LOG.debug("Transaction completed with status {" + (status == 
STATUS_COMMITTED ? "COMMITTED" : "ROLLED_BACK") + "}");
+            LOG.debug("==> 
RangerTransactionSynchronizationAdapter.afterCompletion(status=" + (status == 
STATUS_COMMITTED ? "COMMITTED" : "ROLLED_BACK") + ")");
         }
-        /* Thread runnables are expected to be executed only when the status 
is STATUS_ROLLED_BACK. Currently, executeOnTransactionCompletion()
-         * is called only for those changes that are going to be rolled-back 
by TransactionSynchronizationManager - such
-         * as when the operation returns HttpServletResponse.SC_NOT_MODIFIED 
status.
-         */
-        //if (status == STATUS_ROLLED_BACK) {
-            final List<Runnable> threadRunnables = RUNNABLES.get();
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Transaction completed, executing {" + 
threadRunnables.size() + "} runnables");
+
+        List<Runnable> allRunnables = null;
+
+        if (status == STATUS_COMMITTED) {
+            final List<Runnable> postCommitRunnables = 
RUNNABLES_AFTER_COMMIT.get();
+            if (CollectionUtils.isNotEmpty(postCommitRunnables)) {
+                allRunnables = postCommitRunnables;
             }
-            if (threadRunnables != null) {
-                try {
-                    //Create new  transaction
-                    TransactionTemplate txTemplate = new 
TransactionTemplate(txManager);
-                    
txTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
-
-                    txTemplate.execute(new TransactionCallback<Object>() {
-                        public Object doInTransaction(TransactionStatus 
status) {
-                            for (Runnable runnable : threadRunnables) {
-                                if (LOG.isDebugEnabled()) {
-                                    LOG.debug("Executing runnable {" + 
runnable + "}");
-                                }
-                                try {
-                                    runnable.run();
-                                } catch (RuntimeException e) {
-                                    LOG.error("Failed to execute runnable " + 
runnable, e);
-                                    break;
-                                }
-                            }
+        }
 
-                            return null;
-                        }
-                    });
-                } catch (Exception e) {
-                    LOG.error("Failed to commit TransactionService 
transaction", e);
-                    LOG.error("Ignoring...");
-                }
+        final List<Runnable> postCompletionRunnables = RUNNABLES.get();
+
+        if (CollectionUtils.isNotEmpty(postCompletionRunnables)) {
+            if (allRunnables == null) {
+                allRunnables = postCompletionRunnables;
+            } else {
+                allRunnables.addAll(postCompletionRunnables);
             }
+        }
 
-        //}
+        runRunnables(allRunnables);
+
+        RUNNABLES_AFTER_COMMIT.remove();
         RUNNABLES.remove();
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== 
RangerTransactionSynchronizationAdapter.afterCompletion(status=" + (status == 
STATUS_COMMITTED ? "COMMITTED" : "ROLLED_BACK") + ")");
+        }
     }
 
+    private boolean registerSynchronization() {
+        final boolean ret = 
TransactionSynchronizationManager.isSynchronizationActive();
+        if (ret) {
+            List<Runnable> threadRunnablesOnCompletion = RUNNABLES.get();
+            List<Runnable> threadRunnablesOnCommit = 
RUNNABLES_AFTER_COMMIT.get();
+            if (threadRunnablesOnCompletion == null && threadRunnablesOnCommit 
== null) {
+                
TransactionSynchronizationManager.registerSynchronization(this);
+            }
+        }
+        return ret;
+    }
+
+    private void runRunnables(final List<Runnable> runnables) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> 
RangerTransactionSynchronizationAdapter.runRunnables()");
+        }
+
+        if (runnables != null) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Executing {" + runnables.size() + "} runnables");
+            }
+            try {
+                //Create new  transaction
+                TransactionTemplate txTemplate = new 
TransactionTemplate(txManager);
+                
txTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
+
+                txTemplate.execute(new TransactionCallback<Object>() {
+                    public Object doInTransaction(TransactionStatus status) {
+                        for (Runnable runnable : runnables) {
+                            if (LOG.isDebugEnabled()) {
+                                LOG.debug("Executing runnable {" + runnable + 
"}");
+                            }
+                            try {
+                                runnable.run();
+                            } catch (RuntimeException e) {
+                                LOG.error("Failed to execute runnable " + 
runnable, e);
+                                break;
+                            }
+                        }
+
+                        return null;
+                    }
+                });
+            } catch (Exception e) {
+                LOG.error("Failed to commit TransactionService transaction", 
e);
+                LOG.error("Ignoring...");
+            }
+        } else {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("No runnables to execute");
+            }
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== 
RangerTransactionSynchronizationAdapter.runRunnables()");
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ranger/blob/fbcaaaf6/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManager.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManager.java 
b/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManager.java
index 2788a61..8c1cfd8 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManager.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManager.java
@@ -26,6 +26,7 @@ import javax.persistence.PersistenceContext;
 
 import org.apache.log4j.Logger;
 import org.apache.ranger.common.StringUtil;
+import org.apache.ranger.common.db.RangerTransactionSynchronizationAdapter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -42,6 +43,9 @@ public class RangerDaoManager extends RangerDaoManagerBase {
        @Autowired
        StringUtil stringUtil;
 
+       @Autowired
+       RangerTransactionSynchronizationAdapter 
transactionSynchronizationAdapter;
+
        @Override
        public EntityManager getEntityManager() {
                return em;
@@ -66,4 +70,8 @@ public class RangerDaoManager extends RangerDaoManagerBase {
                return stringUtil;
        }
 
+       public RangerTransactionSynchronizationAdapter 
getRangerTransactionSynchronizationAdapter() {
+               return transactionSynchronizationAdapter;
+       }
+
 }

http://git-wip-us.apache.org/repos/asf/ranger/blob/fbcaaaf6/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java 
b/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java
index da89e04..5dffc0e 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java
@@ -25,14 +25,8 @@
 
 import javax.persistence.EntityManager;
 
-import org.apache.ranger.common.RESTErrorUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-
-
 public abstract class RangerDaoManagerBase {
 
-       @Autowired
-       protected RESTErrorUtil restErrorUtil;
        abstract public EntityManager getEntityManager();
 
        public RangerDaoManagerBase() {

http://git-wip-us.apache.org/repos/asf/ranger/blob/fbcaaaf6/security-admin/src/main/java/org/apache/ranger/db/XXServiceVersionInfoDao.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/XXServiceVersionInfoDao.java
 
b/security-admin/src/main/java/org/apache/ranger/db/XXServiceVersionInfoDao.java
index e100329..d7e5a86 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/db/XXServiceVersionInfoDao.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/db/XXServiceVersionInfoDao.java
@@ -23,6 +23,7 @@ import java.util.List;
 import javax.persistence.NoResultException;
 
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.ranger.biz.ServiceDBStore;
 import org.apache.ranger.common.db.BaseDao;
 import org.apache.ranger.entity.XXServiceVersionInfo;
 import org.springframework.stereotype.Service;
@@ -31,6 +32,7 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class XXServiceVersionInfoDao extends BaseDao<XXServiceVersionInfo> {
+
        /**
         * Default Constructor
         */
@@ -122,14 +124,17 @@ public class XXServiceVersionInfoDao extends 
BaseDao<XXServiceVersionInfo> {
                }
 
                for(XXServiceVersionInfo serviceVersionInfo : 
serviceVersionInfos) {
-                       Long currentTagVersion = 
serviceVersionInfo.getTagVersion();
 
-                       if(currentTagVersion == null) {
-                               currentTagVersion = Long.valueOf(0);
-                       }
+                       Runnable commitWork = new Runnable() {
+                               @Override
+                               public void run() {
+                                       
ServiceDBStore.persistVersionChange(daoManager, serviceVersionInfo.getId(), 
ServiceDBStore.VERSION_TYPE.TAG_VERSION);
+                               }
+                       };
+
+                       
daoManager.getRangerTransactionSynchronizationAdapter().executeOnTransactionCommit(commitWork);
 
-                       serviceVersionInfo.setTagVersion(currentTagVersion + 1);
-                       serviceVersionInfo.setTagUpdateTime(updateTime);
                }
+
        }
 }

http://git-wip-us.apache.org/repos/asf/ranger/blob/fbcaaaf6/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java 
b/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
index bd474cc..c9db90a 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
@@ -30,6 +30,7 @@ import org.apache.ranger.common.RangerFactory;
 import org.apache.ranger.common.SearchCriteria;
 import org.apache.ranger.common.StringUtil;
 import org.apache.ranger.common.UserSessionBase;
+import org.apache.ranger.common.db.RangerTransactionSynchronizationAdapter;
 import org.apache.ranger.db.*;
 import org.apache.ranger.entity.*;
 import org.apache.ranger.plugin.model.RangerPolicy;
@@ -138,9 +139,10 @@ public class TestServiceDBStore {
        
        @Mock
        AssetMgr assetMgr;
-       
-       
-       
+
+       @Mock
+       RangerTransactionSynchronizationAdapter 
transactionSynchronizationAdapter;
+
        @Rule
        public ExpectedException thrown = ExpectedException.none();
 
@@ -1056,8 +1058,8 @@ public class TestServiceDBStore {
        public void test20updateService() throws Exception {
                XXServiceDao xServiceDao = Mockito.mock(XXServiceDao.class);
                XXService xService = Mockito.mock(XXService.class);
-               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
-               XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
+               //XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
+               //XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
                XXServiceConfigMapDao xServiceConfigMapDao = Mockito
                                .mock(XXServiceConfigMapDao.class);
                XXServiceConfigDefDao xServiceConfigDefDao = Mockito
@@ -1134,9 +1136,9 @@ public class TestServiceDBStore {
                
Mockito.when(svcService.getPopulatedViewObject(xService)).thenReturn(
                                rangerService);
 
-               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
-               
Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
-               
Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
+               
//Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
//Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
+               
//Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
 
                RangerService dbRangerService = serviceDBStore
                                .updateService(rangerService, options);
@@ -1159,8 +1161,8 @@ public class TestServiceDBStore {
                XXPolicyDao xPolicyDao = Mockito.mock(XXPolicyDao.class);
                XXServiceDao xServiceDao = Mockito.mock(XXServiceDao.class);
                XXService xService = Mockito.mock(XXService.class);
-               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
-               XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
+               //XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
+               //XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
                XXPolicyItemDao xPolicyItemDao = 
Mockito.mock(XXPolicyItemDao.class);
                XXPolicyItemDataMaskInfoDao xxPolicyItemDataMaskInfoDao = 
Mockito.mock(XXPolicyItemDataMaskInfoDao.class);
                XXPolicyItemRowFilterInfoDao xxPolicyItemRowFilterInfoDao = 
Mockito.mock(XXPolicyItemRowFilterInfoDao.class);
@@ -1327,9 +1329,9 @@ public class TestServiceDBStore {
                
Mockito.when(svcService.getPopulatedViewObject(xService)).thenReturn(
                                rangerService);
 
-               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
-               
Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
-               
Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
+               
//Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
//Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
+               
//Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
 
                
Mockito.when(daoManager.getXXPolicyItem()).thenReturn(xPolicyItemDao);
                Mockito.when(xPolicyItemDao.findByPolicyId(policyItem.getId()))
@@ -1524,9 +1526,9 @@ public class TestServiceDBStore {
                XXPolicy xPolicy = Mockito.mock(XXPolicy.class);
                XXPolicyDao xPolicyDao = Mockito.mock(XXPolicyDao.class);
                XXServiceDao xServiceDao = Mockito.mock(XXServiceDao.class);
-               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
+               //XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
                XXService xService = Mockito.mock(XXService.class);
-               XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
+               //XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
                XXPolicyItemDao xPolicyItemDao = 
Mockito.mock(XXPolicyItemDao.class);
 
                XXServiceDef xServiceDef = serviceDef();
@@ -1682,9 +1684,9 @@ public class TestServiceDBStore {
 
                Mockito.when(daoManager.getXXService()).thenReturn(xServiceDao);
                Mockito.when(xServiceDao.findByName(name)).thenReturn(xService);
-               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
-               
Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
-               
Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
+               
//Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
//Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
+               
//Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
 
                
Mockito.when(svcService.getPopulatedViewObject(xService)).thenReturn(
                                rangerService);
@@ -1763,6 +1765,9 @@ public class TestServiceDBStore {
                                .thenReturn(policyConditionDefObj);
                Mockito.when(!bizUtil.hasAccess(xService, 
null)).thenReturn(true);
 
+               //RangerTransactionSynchronizationAdapter spy = 
Mockito.spy(transactionSynchronizationAdapter);
+               
//Mockito.doNothing().when(spy).executeOnTransactionCommit(Mockito.any(Runnable.class));
+
                RangerPolicy dbRangerPolicy = 
serviceDBStore.createPolicy(rangerPolicy);
                Assert.assertNull(dbRangerPolicy);
                Assert.assertEquals(Id, rangerPolicy.getId());
@@ -1813,10 +1818,10 @@ public class TestServiceDBStore {
                XXServiceDao xServiceDao = Mockito.mock(XXServiceDao.class);
                 XXPolicyLabelMapDao xPolicyLabelMapDao = 
Mockito.mock(XXPolicyLabelMapDao.class);
                XXService xService = Mockito.mock(XXService.class);
-               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
+               //XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
                XXServiceDefDao xServiceDefDao = 
Mockito.mock(XXServiceDefDao.class);
                XXServiceDef xServiceDef = Mockito.mock(XXServiceDef.class);
-               XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
+               //XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
                XXPolicyResourceDao xPolicyResourceDao = Mockito
                                .mock(XXPolicyResourceDao.class);
                XXPolicyResourceMapDao xPolicyResourceMapDao = Mockito
@@ -1883,9 +1888,9 @@ public class TestServiceDBStore {
                
Mockito.when(svcService.getPopulatedViewObject(xService)).thenReturn(
                                rangerService);
 
-               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
-               
Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
-               
Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
+               
//Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
//Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
+               
//Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
 
                
Mockito.when(daoManager.getXXServiceDef()).thenReturn(xServiceDefDao);
                Mockito.when(xServiceDefDao.findByName(rangerService.getType()))
@@ -1960,8 +1965,8 @@ public class TestServiceDBStore {
                setup();
                XXServiceDao xServiceDao = Mockito.mock(XXServiceDao.class);
                XXService xService = Mockito.mock(XXService.class);
-               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
-               XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
+               //XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
+               //XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
                 XXPolicyLabelMapDao xPolicyLabelMapDao = 
Mockito.mock(XXPolicyLabelMapDao.class);
                XXPolicyItemDao xPolicyItemDao = 
Mockito.mock(XXPolicyItemDao.class);
                XXPolicyItemDataMaskInfoDao xPolicyItemDataMaskInfoDao = 
Mockito.mock(XXPolicyItemDataMaskInfoDao.class);
@@ -2136,9 +2141,9 @@ public class TestServiceDBStore {
                Mockito.when(daoManager.getXXService()).thenReturn(xServiceDao);
                Mockito.when(xServiceDao.getById(Id)).thenReturn(xService);
 
-               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
-               
Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
-               
Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
+               
//Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
//Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
+               
//Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
 
                Mockito.when(daoManager.getXXService()).thenReturn(xServiceDao);
                
Mockito.when(xServiceDao.getById(rangerService.getId())).thenReturn(
@@ -2150,6 +2155,9 @@ public class TestServiceDBStore {
                                 xPolicyLabelMapDao);
                 
Mockito.when(xPolicyLabelMapDao.findByPolicyId(rangerPolicy.getId()))
                                 .thenReturn(xxPolicyLabelMapList);
+               //RangerTransactionSynchronizationAdapter spy = 
Mockito.spy(transactionSynchronizationAdapter);
+               
//Mockito.doNothing().when(spy).executeOnTransactionCommit(Mockito.any(Runnable.class));
+
 
                serviceDBStore.deletePolicy(Id);
        }

Reply via email to