Merged V3.2 to HEAD

16708: Fix for ETHREEOH-2247: "patch.authorityDefaultZonesPatch" patch is quite slow on DB with many users/groups - it does not output any progress indicator during the time that the server is apparently frozen during startup
    16712: Fix for ETHREEOH-2291: Atomic index property in contentModel.xml
    16799: Fix for ETHREEOH-2843:  lucene.indexer.minMergeDocs , lucene.indexer.mergeFactor and lucene.indexer.maxMergeDocs are never read / used


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@17011 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Andrew Hind
2009-10-19 09:50:20 +00:00
parent 5b78c27360
commit 24a4251d8a
5 changed files with 164 additions and 116 deletions

View File

@@ -585,29 +585,12 @@
</property>
</bean>
<!-- Indexer and searchers for lucene -->
<bean id="admLuceneIndexerAndSearcherFactory"
class="org.alfresco.repo.search.impl.lucene.ADMLuceneIndexerAndSearcherFactory">
<property name="nodeService">
<ref bean="mlAwareNodeService" />
</property>
<property name="tenantService">
<ref bean="tenantService"/>
</property>
<property name="dictionaryService">
<ref bean="dictionaryService" />
</property>
<property name="nameSpaceService">
<ref bean="namespaceService" />
</property>
<bean id="abstractLuceneIndexerAndSearcherFactory" abstract="true">
<property name="indexRootLocation">
<value>${dir.indexes}</value>
</property>
<property name="contentService">
<ref bean="contentService" />
</property>
<property name="queryRegister">
<ref bean="queryRegisterComponent" />
<property name="lockDirectory">
<value>${dir.indexes.lock}</value>
</property>
<property name="maxAtomicTransformationTime">
<value>${lucene.maxAtomicTransformationTime}</value> <!-- milliseconds allowed for inline text transformation -->
@@ -618,8 +601,76 @@
<property name="indexerBatchSize">
<value>${lucene.indexer.batchSize}</value>
</property>
<property name="lockDirectory">
<value>${dir.indexes.lock}</value>
<!-- cache -->
<property name="cacheEnabled">
<value>${lucene.indexer.cacheEnabled}</value>
</property>
<property name="maxDocIdCacheSize">
<value>${lucene.indexer.maxDocIdCacheSize}</value>
</property>
<property name="maxDocumentCacheSize">
<value>${lucene.indexer.maxDocumentCacheSize}</value>
</property>
<property name="maxIsCategoryCacheSize">
<value>${lucene.indexer.maxIsCategoryCacheSize}</value>
</property>
<property name="maxLinkAspectCacheSize">
<value>${lucene.indexer.maxLinkAspectCacheSize}</value>
</property>
<property name="maxParentCacheSize">
<value>${lucene.indexer.maxParentCacheSize}</value>
</property>
<property name="maxPathCacheSize">
<value>${lucene.indexer.maxPathCacheSize}</value>
</property>
<property name="maxTypeCacheSize">
<value>${lucene.indexer.maxTypeCacheSize}</value>
</property>
<!-- merge indexers -->
<property name="mergerMaxMergeDocs">
<value>${lucene.indexer.mergerMaxMergeDocs}</value>
</property>
<property name="mergerMergeFactor">
<value>${lucene.indexer.mergerMergeFactor}</value>
</property>
<property name="mergerMinMergeDocs">
<value>${lucene.indexer.mergerMinMergeDocs}</value>
</property>
<!-- delta indexers -->
<property name="writerMaxMergeDocs">
<value>${lucene.indexer.writerMaxMergeDocs}</value>
</property>
<property name="writerMergeFactor">
<value>${lucene.indexer.writerMergeFactor}</value>
</property>
<property name="writerMinMergeDocs">
<value>${lucene.indexer.writerMinMergeDocs}</value>
</property>
<!-- target -->
<property name="mergerTargetIndexCount">
<value>${lucene.indexer.mergerTargetIndexCount}</value>
</property>
<property name="mergerTargetOverlayCount">
<value>${lucene.indexer.mergerTargetOverlayCount}</value>
</property>
<property name="maxDocsForInMemoryMerge">
<value>${lucene.indexer.maxDocsForInMemoryMerge}</value>
</property>
<!-- other -->
<property name="termIndexInterval">
<value>${lucene.indexer.termIndexInterval}</value>
</property>
<property name="useNioMemoryMapping">
<value>${lucene.indexer.useNioMemoryMapping}</value>
</property>
<property name="postSortDateTime">
<value>${lucene.indexer.postSortDateTime}</value>
</property>
<property name="defaultMLIndexAnalysisMode">
<value>${lucene.indexer.defaultMLIndexAnalysisMode}</value>
</property>
<property name="defaultMLSearchAnalysisMode">
<value>${lucene.indexer.defaultMLSearchAnalysisMode}</value>
</property>
<property name="indexerMaxFieldLength">
<value>${lucene.indexer.maxFieldLength}</value>
@@ -633,11 +684,29 @@
<property name="lockPollInterval">
<value>${lucene.lock.poll.interval}</value>
</property>
<property name="defaultMLIndexAnalysisMode">
<value>EXACT_LANGUAGE_AND_ALL</value>
</bean>
<!-- Indexer and searchers for lucene -->
<bean id="admLuceneIndexerAndSearcherFactory"
parent="abstractLuceneIndexerAndSearcherFactory"
class="org.alfresco.repo.search.impl.lucene.ADMLuceneIndexerAndSearcherFactory">
<property name="nodeService">
<ref bean="mlAwareNodeService" />
</property>
<property name="defaultMLSearchAnalysisMode">
<value>EXACT_LANGUAGE_AND_ALL</value>
<property name="tenantService">
<ref bean="tenantService"/>
</property>
<property name="dictionaryService">
<ref bean="dictionaryService" />
</property>
<property name="nameSpaceService">
<ref bean="namespaceService" />
</property>
<property name="contentService">
<ref bean="contentService" />
</property>
<property name="queryRegister">
<ref bean="queryRegisterComponent" />
</property>
<property name="threadPoolExecutor">
<ref bean="indexThreadPoolExecutor"></ref>
@@ -645,10 +714,6 @@
<property name="bulkLoader">
<ref bean="hibernateL1CacheBulkLoader"></ref>
</property>
<!-- over-ride to false for pre 3.0 behaviour -->
<property name="postSortDateTime">
<value>true</value>
</property>
</bean>
<bean id="adm.luceneQueryEngineImpl" class="org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryEngine" >
@@ -671,6 +736,7 @@
<!-- Indexer and searchers for lucene -->
<bean id="admLuceneUnIndexedIndexerAndSearcherFactory"
parent="abstractLuceneIndexerAndSearcherFactory"
class="org.alfresco.repo.search.impl.lucene.ADMLuceneUnIndexedIndexAndSearcherFactory">
<property name="nodeService">
<ref bean="mlAwareNodeService" />
@@ -684,45 +750,12 @@
<property name="nameSpaceService">
<ref bean="namespaceService" />
</property>
<property name="indexRootLocation">
<value>${dir.indexes}</value>
</property>
<property name="contentService">
<ref bean="contentService" />
</property>
<property name="queryRegister">
<ref bean="queryRegisterComponent" />
</property>
<property name="maxAtomicTransformationTime">
<value>${lucene.maxAtomicTransformationTime}</value> <!-- milliseconds allowed for inline text transformation -->
</property>
<property name="queryMaxClauses">
<value>${lucene.query.maxClauses}</value>
</property>
<property name="indexerBatchSize">
<value>${lucene.indexer.batchSize}</value>
</property>
<property name="lockDirectory">
<value>${dir.indexes.lock}</value>
</property>
<property name="indexerMaxFieldLength">
<value>${lucene.indexer.maxFieldLength}</value>
</property>
<property name="writeLockTimeout">
<value>${lucene.write.lock.timeout}</value>
</property>
<property name="commitLockTimeout">
<value>${lucene.commit.lock.timeout}</value>
</property>
<property name="lockPollInterval">
<value>${lucene.lock.poll.interval}</value>
</property>
<property name="defaultMLIndexAnalysisMode">
<value>EXACT_LANGUAGE_AND_ALL</value>
</property>
<property name="defaultMLSearchAnalysisMode">
<value>EXACT_LANGUAGE_AND_ALL</value>
</property>
<property name="threadPoolExecutor">
<ref bean="indexThreadPoolExecutor"></ref>
</property>
@@ -730,6 +763,7 @@
<!-- Indexer and searchers for lucene -->
<bean id="avmLuceneIndexerAndSearcherFactory"
parent="abstractLuceneIndexerAndSearcherFactory"
class="org.alfresco.repo.search.impl.lucene.AVMLuceneIndexerAndSearcherFactory">
<property name="nodeService">
<ref bean="mlAwareNodeService" />
@@ -743,9 +777,6 @@
<property name="nameSpaceService">
<ref bean="namespaceService" />
</property>
<property name="indexRootLocation">
<value>${dir.indexes}</value>
</property>
<property name="contentService">
<ref bean="contentService" />
</property>
@@ -761,43 +792,9 @@
<property name="queryRegister">
<ref bean="queryRegisterComponent" />
</property>
<property name="maxAtomicTransformationTime">
<value>${lucene.maxAtomicTransformationTime}</value> <!-- milliseconds allowed for inline text transformation -->
</property>
<property name="queryMaxClauses">
<value>${lucene.query.maxClauses}</value>
</property>
<property name="indexerBatchSize">
<value>${lucene.indexer.batchSize}</value>
</property>
<property name="lockDirectory">
<value>${dir.indexes.lock}</value>
</property>
<property name="indexerMaxFieldLength">
<value>${lucene.indexer.maxFieldLength}</value>
</property>
<property name="writeLockTimeout">
<value>${lucene.write.lock.timeout}</value>
</property>
<property name="commitLockTimeout">
<value>${lucene.commit.lock.timeout}</value>
</property>
<property name="lockPollInterval">
<value>${lucene.lock.poll.interval}</value>
</property>
<property name="defaultMLIndexAnalysisMode">
<value>EXACT_LANGUAGE_AND_ALL</value>
</property>
<property name="defaultMLSearchAnalysisMode">
<value>EXACT_LANGUAGE_AND_ALL</value>
</property>
<property name="threadPoolExecutor">
<ref bean="indexThreadPoolExecutor"></ref>
</property>
<!-- over-ride to false for pre 3.0 behaviour -->
<property name="postSortDateTime">
<value>true</value>
</property>
</bean>
<bean id="avm.luceneQueryEngineImpl" class="org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryEngine" >

