Merged V2.1 to HEAD

6944: More hibernate session cache taming.
   6945: Times for commits are close to linear in the number of items submitted.
   6946: Missing break statement. (Courtesy of Jan).
   6948: Fixed session cache eviction problem triggered by resetLayer().
   6956: Wrapped AVMService and AttributeService in TransactionResourceInterceptor.
   Reverted log4j.properties


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@7368 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2007-11-12 23:18:09 +00:00
parent e3d5cececb
commit 209dd85a0d
23 changed files with 416 additions and 306 deletions

View File

@@ -4,7 +4,22 @@
<beans>
<bean id="attributeService" class="org.alfresco.repo.attributes.AttributeServiceImpl">
<bean id="attributeService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.alfresco.service.cmr.attributes.AttributeService</value>
</property>
<property name="target">
<ref bean="attributeServiceBase"/>
</property>
<property name="interceptorNames">
<list>
<value>sessionSizeResourceInterceptor</value>
</list>
</property>
</bean>
<bean id="attributeServiceBase" class="org.alfresco.repo.attributes.AttributeServiceImpl">
<property name="attributeConverter">
<ref bean="attributeConverter"/>
</property>

View File

@@ -97,6 +97,12 @@
</property>
</bean>
<bean id="sessionCacheChecker" class="org.alfresco.repo.avm.hibernate.SessionCacheChecker">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="avmDAOs" class="org.alfresco.repo.avm.AVMDAOs">
<property name="issuerDAO">
<ref bean="issuerDAO"/>

View File

@@ -185,7 +185,8 @@
<value>10000</value>
</property>
<property name="resourceManagerCallFrequencyMillis">
<value>5000</value>
<!-- Was 5000 -->
<value>1000</value>
</property>
</bean>
<bean id="sessionSizeResourceManager" class="org.alfresco.repo.domain.hibernate.SessionSizeResourceManager">
@@ -193,7 +194,8 @@
<ref bean="sessionFactory" />
</property>
<property name="threshold">
<value>5000</value>
<!-- Was 5000 -->
<value>100</value>
</property>
</bean>

View File

@@ -791,7 +791,21 @@
<!-- The AVMService -->
<bean id="avmService" class="org.alfresco.repo.avm.AVMServiceImpl">
<bean id="avmService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.alfresco.service.cmr.avm.AVMService</value>
</property>
<property name="target">
<ref bean="avmServiceBase"/>
</property>
<property name="interceptorNames">
<list>
<value>sessionSizeResourceInterceptor</value>
</list>
</property>
</bean>
<bean id="avmServiceBase" class="org.alfresco.repo.avm.AVMServiceImpl">
<property name="avmRepository">
<ref bean="avmRepository"/>
</property>

View File

@@ -25,7 +25,10 @@
package org.alfresco.repo.attributes;
import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.repo.avm.AVMDAOs;
/**
* Handles conversions between persistent and value based Attributes.
@@ -96,56 +99,78 @@ public class AttributeConverter
public Attribute toValue(Attribute from)
{
Attribute ret = null;
switch (from.getType())
{
case BOOLEAN :
{
return new BooleanAttributeValue((BooleanAttribute)from);
ret = new BooleanAttributeValue((BooleanAttribute)from);
break;
}
case BYTE :
{
return new ByteAttributeValue((ByteAttribute)from);
ret = new ByteAttributeValue((ByteAttribute)from);
break;
}
case SHORT :
{
return new ShortAttributeValue((ShortAttribute)from);
ret = new ShortAttributeValue((ShortAttribute)from);
break;
}
case INT :
{
return new IntAttributeValue((IntAttribute)from);
ret = new IntAttributeValue((IntAttribute)from);
break;
}
case LONG :
{
return new LongAttributeValue((LongAttribute)from);
ret = new LongAttributeValue((LongAttribute)from);
break;
}
case FLOAT :
{
return new FloatAttributeValue((FloatAttribute)from);
ret = new FloatAttributeValue((FloatAttribute)from);
break;
}
case DOUBLE :
{
return new DoubleAttributeValue((DoubleAttribute)from);
ret = new DoubleAttributeValue((DoubleAttribute)from);
break;
}
case STRING :
{
return new StringAttributeValue((StringAttribute)from);
ret = new StringAttributeValue((StringAttribute)from);
break;
}
case SERIALIZABLE :
{
return new SerializableAttributeValue((SerializableAttribute)from);
ret = new SerializableAttributeValue((SerializableAttribute)from);
break;
}
case MAP :
{
return new MapAttributeValue((MapAttribute)from);
ret = new MapAttributeValue();
for (Map.Entry<String, Attribute> entry : from.entrySet())
{
ret.put(entry.getKey(), toValue(entry.getValue()));
}
break;
}
case LIST :
{
return new ListAttributeValue((ListAttribute)from);
ret = new ListAttributeValue();
for (Attribute child : from)
{
ret.add(toValue(child));
}
break;
}
default :
{
throw new AlfrescoRuntimeException("Invalid Attribute Type: " + from.getType());
}
}
AVMDAOs.Instance().fAttributeDAO.evictFlat(from);
return ret;
}
}

View File

@@ -68,4 +68,15 @@ public interface AttributeDAO
* @param attr
*/
public void evict(Attribute attr);
/**
* Evict an Attribute non-recursively.
* @param attr
*/
public void evictFlat(Attribute attr);
/**
* Force a flush.
*/
public void flush();
}

