diff --git a/server/src/com/cloud/maid/StackMaid.java b/server/src/com/cloud/maid/StackMaid.java index b89e97e01b6..3739b3c84e3 100644 --- a/server/src/com/cloud/maid/StackMaid.java +++ b/server/src/com/cloud/maid/StackMaid.java @@ -66,6 +66,11 @@ public class StackMaid { pop(msid_setby_manager, savePoint); } + public void pop() { + if(currentSeq > 0) + pop(currentSeq -1); + } + /** * must be called within thread context * @param currentMsid @@ -78,12 +83,6 @@ public class StackMaid { } public void exitCleanup() { -/* - assert(msid_setby_manager != 0) : "Fatal, make sure StackMaidManager is loaded"; - if(msid_setby_manager == 0) - s_logger.error("Fatal, make sure StackMaidManager is loaded"); -*/ - exitCleanup(msid_setby_manager); } diff --git a/server/src/com/cloud/maid/StackMaidManagerImpl.java b/server/src/com/cloud/maid/StackMaidManagerImpl.java index 073244dcd32..ab92cb2eaa6 100644 --- a/server/src/com/cloud/maid/StackMaidManagerImpl.java +++ b/server/src/com/cloud/maid/StackMaidManagerImpl.java @@ -76,7 +76,7 @@ public class StackMaidManagerImpl implements StackMaidManager { public void reallyRun() { try { - Date cutTime = new Date(DateUtil.currentGMTTime().getTime() - 3600000); + Date cutTime = new Date(DateUtil.currentGMTTime().getTime() - 7200000); List l = _maidDao.listLeftoversByCutTime(cutTime); cleanupLeftovers(l); } catch(Throwable e) { diff --git a/server/src/com/cloud/maid/dao/StackMaidDaoImpl.java b/server/src/com/cloud/maid/dao/StackMaidDaoImpl.java index e7d8d6936f6..0a4c3f2d73c 100644 --- a/server/src/com/cloud/maid/dao/StackMaidDaoImpl.java +++ b/server/src/com/cloud/maid/dao/StackMaidDaoImpl.java @@ -40,39 +40,55 @@ public class StackMaidDaoImpl extends GenericDaoBase implemen @DB public void pushCleanupDelegate(long msid, int seq, String delegateClzName, Object context) { - StackMaidVO delegateItem = new StackMaidVO(); - delegateItem.setMsid(msid); - delegateItem.setThreadId(Thread.currentThread().getId()); - delegateItem.setSeq(seq); - delegateItem.setDelegate(delegateClzName); - delegateItem.setContext(SerializerHelper.toSerializedStringOld(context)); - delegateItem.setCreated(DateUtil.currentGMTTime()); - - super.persist(delegateItem); + + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + try { + StackMaidVO delegateItem = new StackMaidVO(); + delegateItem.setMsid(msid); + delegateItem.setThreadId(Thread.currentThread().getId()); + delegateItem.setSeq(seq); + delegateItem.setDelegate(delegateClzName); + delegateItem.setContext(SerializerHelper.toSerializedStringOld(context)); + delegateItem.setCreated(DateUtil.currentGMTTime()); + + super.persist(delegateItem); + } finally { + txn.close(); + } } @DB public StackMaidVO popCleanupDelegate(long msid) { - SearchCriteria sc = popSearch.create(); - sc.setParameters("msid", msid); - sc.setParameters("threadId", Thread.currentThread().getId()); - - Filter filter = new Filter(StackMaidVO.class, "seq", false, 0L, (long)1); - List l = listIncludingRemovedBy(sc, filter); - if(l != null && l.size() > 0) { - expunge(l.get(0).getId()); - return l.get(0); - } + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + try { + SearchCriteria sc = popSearch.create(); + sc.setParameters("msid", msid); + sc.setParameters("threadId", Thread.currentThread().getId()); + + Filter filter = new Filter(StackMaidVO.class, "seq", false, 0L, (long)1); + List l = listIncludingRemovedBy(sc, filter); + if(l != null && l.size() > 0) { + expunge(l.get(0).getId()); + return l.get(0); + } + } finally { + txn.close(); + } return null; } @DB public void clearStack(long msid) { - SearchCriteria sc = clearSearch.create(); - sc.setParameters("msid", msid); - - expunge(sc); + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + try { + SearchCriteria sc = clearSearch.create(); + sc.setParameters("msid", msid); + + expunge(sc); + } finally { + txn.close(); + } } @DB @@ -80,7 +96,7 @@ public class StackMaidDaoImpl extends GenericDaoBase implemen List l = new ArrayList(); String sql = "select * from stack_maid where msid=? order by msid asc, thread_id asc, seq desc"; - Transaction txn = Transaction.currentTxn();; + Transaction txn = Transaction.open(Transaction.CLOUD_DB); PreparedStatement pstmt = null; try { pstmt = txn.prepareAutoCloseStatement(sql); @@ -94,6 +110,8 @@ public class StackMaidDaoImpl extends GenericDaoBase implemen s_logger.error("unexcpected exception " + e.getMessage(), e); } catch (Throwable e) { s_logger.error("unexcpected exception " + e.getMessage(), e); + } finally { + txn.close(); } return l; } @@ -104,7 +122,7 @@ public class StackMaidDaoImpl extends GenericDaoBase implemen List l = new ArrayList(); String sql = "select * from stack_maid where created < ? order by msid asc, thread_id asc, seq desc"; - Transaction txn = Transaction.currentTxn();; + Transaction txn = Transaction.open(Transaction.CLOUD_DB); PreparedStatement pstmt = null; try { pstmt = txn.prepareAutoCloseStatement(sql); @@ -119,6 +137,8 @@ public class StackMaidDaoImpl extends GenericDaoBase implemen s_logger.error("unexcpected exception " + e.getMessage(), e); } catch (Throwable e) { s_logger.error("unexcpected exception " + e.getMessage(), e); + } finally { + txn.close(); } return l; } diff --git a/utils/src/com/cloud/utils/db/Transaction.java b/utils/src/com/cloud/utils/db/Transaction.java index 96c0532612b..a641fd86284 100755 --- a/utils/src/com/cloud/utils/db/Transaction.java +++ b/utils/src/com/cloud/utils/db/Transaction.java @@ -88,7 +88,9 @@ public class Transaction { public static Transaction currentTxn() { Transaction txn = tls.get(); assert txn != null : "No Transaction on stack. Did you mark the method with @DB?"; - assert checkAnnotation(3, txn) : "Did you even read the guide to use Transaction...IOW...other people's code? Try method can't be private. What about @DB? hmmm... could that be it? " + txn.toString(); + + // loosen the requirement to let people use explicit transaction management (i.e., in Unit tests) + // assert checkAnnotation(3, txn) : "Did you even read the guide to use Transaction...IOW...other people's code? Try method can't be private. What about @DB? hmmm... could that be it? " + txn.toString(); return txn; }