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> </property>
</bean> </bean>
<!-- Indexer and searchers for lucene --> <bean id="abstractLuceneIndexerAndSearcherFactory" abstract="true">
<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>
<property name="indexRootLocation"> <property name="indexRootLocation">
<value>${dir.indexes}</value> <value>${dir.indexes}</value>
</property> </property>
<property name="contentService"> <property name="lockDirectory">
<ref bean="contentService" /> <value>${dir.indexes.lock}</value>
</property>
<property name="queryRegister">
<ref bean="queryRegisterComponent" />
</property> </property>
<property name="maxAtomicTransformationTime"> <property name="maxAtomicTransformationTime">
<value>${lucene.maxAtomicTransformationTime}</value> <!-- milliseconds allowed for inline text transformation --> <value>${lucene.maxAtomicTransformationTime}</value> <!-- milliseconds allowed for inline text transformation -->
@@ -618,8 +601,76 @@
<property name="indexerBatchSize"> <property name="indexerBatchSize">
<value>${lucene.indexer.batchSize}</value> <value>${lucene.indexer.batchSize}</value>
</property> </property>
<property name="lockDirectory"> <!-- cache -->
<value>${dir.indexes.lock}</value> <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>
<property name="indexerMaxFieldLength"> <property name="indexerMaxFieldLength">
<value>${lucene.indexer.maxFieldLength}</value> <value>${lucene.indexer.maxFieldLength}</value>
@@ -633,11 +684,29 @@
<property name="lockPollInterval"> <property name="lockPollInterval">
<value>${lucene.lock.poll.interval}</value> <value>${lucene.lock.poll.interval}</value>
</property> </property>
<property name="defaultMLIndexAnalysisMode"> </bean>
<value>EXACT_LANGUAGE_AND_ALL</value>
<!-- 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>
<property name="defaultMLSearchAnalysisMode"> <property name="tenantService">
<value>EXACT_LANGUAGE_AND_ALL</value> <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>
<property name="threadPoolExecutor"> <property name="threadPoolExecutor">
<ref bean="indexThreadPoolExecutor"></ref> <ref bean="indexThreadPoolExecutor"></ref>
@@ -645,10 +714,6 @@
<property name="bulkLoader"> <property name="bulkLoader">
<ref bean="hibernateL1CacheBulkLoader"></ref> <ref bean="hibernateL1CacheBulkLoader"></ref>
</property> </property>
<!-- over-ride to false for pre 3.0 behaviour -->
<property name="postSortDateTime">
<value>true</value>
</property>
</bean> </bean>
<bean id="adm.luceneQueryEngineImpl" class="org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryEngine" > <bean id="adm.luceneQueryEngineImpl" class="org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryEngine" >
@@ -671,6 +736,7 @@
<!-- Indexer and searchers for lucene --> <!-- Indexer and searchers for lucene -->
<bean id="admLuceneUnIndexedIndexerAndSearcherFactory" <bean id="admLuceneUnIndexedIndexerAndSearcherFactory"
parent="abstractLuceneIndexerAndSearcherFactory"
class="org.alfresco.repo.search.impl.lucene.ADMLuceneUnIndexedIndexAndSearcherFactory"> class="org.alfresco.repo.search.impl.lucene.ADMLuceneUnIndexedIndexAndSearcherFactory">
<property name="nodeService"> <property name="nodeService">
<ref bean="mlAwareNodeService" /> <ref bean="mlAwareNodeService" />
@@ -684,45 +750,12 @@
<property name="nameSpaceService"> <property name="nameSpaceService">
<ref bean="namespaceService" /> <ref bean="namespaceService" />
</property> </property>
<property name="indexRootLocation">
<value>${dir.indexes}</value>
</property>
<property name="contentService"> <property name="contentService">
<ref bean="contentService" /> <ref bean="contentService" />
</property> </property>
<property name="queryRegister"> <property name="queryRegister">
<ref bean="queryRegisterComponent" /> <ref bean="queryRegisterComponent" />
</property> </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"> <property name="threadPoolExecutor">
<ref bean="indexThreadPoolExecutor"></ref> <ref bean="indexThreadPoolExecutor"></ref>
</property> </property>
@@ -730,6 +763,7 @@
<!-- Indexer and searchers for lucene --> <!-- Indexer and searchers for lucene -->
<bean id="avmLuceneIndexerAndSearcherFactory" <bean id="avmLuceneIndexerAndSearcherFactory"
parent="abstractLuceneIndexerAndSearcherFactory"
class="org.alfresco.repo.search.impl.lucene.AVMLuceneIndexerAndSearcherFactory"> class="org.alfresco.repo.search.impl.lucene.AVMLuceneIndexerAndSearcherFactory">
<property name="nodeService"> <property name="nodeService">
<ref bean="mlAwareNodeService" /> <ref bean="mlAwareNodeService" />
@@ -743,9 +777,6 @@
<property name="nameSpaceService"> <property name="nameSpaceService">
<ref bean="namespaceService" /> <ref bean="namespaceService" />
</property> </property>
<property name="indexRootLocation">
<value>${dir.indexes}</value>
</property>
<property name="contentService"> <property name="contentService">
<ref bean="contentService" /> <ref bean="contentService" />
</property> </property>
@@ -761,43 +792,9 @@
<property name="queryRegister"> <property name="queryRegister">
<ref bean="queryRegisterComponent" /> <ref bean="queryRegisterComponent" />
</property> </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"> <property name="threadPoolExecutor">
<ref bean="indexThreadPoolExecutor"></ref> <ref bean="indexThreadPoolExecutor"></ref>
</property> </property>
<!-- over-ride to false for pre 3.0 behaviour -->
<property name="postSortDateTime">
<value>true</value>
</property>
</bean> </bean>
<bean id="avm.luceneQueryEngineImpl" class="org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryEngine" > <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.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.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.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. 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"> <property name="cm:content">
<type>d:content</type> <type>d:content</type>
<mandatory>false</mandatory> <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"> <index enabled="true">
<atomic>true</atomic> <atomic>true</atomic>
<stored>false</stored> <stored>false</stored>

View File

@@ -157,22 +157,52 @@ lucene.query.maxClauses=10000
# #
lucene.indexer.batchSize=1000000 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 # The number of terms from a document that will be indexed
# #
lucene.indexer.maxFieldLength=10000 lucene.indexer.maxFieldLength=10000
#
# Index locks (mostly deprecated and will be tidied up with the next lucene upgrade)
#
lucene.write.lock.timeout=10000 lucene.write.lock.timeout=10000
lucene.commit.lock.timeout=100000 lucene.commit.lock.timeout=100000
lucene.lock.poll.interval=100 lucene.lock.poll.interval=100

View File

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