View File

@@ -193,7 +193,6 @@ public class AttributeServiceImpl implements AttributeService
return null;
}
Attribute converted = fAttributeConverter.toValue(found);
fAttributeDAO.evict(found);
return converted;
}
@@ -255,7 +254,6 @@ public class AttributeServiceImpl implements AttributeService
}
Attribute converted = fAttributeConverter.toPersistent(value);
found.put(name, converted);
fAttributeDAO.evict(converted);
}
/* (non-Javadoc)
@@ -316,6 +314,8 @@ public class AttributeServiceImpl implements AttributeService
throw new AVMWrongTypeException("Attribute Not Map: " + keys);
}
found.remove(name);
fAttributeDAO.flush();
fAttributeDAO.evictFlat(found);
}
private Attribute getAttributeFromPath(List<String> keys)
@@ -330,11 +330,15 @@ public class AttributeServiceImpl implements AttributeService
{
if (current.getType() == Type.MAP)
{
current = current.get(keys.get(i));
Attribute newCurrent = current.get(keys.get(i));
fAttributeDAO.evictFlat(current);
current = newCurrent;
}
else if (current.getType() == Type.LIST)
{
current = current.get(Integer.parseInt(keys.get(i)));
Attribute newCurrent = current.get(Integer.parseInt(keys.get(i)));
fAttributeDAO.evictFlat(current);
current = newCurrent;
}
else
{
@@ -486,7 +490,6 @@ public class AttributeServiceImpl implements AttributeService
}
Attribute converted = fAttributeConverter.toPersistent(value);
found.set(index, fAttributeConverter.toPersistent(value));
fAttributeDAO.evict(converted);
}
/* (non-Javadoc)
@@ -515,7 +518,13 @@ public class AttributeServiceImpl implements AttributeService
{
throw new AVMBadArgumentException("Illegal zero length keys list.");
}
return getAttributeFromPath(keys) != null;
Attribute attr = getAttributeFromPath(keys);
if (attr != null)
{
fAttributeDAO.evictFlat(attr);
return true;
}
return false;
}
/* (non-Javadoc)

View File

@@ -170,7 +170,8 @@ public class MapAttributeImpl extends AttributeImpl implements MapAttribute
{
return null;
}
return entry.getAttribute();
Attribute attr = entry.getAttribute();
return attr;
}
/* (non-Javadoc)

View File

@@ -46,4 +46,10 @@ public interface MapEntryDAO
* @return The number of entries.
*/
public int size(MapAttribute mapAttr);
/**
* Evict an entry.
* @param entry
*/
public void evict(MapEntry entry);
}

View File

