mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merged V3.0 to HEAD
12140: Merged V2.2 to V3.0 11732: Fixed ETWOTWO-804: Node and Transaction Cleanup Job 11747: Missed config for Node and Txn purging 11826: WCM - fix ETWOTWO-817 11951: Fixed ETWOTWO-901: NodeService cleanup must be pluggable 11961: Merged V2.1 to V2.2 11561: ETWOONE-224: when renaming duplicates during copy association names where not renamed 11583: (ALREADY PRESENT) Updated NTLM config example in web.xml - adding missing servlet mappings 11584: Fix for ETWOONE-209 - JavaScript People.createGroup() API now correctly checks for actual group name when testing for existence 11585: Fix for ETWOONE-214 - View In CIFS link now works even when users des not have view permissions on the parent folder 11612: Fix for ETWOONE-91: the description textarea in the modify space properties web form eats one leading newline each time it is submitted 11613: Fix 2.1 build and adjust implementation of ETWOONE-224 fix 11621: Fix for ETWOONE-343 11669: Improved debug from index tracking when exceptions occur 12141: Avoid annoying Spring WARN messages for ClientAbortException 12143: File that should have been deleted in CHK-5460 (rev 12140) 12177: Fix failing FS Deployment Tests since introduction of transaction check advice. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@12507 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -42,6 +42,7 @@ import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.repo.domain.Node;
|
||||
import org.alfresco.repo.node.AbstractNodeServiceImpl;
|
||||
import org.alfresco.repo.node.StoreArchiveMap;
|
||||
import org.alfresco.repo.node.cleanup.AbstractNodeCleanupWorker;
|
||||
import org.alfresco.repo.node.db.NodeDaoService.NodeRefQueryCallback;
|
||||
import org.alfresco.repo.node.index.NodeIndexer;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
@@ -185,7 +186,12 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
public List<StoreRef> getStores()
|
||||
{
|
||||
// Get the ADM stores
|
||||
List<StoreRef> storeRefs = nodeDaoService.getStoreRefs();
|
||||
List<Pair<Long, StoreRef>> stores = nodeDaoService.getStores();
|
||||
List<StoreRef> storeRefs = new ArrayList<StoreRef>(50);
|
||||
for (Pair<Long, StoreRef> pair : stores)
|
||||
{
|
||||
storeRefs.add(pair.getSecond());
|
||||
}
|
||||
// Now get the AVMStores.
|
||||
List<StoreRef> avmStores = avmNodeService.getStores();
|
||||
storeRefs.addAll(avmStores);
|
||||
@@ -2059,7 +2065,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
}
|
||||
}
|
||||
|
||||
private void indexChildren(Pair<Long, NodeRef> nodePair, boolean cascade)
|
||||
public void indexChildren(Pair<Long, NodeRef> nodePair, boolean cascade)
|
||||
{
|
||||
Long nodeId = nodePair.getFirst();
|
||||
// Get the node's children, but only one's that aren't in the same store
|
||||
@@ -2162,21 +2168,29 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> cleanupImpl()
|
||||
public static class MoveChildrenToCorrectStore extends AbstractNodeCleanupWorker
|
||||
{
|
||||
List<String> moveChildrenResults = moveChildrenToCorrectStore();
|
||||
List<String> indexChildrenResults = indexChildrenWhereRequired();
|
||||
|
||||
List<String> allResults = new ArrayList<String>(100);
|
||||
allResults.addAll(moveChildrenResults);
|
||||
allResults.addAll(indexChildrenResults);
|
||||
|
||||
// Done
|
||||
return allResults;
|
||||
}
|
||||
@Override
|
||||
protected List<String> doCleanInternal() throws Throwable
|
||||
{
|
||||
return dbNodeService.moveChildrenToCorrectStore();
|
||||
}
|
||||
};
|
||||
|
||||
private List<String> moveChildrenToCorrectStore()
|
||||
{
|
||||
List<String> results = new ArrayList<String>(1000);
|
||||
// Repeat the process for each store
|
||||
List<Pair<Long, StoreRef>> storePairs = nodeDaoService.getStores();
|
||||
for (Pair<Long, StoreRef> storePair : storePairs)
|
||||
{
|
||||
List<String> storeResults = moveChildrenToCorrectStore(storePair.getFirst());
|
||||
results.addAll(storeResults);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
private List<String> moveChildrenToCorrectStore(final Long storeId)
|
||||
{
|
||||
final List<Pair<Long, NodeRef>> parentNodePairs = new ArrayList<Pair<Long, NodeRef>>(100);
|
||||
final NodeRefQueryCallback callback = new NodeRefQueryCallback()
|
||||
@@ -2191,7 +2205,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
{
|
||||
public Object execute() throws Throwable
|
||||
{
|
||||
nodeDaoService.getNodesWithChildrenInDifferentStores(Long.MIN_VALUE, 100, callback);
|
||||
nodeDaoService.getNodesWithChildrenInDifferentStore(storeId, Long.MIN_VALUE, 100, callback);
|
||||
// Done
|
||||
return null;
|
||||
}
|
||||
@@ -2226,11 +2240,19 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
catch (Throwable e)
|
||||
{
|
||||
String msg =
|
||||
"Failed to move child nodes to parent node's store: \n" +
|
||||
"Failed to move child nodes to parent node's store." +
|
||||
" Set log level to WARN for this class to get exception log: \n" +
|
||||
" Parent node: " + parentNodePair.getFirst() + "\n" +
|
||||
" Error: " + e.getMessage();
|
||||
// It failed, which is not an error to consider here
|
||||
logger.warn(msg, e);
|
||||
// It failed; do a full log in WARN mode
|
||||
if (logger.isWarnEnabled())
|
||||
{
|
||||
logger.warn(msg, e);
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.error(msg);
|
||||
}
|
||||
results.add(msg);
|
||||
}
|
||||
}
|
||||
@@ -2248,88 +2270,4 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
private List<String> indexChildrenWhereRequired()
|
||||
{
|
||||
final List<Pair<Long, NodeRef>> parentNodePairs = new ArrayList<Pair<Long, NodeRef>>(100);
|
||||
final NodeRefQueryCallback callback = new NodeRefQueryCallback()
|
||||
{
|
||||
public boolean handle(Pair<Long, NodeRef> nodePair)
|
||||
{
|
||||
parentNodePairs.add(nodePair);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
RetryingTransactionCallback<Object> getNodesCallback = new RetryingTransactionCallback<Object>()
|
||||
{
|
||||
public Object execute() throws Throwable
|
||||
{
|
||||
nodeDaoService.getNodesWithAspect(ContentModel.ASPECT_INDEX_CHILDREN, Long.MIN_VALUE, 100, callback);
|
||||
// Done
|
||||
return null;
|
||||
}
|
||||
};
|
||||
transactionService.getRetryingTransactionHelper().doInTransaction(getNodesCallback, true, true);
|
||||
// Process the nodes in random order
|
||||
Collections.shuffle(parentNodePairs);
|
||||
// Iterate and operate
|
||||
List<String> results = new ArrayList<String>(100);
|
||||
for (final Pair<Long, NodeRef> parentNodePair : parentNodePairs)
|
||||
{
|
||||
RetryingTransactionCallback<String> indexChildrenCallback = new RetryingTransactionCallback<String>()
|
||||
{
|
||||
public String execute() throws Throwable
|
||||
{
|
||||
// Index children without full cascade
|
||||
indexChildren(parentNodePair, true);
|
||||
// Done
|
||||
return null;
|
||||
}
|
||||
};
|
||||
RetryingTransactionHelper txnHelper = transactionService.getRetryingTransactionHelper();
|
||||
txnHelper.setMaxRetries(1);
|
||||
try
|
||||
{
|
||||
txnHelper.doInTransaction(indexChildrenCallback, false, true);
|
||||
String msg =
|
||||
"Indexed child nodes: \n" +
|
||||
" Parent node: " + parentNodePair.getFirst();
|
||||
results.add(msg);
|
||||
}
|
||||
catch (Throwable e)
|
||||
{
|
||||
String msg =
|
||||
"Failed to index child nodes: \n" +
|
||||
" Parent node: " + parentNodePair.getFirst() + "\n" +
|
||||
" Error: " + e.getMessage();
|
||||
// It failed, which is not an error to consider here
|
||||
logger.warn(msg, e);
|
||||
results.add(msg);
|
||||
}
|
||||
}
|
||||
// Done
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
StringBuilder sb = new StringBuilder(256);
|
||||
sb.append("Indexed child nodes: \n")
|
||||
.append(" Results:\n");
|
||||
for (String msg : results)
|
||||
{
|
||||
sb.append(" ").append(msg).append("\n");
|
||||
}
|
||||
logger.debug(sb.toString());
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleans up transactions and deleted nodes that are older than the given minimum age.
|
||||
*
|
||||
* @param minAge the minimum age of a transaction or deleted node
|
||||
* @return Returns log message results
|
||||
*/
|
||||
private List<String> cleanUpTransactions(long minAge)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user