mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-10-22 15:12:38 +00:00
REPO-1012 : DB builds: Fix a batch of tests that (regularly) fail on SQL Server
- adding retrying transactions for the propertyValueDAO.cleanupUnusedValues() method calls as MS SQL is slow and has problems coping with other threads updating the alf_prop_ tables - changed the order of the tests to help reduce other tests failing because of these clean up tests git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@129495 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -60,13 +60,17 @@ import org.junit.runners.Suite;
|
|||||||
LocaleDAOTest.class,
|
LocaleDAOTest.class,
|
||||||
QNameDAOTest.class,
|
QNameDAOTest.class,
|
||||||
PropertyValueDAOTest.class,
|
PropertyValueDAOTest.class,
|
||||||
PropertyValueCleanupTest.class,
|
|
||||||
AuditDAOTest.class,
|
|
||||||
AppliedPatchDAOTest.class,
|
AppliedPatchDAOTest.class,
|
||||||
AclCrudDAOTest.class,
|
AclCrudDAOTest.class,
|
||||||
UsageDAOTest.class,
|
UsageDAOTest.class,
|
||||||
SOLRDAOTest.class,
|
SOLRDAOTest.class,
|
||||||
TenantAdminDAOTest.class,
|
TenantAdminDAOTest.class,
|
||||||
|
// REOPO-1012 : run AuditDAOTest and PropertyValueCleanupTest near the end
|
||||||
|
// because their failure can cause other tests to fail on MS SQL
|
||||||
|
// AuditDAOTest fails if it runs after CannedQueryDAOTest so this order is a compromise
|
||||||
|
// CannedQueryDAOTest will fail on MS SQL if either AuditDAOTest or PropertyValueCleanupTest fail
|
||||||
|
PropertyValueCleanupTest.class,
|
||||||
|
AuditDAOTest.class,
|
||||||
CannedQueryDAOTest.class
|
CannedQueryDAOTest.class
|
||||||
})
|
})
|
||||||
public class DomainTestSuite
|
public class DomainTestSuite
|
||||||
|
|||||||
@@ -804,8 +804,6 @@ public class AuditDAOTest extends TestCase
|
|||||||
txn.commit();
|
txn.commit();
|
||||||
System.out.println("Created values for " + i + " entries in " + (System.currentTimeMillis() - startCreate) + " ms.");
|
System.out.println("Created values for " + i + " entries in " + (System.currentTimeMillis() - startCreate) + " ms.");
|
||||||
|
|
||||||
txn = transactionService.getUserTransaction();
|
|
||||||
txn.begin();
|
|
||||||
if (!performance)
|
if (!performance)
|
||||||
{
|
{
|
||||||
// Check there are some persisted values to delete.
|
// Check there are some persisted values to delete.
|
||||||
@@ -827,8 +825,18 @@ public class AuditDAOTest extends TestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
long startDelete = System.currentTimeMillis();
|
long startDelete = System.currentTimeMillis();
|
||||||
propertyValueDAO.cleanupUnusedValues();
|
RetryingTransactionCallback<Void> callback = new RetryingTransactionCallback<Void>()
|
||||||
txn.commit();
|
{
|
||||||
|
public Void execute() throws Throwable
|
||||||
|
{
|
||||||
|
propertyValueDAO.cleanupUnusedValues();
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// use a new transaction so it will retry in that transaction
|
||||||
|
txnHelper.doInTransaction(callback,false,true);
|
||||||
|
|
||||||
System.out.println("Cleaned values for " + i + " entries in " + (System.currentTimeMillis() - startDelete) + " ms.");
|
System.out.println("Cleaned values for " + i + " entries in " + (System.currentTimeMillis() - startDelete) + " ms.");
|
||||||
|
|
||||||
if (!performance)
|
if (!performance)
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import java.util.UUID;
|
|||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
||||||
|
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
||||||
import org.alfresco.service.cmr.attributes.AttributeService;
|
import org.alfresco.service.cmr.attributes.AttributeService;
|
||||||
import org.alfresco.service.transaction.TransactionService;
|
import org.alfresco.service.transaction.TransactionService;
|
||||||
import org.alfresco.test_category.OwnJVMTestsCategory;
|
import org.alfresco.test_category.OwnJVMTestsCategory;
|
||||||
@@ -60,15 +61,12 @@ public class PropertyValueCleanupTest
|
|||||||
|
|
||||||
private TransactionService transactionService;
|
private TransactionService transactionService;
|
||||||
private AttributeService attributeService;
|
private AttributeService attributeService;
|
||||||
private RetryingTransactionHelper txnHelper;
|
|
||||||
private PropertyValueDAO propertyValueDAO;
|
private PropertyValueDAO propertyValueDAO;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() throws Exception
|
public void setUp() throws Exception
|
||||||
{
|
{
|
||||||
transactionService = (TransactionService) ctx.getBean("TransactionService");
|
transactionService = (TransactionService) ctx.getBean("TransactionService");
|
||||||
txnHelper = transactionService.getRetryingTransactionHelper();
|
|
||||||
txnHelper.setMaxRetries(0);
|
|
||||||
|
|
||||||
attributeService = (AttributeService) ctx.getBean("AttributeService");
|
attributeService = (AttributeService) ctx.getBean("AttributeService");
|
||||||
propertyValueDAO = (PropertyValueDAO) ctx.getBean("propertyValueDAO");
|
propertyValueDAO = (PropertyValueDAO) ctx.getBean("propertyValueDAO");
|
||||||
@@ -103,31 +101,48 @@ public class PropertyValueCleanupTest
|
|||||||
// Start threads that throw stuff into the AttributeService
|
// Start threads that throw stuff into the AttributeService
|
||||||
ThreadGroup threadGroup = new ThreadGroup("testRapidCreationDuringCleanup");
|
ThreadGroup threadGroup = new ThreadGroup("testRapidCreationDuringCleanup");
|
||||||
InsertSerializableAttributes[] runnables = new InsertSerializableAttributes[2];
|
InsertSerializableAttributes[] runnables = new InsertSerializableAttributes[2];
|
||||||
for (int i = 0; i < runnables.length; i++)
|
|
||||||
|
try
|
||||||
{
|
{
|
||||||
// Runnable
|
for (int i = 0; i < runnables.length; i++)
|
||||||
runnables[i] = new InsertSerializableAttributes();
|
{
|
||||||
// Put it in a thread
|
// Runnable
|
||||||
String threadName = "" + i;
|
runnables[i] = new InsertSerializableAttributes();
|
||||||
Thread thread = new Thread(threadGroup, runnables[i], threadName);
|
// Put it in a thread
|
||||||
thread.setDaemon(true); // Precautionary
|
String threadName = "" + i;
|
||||||
// Start it
|
Thread thread = new Thread(threadGroup, runnables[i], threadName);
|
||||||
thread.start();
|
thread.setDaemon(true); // Precautionary
|
||||||
|
// Start it
|
||||||
|
thread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait a bit for data to really get in there
|
||||||
|
wait(1000L);
|
||||||
|
|
||||||
|
RetryingTransactionHelper txnHelper = transactionService.getRetryingTransactionHelper();
|
||||||
|
// do it in a retrying transaction because there may be other threads modifying
|
||||||
|
// the alf_prop_* and therefore the cleanup may fail sometimes
|
||||||
|
RetryingTransactionCallback<Void> callback = new RetryingTransactionCallback<Void>()
|
||||||
|
{
|
||||||
|
public Void execute() throws Throwable
|
||||||
|
{
|
||||||
|
// Now run the cleanup script
|
||||||
|
propertyValueDAO.cleanupUnusedValues();
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
txnHelper.doInTransaction(callback);
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
// Wait a bit for data to really get in there
|
|
||||||
wait(1000L);
|
|
||||||
|
|
||||||
// Now run the cleanup script
|
|
||||||
propertyValueDAO.cleanupUnusedValues();
|
|
||||||
|
|
||||||
// Stop the threads
|
|
||||||
for (int i = 0; i < runnables.length; i++)
|
|
||||||
{
|
{
|
||||||
// Runnable
|
// Make sure we stop the Daemons
|
||||||
runnables[i].running.set(false);
|
for (int i = 0; i < runnables.length; i++)
|
||||||
|
{
|
||||||
|
// Runnable
|
||||||
|
runnables[i].running.set(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear any caches
|
// Clear any caches
|
||||||
clearCaches();
|
clearCaches();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user