@@ -27,8 +27,10 @@ package org.alfresco.repo.attributes.hibernate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.repo.attributes.AttrQueryHelperImpl;
import org.alfresco.repo.attributes.Attribute;
@@ -40,12 +42,14 @@ import org.alfresco.repo.attributes.MapAttribute;
import org.alfresco.repo.attributes.MapEntry;
import org.alfresco.repo.attributes.MapEntryDAO;
import org.alfresco.repo.attributes.Attribute.Type;
import org.alfresco.repo.avm.hibernate.SessionCacheChecker;
import org.alfresco.service.cmr.attributes.AttrQuery;
import org.alfresco.service.cmr.attributes.AttrQueryHelper;
import org.alfresco.util.Pair;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Query;
import org.hibernate.engine.EntityKey;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
@@ -87,7 +91,6 @@ public class AttributeDAOHibernate extends HibernateDaoSupport implements
for (MapEntry entry : mapEntries)
{
Attribute subAttr = entry.getAttribute();
getSession().evict(entry);
fMapEntryDAO.delete(entry);
delete(subAttr);
}
@@ -99,7 +102,6 @@ public class AttributeDAOHibernate extends HibernateDaoSupport implements
for (ListEntry entry : listEntries)
{
Attribute subAttr = entry.getAttribute();
getSession().evict(entry);
fListEntryDAO.delete(entry);
delete(subAttr);
}
@@ -108,7 +110,6 @@ public class AttributeDAOHibernate extends HibernateDaoSupport implements
{
fgLogger.debug("Entities: " + getSession().getStatistics().getEntityCount());
}
getSession().evict(attr);
getSession().delete(attr);
}
@@ -161,20 +162,20 @@ public class AttributeDAOHibernate extends HibernateDaoSupport implements
*/
public void evict(Attribute attr)
{
if (attr.getType() == Attribute.Type.MAP)
{
for (Attribute child : attr.values())
{
evict(child);
}
}
if (attr.getType() == Attribute.Type.LIST)
{
for (Attribute child : attr)
{
evict(child);
}
}
getSession().evict(attr);
}
/* (non-Javadoc)
* @see org.alfresco.repo.attributes.AttributeDAO#flush()
*/
public void flush()
{
getSession().flush();
}
/* (non-Javadoc)
* @see org.alfresco.repo.attributes.AttributeDAO#evictFlat(org.alfresco.repo.attributes.Attribute)
*/
public void evictFlat(Attribute attr)
{
}
}

View File

@@ -96,4 +96,11 @@ public class MapEntryDAOHibernate extends HibernateDaoSupport implements
query.setEntity("map", mapAttr);
return ((Long)query.uniqueResult()).intValue();
}
/* (non-Javadoc)
* @see org.alfresco.repo.attributes.MapEntryDAO#evict(org.alfresco.repo.attributes.MapEntry)
*/
public void evict(MapEntry entry)
{
}
}

View File

@@ -340,8 +340,6 @@ public class AVMRepository
dir.putChild(name, child);
fLookupCache.onWrite(pathParts[0]);
AVMNodeDescriptor desc = child.getDescriptor(parent.getPath(), name, parent.getIndirection(), parent.getIndirectionVersion());
fAVMNodeDAO.flush();
fAVMNodeDAO.evict(child);
return desc;
}
@@ -1046,7 +1044,8 @@ public class AVMRepository
throw new AVMWrongTypeException("Not a directory.");
}
DirectoryNode dirNode = (DirectoryNode)node;
return dirNode.getListing(dir, includeDeleted);
SortedMap<String, AVMNodeDescriptor> listing = dirNode.getListing(dir, includeDeleted);
return listing;
}
finally
{
@@ -2483,8 +2482,6 @@ public class AVMRepository
}
LayeredDirectoryNode dir = (LayeredDirectoryNode)node;
dir.flatten(name);
fAVMNodeDAO.flush();
fAVMNodeDAO.evict(dir);
}
finally
{
@@ -2516,8 +2513,6 @@ public class AVMRepository
}
AVMNode node = lPath.getCurrentNode();
AVMNodeDescriptor desc = node.getDescriptor(lPath);
fAVMNodeDAO.flush();
fAVMNodeDAO.evict(node);
return desc;
}
finally
@@ -2738,7 +2733,6 @@ public class AVMRepository
throw new AVMNotFoundException("Node not found: " + desc);
}
Set<QName> aspects = node.getAspects();
fAVMNodeDAO.evict(node);
return aspects;
}
}