View File

@@ -275,6 +275,8 @@ patch.authorityMigration.result=Migrated {0} groups and {1} group associations t
patch.authorityDefaultZonesPatch.description=Adds groups and people to the appropriate zones for wcm, share and everything else.
patch.authorityDefaultZonesPatch.result=Unzoned groups and people added to the default zones.
patch.authorityDefaultZonesPatch.users= Adding users to zones ...
patch.authorityDefaultZonesPatch.groups= Adding groups to zones ...
patch.fixNameCrcValues.description=Fixes name CRC32 values to match UTF-8 encoding.
patch.fixNameCrcValues.result=Fixed {0} name CRC32 values for UTF-8 encoding. See file {1} for details.

View File

@@ -80,7 +80,9 @@
<property name="cm:content">
<type>d:content</type>
<mandatory>false</mandatory>
<!--- Index content in the background -->
<!-- Although content is marked as indexed atomically it may end up asynchronous -->
<!-- if the content conversion will take too long. Content that does not require conversion -->
<!-- to UTF8 test/plain will always be indexed atomically -->
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>

View File

@@ -157,22 +157,52 @@ lucene.query.maxClauses=10000
#
lucene.indexer.batchSize=1000000
#
# Lucene index min merge docs - the in memory size of the index
# Index cache sizes
#
lucene.indexer.minMergeDocs=1000
lucene.indexer.cacheEnabled=true
lucene.indexer.maxDocIdCacheSize=10000
lucene.indexer.maxDocumentCacheSize=100
lucene.indexer.maxIsCategoryCacheSize=-1
lucene.indexer.maxLinkAspectCacheSize=10000
lucene.indexer.maxParentCacheSize=10000
lucene.indexer.maxPathCacheSize=10000
lucene.indexer.maxTypeCacheSize=10000
#
# When lucene index files are merged together - it will try to keep this number of segments/files in
# Properties for merge (not this does not affect the final index segment which will be optimised)
# Max merge docs only applies to the merge process not the resulting index which will be optimised.
#
lucene.indexer.mergeFactor=10
lucene.indexer.mergerMaxMergeDocs=1000000
lucene.indexer.mergerMergeFactor=5
lucene.indexer.mergerMinMergeDocs=1000
#
# Roughly the maximum number of nodes indexed in one file/segment
# Properties for delta indexes (not this does not affect the final index segment which will be optimised)
# Max merge docs only applies to the index building process not the resulting index which will be optimised.
#
lucene.indexer.maxMergeDocs=100000
lucene.indexer.writerMaxMergeDocs=1000000
lucene.indexer.writerMergeFactor=5
lucene.indexer.writerMinMergeDocs=1000
#
# Target number of indexes and deltas in the overall index and what index size to merge in memory
#
lucene.indexer.mergerTargetIndexCount=5
lucene.indexer.mergerTargetOverlayCount=5
lucene.indexer.maxDocsForInMemoryMerge=10000
#
# Other lucene properties
#
lucene.indexer.termIndexInterval=128
lucene.indexer.useNioMemoryMapping=true
# over-ride to false for pre 3.0 behaviour
lucene.indexer.postSortDateTime=true
lucene.indexer.defaultMLIndexAnalysisMode=EXACT_LANGUAGE_AND_ALL
lucene.indexer.defaultMLSearchAnalysisMode=EXACT_LANGUAGE_AND_ALL
#
# The number of terms from a document that will be indexed
#
lucene.indexer.maxFieldLength=10000
#
# Index locks (mostly deprecated and will be tidied up with the next lucene upgrade)
#
lucene.write.lock.timeout=10000
lucene.commit.lock.timeout=100000
lucene.lock.poll.interval=100

