Fix for ALF-10326 - AVMToADMRemoteStorePatch fails with Duplicate child name not allowed: surf-config

- since fix for ALF-10280 rev 30468 a DuplicateChildNodeNameException no longer automatically retries in the txn - now throw out an exception that does retry instead.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@30533 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2011-09-15 10:14:19 +00:00
parent e23edd49d4
commit 127ca27aa0

View File

@@ -51,6 +51,7 @@ import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.DuplicateChildNodeNameException;
import org.alfresco.service.cmr.repository.InvalidNodeRefException; import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.site.SiteInfo; import org.alfresco.service.cmr.site.SiteInfo;
@@ -60,6 +61,7 @@ import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair; import org.alfresco.util.Pair;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.dao.ConcurrencyFailureException;
import org.springframework.extensions.surf.util.I18NUtil; import org.springframework.extensions.surf.util.I18NUtil;
import org.springframework.extensions.surf.util.URLDecoder; import org.springframework.extensions.surf.util.URLDecoder;
@@ -359,47 +361,57 @@ public class AVMToADMRemoteStorePatch extends AbstractPatch
} }
NodeRef surfConfigRef; NodeRef surfConfigRef;
if (siteName != null) try
{ {
if (debug) logger.debug("...resolved site id: " + siteName); if (siteName != null)
NodeRef siteRef = null;
String key = AlfrescoTransactionSupport.getTransactionId() + siteName;
Pair<NodeRef, NodeRef> refCache = siteReferenceCache.get(key);
if (refCache == null)
{ {
refCache = new Pair<NodeRef, NodeRef>(null, null); if (debug) logger.debug("...resolved site id: " + siteName);
siteReferenceCache.put(key, refCache); NodeRef siteRef = null;
} String key = AlfrescoTransactionSupport.getTransactionId() + siteName;
siteRef = refCache.getFirst(); Pair<NodeRef, NodeRef> refCache = siteReferenceCache.get(key);
if (siteRef == null) if (refCache == null)
{
siteRef = getSiteNodeRef(siteName);
refCache.setFirst(siteRef);
}
if (siteRef != null)
{
surfConfigRef = refCache.getSecond();
if (surfConfigRef == null)
{ {
surfConfigRef = getSurfConfigNodeRef(siteRef); refCache = new Pair<NodeRef, NodeRef>(null, null);
refCache.setSecond(surfConfigRef); siteReferenceCache.put(key, refCache);
} }
siteRef = refCache.getFirst();
if (siteRef == null)
{
siteRef = getSiteNodeRef(siteName);
refCache.setFirst(siteRef);
}
if (siteRef != null)
{
surfConfigRef = refCache.getSecond();
if (surfConfigRef == null)
{
surfConfigRef = getSurfConfigNodeRef(siteRef);
refCache.setSecond(surfConfigRef);
}
}
else
{
logger.info("WARNING: unable to migrate path as site id cannot be found: " + siteName);
return;
}
}
else if (userId != null)
{
if (debug) logger.debug("...resolved user id: " + userId);
surfConfigRef = this.surfConfigRef;
} }
else else
{ {
logger.info("WARNING: unable to migrate path as site id cannot be found: " + siteName); if (debug) logger.debug("...resolved generic path.");
return; surfConfigRef = this.surfConfigRef;
} }
} }
else if (userId != null) catch (ConcurrencyFailureException conErr)
{ {
if (debug) logger.debug("...resolved user id: " + userId); logger.warn("Unable to create folder: surf-config for path: " + avmNode.getPath() +
surfConfigRef = this.surfConfigRef; " - as another txn is busy, will retry later.");
} retryPaths.put(avmNode.getPath(), avmNode);
else return;
{
if (debug) logger.debug("...resolved generic path.");
surfConfigRef = this.surfConfigRef;
} }
// ensure folders exist down to the specified parent // ensure folders exist down to the specified parent
@@ -508,9 +520,19 @@ public class AVMToADMRemoteStorePatch extends AbstractPatch
QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, SURF_CONFIG); QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, SURF_CONFIG);
Map<QName, Serializable> properties = new HashMap<QName, Serializable>(1, 1.0f); Map<QName, Serializable> properties = new HashMap<QName, Serializable>(1, 1.0f);
properties.put(ContentModel.PROP_NAME, (Serializable) SURF_CONFIG); properties.put(ContentModel.PROP_NAME, (Serializable) SURF_CONFIG);
ChildAssociationRef ref = this.nodeService.createNode( try
rootRef, ContentModel.ASSOC_CONTAINS, assocQName, ContentModel.TYPE_FOLDER, properties); {
surfConfigRef = ref.getChildRef(); ChildAssociationRef ref = this.nodeService.createNode(
rootRef, ContentModel.ASSOC_CONTAINS, assocQName, ContentModel.TYPE_FOLDER, properties);
surfConfigRef = ref.getChildRef();
}
catch (DuplicateChildNodeNameException dupErr)
{
// This exception is excepted in multi-threaded creation scenarios - but since fix for
// ALF-10280 rev 30468 - it no longer automatically retries in the txn - therefore we
// throw out an exception that does retry instead.
throw new ConcurrencyFailureException("Forcing batch retry due to DuplicateChildNodeNameException" , dupErr);
}
} }
return surfConfigRef; return surfConfigRef;
} }