View File

@@ -361,8 +361,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
{
newDir.getProperties().putAll(properties);
}
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(newDir);
}
/**
@@ -407,8 +405,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
dir.updateModTime();
dir.putChild(name, newDir);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(newDir);
// newDir.setVersionID(getNextVersionID());
}
@@ -445,8 +441,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
-1,
"UTF-8"));
ContentWriter writer = createContentWriter(AVMNodeConverter.ExtendAVMPath(path, name));
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(file);
return writer.getContentOutputStream();
}
@@ -490,10 +484,9 @@ public class AVMStoreImpl implements AVMStore, Serializable
{
file.getProperties().putAll(properties);
}
ContentWriter writer = createContentWriter(AVMNodeConverter.ExtendAVMPath(path, name));
// Yet another flush.
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(file);
ContentWriter writer = createContentWriter(AVMNodeConverter.ExtendAVMPath(path, name));
writer.putContent(data);
}
@@ -526,8 +519,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
dir.updateModTime();
dir.putChild(name, newFile);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(newFile);
// newFile.setVersionID(getNextVersionID());
}
@@ -633,7 +624,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode child = AVMNodeUnwrapper.Unwrap(listing.get(name));
AVMNodeDescriptor desc = child.getDescriptor(lPath, name);
results.put(name, desc);
AVMDAOs.Instance().fAVMNodeDAO.evict(child);
}
return results;
}
@@ -653,8 +643,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode();
List<String> deleted = dir.getDeletedNames();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(dir);
return deleted;
}
@@ -688,8 +676,8 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
dir.removeChild(lPath, name);
dir.updateModTime();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(dir);
// AVMDAOs.Instance().fAVMNodeDAO.flush();
// AVMDAOs.Instance().fAVMNodeDAO.evict(dir);
}
/**
@@ -711,8 +699,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
((LayeredDirectoryNode)node).uncover(lPath, name);
node.updateModTime();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
}
// TODO This is problematic. As time goes on this returns
@@ -882,8 +868,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
dir.turnPrimary(lPath);
dir.updateModTime();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(dir);
}
/**
@@ -905,8 +889,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
dir.retarget(lPath, target);
dir.updateModTime();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(dir);
}
/**
@@ -1080,8 +1062,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
((LayeredDirectoryNode)node).setOpacity(opacity);
node.updateModTime();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
}
// TODO Does it make sense to set properties on DeletedNodes?
@@ -1101,8 +1081,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode();
node.setProperty(name, value);
node.setGuid(GUID.generate());
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
}
/**
@@ -1120,8 +1098,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode();
node.addProperties(properties);
node.setGuid(GUID.generate());
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
}
/**
@@ -1140,8 +1116,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
AVMNode node = lPath.getCurrentNode();
PropertyValue prop = node.getProperty(name);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
return prop;
}
@@ -1160,8 +1134,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
AVMNode node = lPath.getCurrentNode();
Map<QName, PropertyValue> props = node.getProperties();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
return props;
}
@@ -1180,8 +1152,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode();
node.setGuid(GUID.generate());
node.deleteProperty(name);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
}
/**
@@ -1198,8 +1168,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode();
node.setGuid(GUID.generate());
node.deleteProperties();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
}
/**
@@ -1287,8 +1255,8 @@ public class AVMStoreImpl implements AVMStore, Serializable
throw new AVMWrongTypeException("File Expected.");
}
ContentData content = ((FileNode)node).getContentData(lPath);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
// AVMDAOs.Instance().fAVMNodeDAO.flush();
// AVMDAOs.Instance().fAVMNodeDAO.evict(node);
return content;
}
@@ -1312,8 +1280,8 @@ public class AVMStoreImpl implements AVMStore, Serializable
node.updateModTime();
node.setGuid(GUID.generate());
ContentData content = ((FileNode)node).getContentData(lPath);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
// AVMDAOs.Instance().fAVMNodeDAO.flush();
// AVMDAOs.Instance().fAVMNodeDAO.evict(node);
return content;
}
@@ -1335,8 +1303,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
throw new AVMWrongTypeException("File Expected.");
}
((FileNode)node).setContentData(data);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
}
/**
@@ -1354,8 +1320,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode();
node.copyMetaDataFrom(from);
node.setGuid(GUID.generate());
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
}
/**
@@ -1373,8 +1337,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode();
node.getAspects().add(aspectName);
node.setGuid(GUID.generate());
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
}
/**
@@ -1392,8 +1354,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
AVMNode node = lPath.getCurrentNode();
Set<QName> aspects = node.getAspects();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
return aspects;
}
@@ -1419,8 +1379,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
node.getProperties().remove(name);
}
node.setGuid(GUID.generate());
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
}
/**
@@ -1439,7 +1397,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
AVMNode node = lPath.getCurrentNode();
boolean has = node.getAspects().contains(aspectName);
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
return has;
}
@@ -1458,8 +1415,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode();
node.setAcl(acl);
node.setGuid(GUID.generate());
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
}
/**
@@ -1532,9 +1487,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
toLink.getAspects().add(WCMModel.ASPECT_REVERTED);
PropertyValue value = new PropertyValue(null, toRevertTo.getId());
toLink.setProperty(WCMModel.PROP_REVERTED_ID, value);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(dir);
AVMDAOs.Instance().fAVMNodeDAO.evict(toLink);
}
/* (non-Javadoc)
@@ -1549,8 +1501,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
AVMNode node = lPath.getCurrentNode();
node.setGuid(guid);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
}
/* (non-Javadoc)
@@ -1570,8 +1520,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
PlainFileNode file = (PlainFileNode)node;
file.setEncoding(encoding);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(file);
}
/* (non-Javadoc)
@@ -1591,7 +1539,5 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
PlainFileNode file = (PlainFileNode)node;
file.setMimeType(mimeType);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(file);
}
}

View File

@@ -337,6 +337,7 @@ public class AVMSyncServiceImpl implements AVMSyncService
NameMatcher excluder, boolean ignoreConflicts, boolean ignoreOlder,
boolean overrideConflicts, boolean overrideOlder, String tag, String description)
{
long start = System.currentTimeMillis();
if (fgLogger.isDebugEnabled())
{
try
@@ -472,6 +473,10 @@ public class AVMSyncServiceImpl implements AVMSyncService
{
fAVMService.createSnapshot(storeName, tag, description);
}
if (fgLogger.isDebugEnabled())
{
fgLogger.debug("Raw Update: " + (System.currentTimeMillis() - start));
}
}
/**

View File

@@ -72,5 +72,8 @@ abstract class DirectoryNodeImpl extends AVMNodeImpl implements DirectoryNode
ChildKey key = new ChildKey(this, name);
ChildEntry newChild = new ChildEntryImpl(key, node);
AVMDAOs.Instance().fChildEntryDAO.save(newChild);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fChildEntryDAO.evict(newChild);
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
}
}

View File

@@ -402,7 +402,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{
listing.put(entry.getKey().getName(), entry.getChild());
}
AVMDAOs.Instance().fChildEntryDAO.evict(entry);
}
return listing;
}
@@ -421,7 +420,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{
listing.put(entry.getKey().getName(), entry.getChild());
}
AVMDAOs.Instance().fChildEntryDAO.evict(entry);
}
return listing;
}
@@ -447,8 +445,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
AVMNodeDescriptor childDesc =
childNode.getDescriptor(dir.getPath(), child.getKey().getName(), dir.getIndirection(), dir.getIndirectionVersion());
listing.put(child.getKey().getName(), childDesc);
AVMDAOs.Instance().fAVMNodeDAO.evict(childNode);
AVMDAOs.Instance().fChildEntryDAO.evict(child);
}
return listing;
}
@@ -481,7 +477,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
listing.get(name).getDescriptor(dir.getPath(), name,
lookup.getCurrentIndirection(),
lookup.getCurrentIndirectionVersion()));
AVMDAOs.Instance().fAVMNodeDAO.evict(listing.get(name));
}
}
}
@@ -499,8 +494,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
child.getKey().getName(),
dir.getIndirection(),
dir.getIndirectionVersion()));
AVMDAOs.Instance().fAVMNodeDAO.evict(child.getChild());
AVMDAOs.Instance().fChildEntryDAO.evict(child);
}
}
return baseListing;
@@ -543,7 +536,8 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{
return null;
}
return new Pair<AVMNode, Boolean>(AVMNodeUnwrapper.Unwrap(entry.getChild()), true);
Pair<AVMNode, Boolean> result = new Pair<AVMNode, Boolean>(AVMNodeUnwrapper.Unwrap(entry.getChild()), true);
return result;
}
// Don't check our underlying directory if we are opaque.
if (fOpacity)
@@ -593,8 +587,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
name,
mine.getIndirection(),
mine.getIndirectionVersion());
AVMDAOs.Instance().fAVMNodeDAO.evict(entry.getChild());
AVMDAOs.Instance().fChildEntryDAO.evict(entry);
return desc;
}
// If we are opaque don't check underneath.
@@ -612,7 +604,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
return null;
}
AVMNodeDescriptor desc = child.getFirst().getDescriptor(lookup);
AVMDAOs.Instance().fAVMNodeDAO.evict(child.getFirst());
return desc;
}
else
@@ -952,7 +943,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{
ChildEntry entry = AVMDAOs.Instance().fChildEntryDAO.get(key);
AVMDAOs.Instance().fChildEntryDAO.delete(entry);
AVMDAOs.Instance().fAVMNodeDAO.flush();
}
}
// Make the new ChildEntry and save.

View File

@@ -115,7 +115,6 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
continue;
}
result.put(child.getKey().getName(), AVMNodeUnwrapper.Unwrap(child.getChild()));
AVMDAOs.Instance().fChildEntryDAO.evict(child);
}
return result;
}
@@ -166,8 +165,6 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
child.getKey().getName(),
dir.getIndirection(),
dir.getIndirectionVersion()));
AVMDAOs.Instance().fAVMNodeDAO.evict(child.getChild());
AVMDAOs.Instance().fChildEntryDAO.evict(child);
}
return result;
}
@@ -193,14 +190,19 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
{
ChildKey key = new ChildKey(this, name);
ChildEntry entry = AVMDAOs.Instance().fChildEntryDAO.get(key);
if (entry == null ||
(!includeDeleted && entry.getChild().getType() == AVMNodeType.DELETED_NODE))
if (entry == null)
{
return null;
}
if (!includeDeleted && entry.getChild().getType() == AVMNodeType.DELETED_NODE)
{
return null;
}
// We're doing the hand unrolling of the proxy because
// Hibernate/CGLIB proxies are broken.
return new Pair<AVMNode, Boolean>(AVMNodeUnwrapper.Unwrap(entry.getChild()), true);
Pair<AVMNode, Boolean> result = new Pair<AVMNode, Boolean>(AVMNodeUnwrapper.Unwrap(entry.getChild()), true);
return result;
}
/**
@@ -223,8 +225,6 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
return null;
}
AVMNodeDescriptor desc = entry.getChild().getDescriptor(mine.getPath(), name, (String)null, -1);
AVMDAOs.Instance().fAVMNodeDAO.evict(entry.getChild());
AVMDAOs.Instance().fChildEntryDAO.evict(entry);
return desc;
}

View File

@@ -57,6 +57,7 @@ class AVMNodeDAOHibernate extends HibernateDaoSupport implements
public void save(AVMNode node)
{
getSession().save(node);
SessionCacheChecker.instance.check();
}
/**
@@ -66,6 +67,7 @@ class AVMNodeDAOHibernate extends HibernateDaoSupport implements
public void delete(AVMNode node)
{
getSession().delete(node);
SessionCacheChecker.instance.check();
}
/**
@@ -74,6 +76,7 @@ class AVMNodeDAOHibernate extends HibernateDaoSupport implements
*/
public AVMNode getByID(long id)
{
SessionCacheChecker.instance.check();
return AVMNodeUnwrapper.Unwrap((AVMNode)getSession().get(AVMNodeImpl.class, id));
}
@@ -215,6 +218,5 @@ class AVMNodeDAOHibernate extends HibernateDaoSupport implements
*/
public void evict(AVMNode node)
{
getSession().evict(node);
}
}