View File

@@ -29,7 +29,9 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.alfresco.i18n.I18NUtil;
import org.alfresco.repo.admin.patch.AbstractPatch;
import org.alfresco.repo.admin.patch.PatchExecuter;
import org.alfresco.repo.domain.hibernate.HibernateSessionHelper;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
@@ -37,6 +39,8 @@ import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.AuthorityType;
import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.cmr.site.SiteService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Patch to assign users and groups to default zones
@@ -47,6 +51,9 @@ public class AuthorityDefaultZonesPatch extends AbstractPatch
{
/** Success message. */
private static final String MSG_SUCCESS = "patch.authorityDefaultZonesPatch.result";
private static final String MSG_UPDATE_USERS = "patch.authorityDefaultZonesPatch.users";
private static final String MSG_UPDATE_GROUPS = "patch.authorityDefaultZonesPatch.groups";
private static Log progress_logger = LogFactory.getLog(PatchExecuter.class);
/** The authority service. */
private AuthorityService authorityService;
@@ -97,14 +104,21 @@ public class AuthorityDefaultZonesPatch extends AbstractPatch
@Override
protected String applyInternal() throws Exception
{
setZonesForPeople();
setZonesForGroups();
int count = 0;
int total = authorityService.getAllAuthorities(AuthorityType.USER).size() + authorityService.getAllAuthorities(AuthorityType.GROUP).size();
reportProgress(total, count);
String msg = I18NUtil.getMessage(MSG_UPDATE_USERS);
progress_logger.info(msg);
count = setZonesForPeople(total, count);
msg = I18NUtil.getMessage(MSG_UPDATE_GROUPS);
progress_logger.info(msg);
setZonesForGroups(total, count);
return MSG_SUCCESS;
}
private void setZonesForPeople()
private int setZonesForPeople(int total, int start)
{
Set<String> defaultZones = new HashSet<String>(2, 1.0f);
defaultZones.add(AuthorityService.ZONE_APP_DEFAULT);
@@ -113,11 +127,11 @@ public class AuthorityDefaultZonesPatch extends AbstractPatch
List<Action> personActions = new ArrayList<Action>(1);
personActions.add(new Action(null, defaultZones, ActionType.SET));
setZones(AuthorityType.USER, personActions);
return setZones(AuthorityType.USER, personActions, total, start);
}
private void setZonesForGroups()
private int setZonesForGroups(int total, int start)
{
Set<String> defaultZones = new HashSet<String>(2, 1.0f);
defaultZones.add(AuthorityService.ZONE_APP_DEFAULT);
@@ -152,13 +166,13 @@ public class AuthorityDefaultZonesPatch extends AbstractPatch
}
groupActions.add(new Action(null, defaultZones, ActionType.SET));
setZones(AuthorityType.GROUP, groupActions);
return setZones(AuthorityType.GROUP, groupActions, total, start);
}
private void setZones(AuthorityType authorityType, List<Action> actions)
private int setZones(AuthorityType authorityType, List<Action> actions, int total, int start)
{
int count = start;
hibernateSessionHelper.mark();
Set<String> authorities = authorityService.getAllAuthorities(authorityType);
hibernateSessionHelper.reset();
@@ -181,7 +195,10 @@ public class AuthorityDefaultZonesPatch extends AbstractPatch
}
}
hibernateSessionHelper.reset();
count++;
reportProgress(total, count);
}
return count;
}