View File

@@ -66,6 +66,7 @@ class ChildEntryDAOHibernate extends HibernateDaoSupport implements
*/
public ChildEntry get(ChildKey key)
{
SessionCacheChecker.instance.check();
return (ChildEntry)getSession().get(ChildEntryImpl.class, key);
}
@@ -96,6 +97,7 @@ class ChildEntryDAOHibernate extends HibernateDaoSupport implements
"and ce.child = :child");
query.setEntity("parent", parent);
query.setEntity("child", child);
SessionCacheChecker.instance.check();
return (ChildEntry)query.uniqueResult();
}
@@ -148,6 +150,5 @@ class ChildEntryDAOHibernate extends HibernateDaoSupport implements
*/
public void evict(ChildEntry entry)
{
getSession().evict(entry);
}
}

View File

@@ -0,0 +1,62 @@
/**
*
*/
package org.alfresco.repo.avm.hibernate;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.engine.EntityKey;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* @author britt
*/
public class SessionCacheChecker extends HibernateDaoSupport
{
public static SessionCacheChecker instance = null;
private static Log fgLogger = LogFactory.getLog(SessionCacheChecker.class);
private int fCount = 0;
public SessionCacheChecker()
{
instance = this;
}
public void check()
{
if (!fgLogger.isDebugEnabled())
{
return;
}
if (fCount % 1000 == 0)
{
Map<String, Integer> types = new HashMap<String, Integer>();
Set<EntityKey> keys = (Set<EntityKey>)getSession().getStatistics().getEntityKeys();
if (keys.size() > 200)
{
for (EntityKey key : keys)
{
String name = key.getEntityName();
if (!types.containsKey(name))
{
types.put(name, 0);
}
types.put(name, types.get(name) + 1);
}
fgLogger.debug(types);
// for (Object it : Thread.currentThread().getStackTrace())
// {
// fgLogger.debug(it);
// }
// fCount = 0;
}
}
fCount++;
}
}

View File

@@ -27,6 +27,7 @@ package org.alfresco.repo.domain.hibernate;
import java.lang.reflect.Method;
import java.util.Map;
import org.alfresco.repo.avm.hibernate.SessionCacheChecker;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
import org.alfresco.util.resource.MethodResourceManager;
import org.apache.commons.logging.Log;
@@ -114,6 +115,11 @@ public class SessionSizeResourceManager extends HibernateDaoSupport implements M
long transactionElapsedTimeNs,
Method currentMethod)
{
if (logger.isDebugEnabled())
{
logger.debug("Session Size Manager Invoked.");
SessionCacheChecker.instance.check();
}
if (isDisableInTransaction())
{
// Don't do anything

View File

@@ -10,6 +10,7 @@ import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.StaleObjectStateException;
import org.hibernate.StaleStateException;
import org.hibernate.exception.LockAcquisitionException;
import org.springframework.aop.framework.ReflectiveMethodInvocation;
import org.springframework.dao.ConcurrencyFailureException;
@@ -122,7 +123,8 @@ public class RetryingTransactionAdvice implements MethodInterceptor
if (t instanceof ConcurrencyFailureException ||
t instanceof DeadlockLoserDataAccessException ||
t instanceof StaleObjectStateException ||
t instanceof LockAcquisitionException)
t instanceof LockAcquisitionException ||
t instanceof StaleStateException)
{
shouldRetry = true;
try

View File

@@ -39,6 +39,7 @@ import org.alfresco.service.transaction.TransactionService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.StaleObjectStateException;
import org.hibernate.StaleStateException;
import org.hibernate.exception.LockAcquisitionException;
import org.springframework.dao.ConcurrencyFailureException;
import org.springframework.dao.DataIntegrityViolationException;
@@ -69,7 +70,8 @@ public class RetryingTransactionHelper
StaleObjectStateException.class,
LockAcquisitionException.class,
BatchUpdateException.class,
DataIntegrityViolationException.class
DataIntegrityViolationException.class,
StaleStateException.class
};
}