Merge branch 'fix/SEARCH-960' into 'master'

Fix/search 960

See merge request search_discovery/insightengine!140
This commit is contained in:
Elia Porciani
2019-08-23 09:21:08 +01:00
2 changed files with 103 additions and 89 deletions
@@ -64,6 +64,8 @@ public class SolrCoreLoadRegistration {
public static void registerForCore(AlfrescoCoreAdminHandler adminHandler, CoreContainer coreContainer, SolrCore core,
String coreName)
{
TrackerRegistry trackerRegistry = adminHandler.getTrackerRegistry();
Properties props = new CoreDescriptorDecorator(core.getCoreDescriptor()).getProperties();
//Prepare cores
@@ -79,10 +81,23 @@ public class SolrCoreLoadRegistration {
props.putAll(srv.getProps());
adminHandler.getInformationServers().put(coreName, srv);
SolrTrackerScheduler scheduler = adminHandler.getScheduler();
// Prevents other threads from registering the ModelTracker at the same time
// Create model tracker and load all the persisted models
createModelTracker(coreName,
trackerRegistry,
props,
coreContainer.getSolrHome(),
repositoryClient,
srv,
scheduler);
log.info("Starting to track " + coreName);
if (Boolean.parseBoolean(props.getProperty("enable.alfresco.tracking", "false")))
{
SolrTrackerScheduler scheduler = adminHandler.getScheduler();
if (trackerRegistry.hasTrackersForCore(coreName))
{
log.info("Trackers for " + coreName+ " is already registered, shutting them down.");
@@ -91,28 +106,7 @@ public class SolrCoreLoadRegistration {
adminHandler.getInformationServers().remove(coreName);
}
// Prevents other threads from registering the ModelTracker at the same time
synchronized (SolrCoreLoadRegistration.class)
{
ModelTracker mTracker = trackerRegistry.getModelTracker();
if (mTracker == null)
{
log.debug("Creating ModelTracker when registering trackers for core " + coreName);
mTracker = new ModelTracker(coreContainer.getSolrHome(), props, repositoryClient,
coreName, srv);
trackerRegistry.setModelTracker(mTracker);
log.info("Ensuring first model sync.");
mTracker.ensureFirstModelSync();
log.info("Done ensuring first model sync.");
//Scheduling the ModelTracker.
scheduler.schedule(mTracker, coreName, props);
}
}
List<Tracker> trackers = createTrackers(coreName, trackerRegistry, props, scheduler, repositoryClient, srv);
List<Tracker> trackers = createCoreTrackers(coreName, trackerRegistry, props, scheduler, repositoryClient, srv);
CommitTracker commitTracker = new CommitTracker(props, repositoryClient, coreName, srv, trackers);
trackerRegistry.register(coreName, commitTracker);
@@ -120,7 +114,8 @@ public class SolrCoreLoadRegistration {
log.info("The Trackers are now scheduled to run");
trackers.add(commitTracker); //Add the commitTracker to the list of scheduled trackers that can be shutdown
core.addCloseHook(new CloseHook() {
core.addCloseHook(new CloseHook()
{
@Override
public void preClose(SolrCore core)
{
@@ -148,7 +143,12 @@ public class SolrCoreLoadRegistration {
* @param srv
* @return A list of trackers
*/
private static List<Tracker> createTrackers(String coreName, TrackerRegistry trackerRegistry, Properties props, SolrTrackerScheduler scheduler, SOLRAPIClient repositoryClient, SolrInformationServer srv) {
private static List<Tracker> createCoreTrackers(String coreName,
TrackerRegistry trackerRegistry,
Properties props,
SolrTrackerScheduler scheduler,
SOLRAPIClient repositoryClient,
SolrInformationServer srv) {
List<Tracker> trackers = new ArrayList<Tracker>();
AclTracker aclTracker = new AclTracker(props, repositoryClient, coreName, srv);
@@ -178,6 +178,45 @@ public class SolrCoreLoadRegistration {
return trackers;
}
/**
* Create model tracker and load persisted models.
*
* @param coreName
* @param trackerRegistry
* @param props
* @param solrHome
* @param repositoryClient
* @param srv
* @param scheduler
* @return true if model tracker has been created, false if it already exists.
*/
private synchronized static void createModelTracker(String coreName,
TrackerRegistry trackerRegistry,
Properties props,
String solrHome,
SOLRAPIClient repositoryClient,
SolrInformationServer srv,
SolrTrackerScheduler scheduler)
{
ModelTracker mTracker = trackerRegistry.getModelTracker();
if (mTracker == null)
{
log.debug("Creating ModelTracker");
mTracker = new ModelTracker(solrHome, props, repositoryClient,
coreName, srv);
trackerRegistry.setModelTracker(mTracker);
log.info("Ensuring first model sync.");
mTracker.ensureFirstModelSync();
log.info("Done ensuring first model sync.");
//Scheduling the ModelTracker.
scheduler.schedule(mTracker, coreName, props);
}
}
/**
* Shuts down the trackers for a core.
*
@@ -83,18 +83,18 @@ import org.json.JSONException;
public class ModelTracker extends AbstractTracker implements Tracker
{
private Set<StoreRef> indexedStores = new HashSet<StoreRef>();
private Set<StoreRef> ignoredStores = new HashSet<StoreRef>();
private Set<String> indexedTenants = new HashSet<String>();
private Set<String> ignoredTenants = new HashSet<String>();
private Set<QName> indexedDataTypes = new HashSet<QName>();
private Set<QName> ignoredDataTypes = new HashSet<QName>();
private Set<QName> indexedTypes = new HashSet<QName>();
private Set<QName> ignoredTypes = new HashSet<QName>();
private Set<QName> indexedAspects = new HashSet<QName>();
private Set<QName> ignoredAspects = new HashSet<QName>();
private Set<String> indexedFields = new HashSet<String>();
private Set<String> ignoredFields = new HashSet<String>();
private final Set<StoreRef> indexedStores = new HashSet<>();
private final Set<StoreRef> ignoredStores = new HashSet<>();
private final Set<String> indexedTenants = new HashSet<>();
private final Set<String> ignoredTenants = new HashSet<>();
private final Set<QName> indexedDataTypes = new HashSet<>();
private final Set<QName> ignoredDataTypes = new HashSet<>();
private final Set<QName> indexedTypes = new HashSet<>();
private final Set<QName> ignoredTypes = new HashSet<>();
private final Set<QName> indexedAspects = new HashSet<>();
private final Set<QName> ignoredAspects = new HashSet<>();
private final Set<String> indexedFields = new HashSet<>();
private final Set<String> ignoredFields = new HashSet<>();
private ReentrantReadWriteLock modelLock = new ReentrantReadWriteLock();
private volatile boolean hasModels = false;
@@ -111,7 +111,7 @@ public class ModelTracker extends AbstractTracker implements Tracker
{
alfrescoModelDir.mkdir();
}
loadPersistedModels();
}
@@ -124,23 +124,15 @@ public class ModelTracker extends AbstractTracker implements Tracker
}
/**
*
*
*/
private void loadPersistedModels()
{
HashMap<String, M2Model> modelMap = new HashMap<String, M2Model>();
HashMap<String, M2Model> modelMap = new HashMap<>();
if (alfrescoModelDir.exists() && alfrescoModelDir.isDirectory())
{
// A filter for XML files
FileFilter filter = new FileFilter()
{
@Override
public boolean accept(File pathname)
{
return pathname.isFile() && pathname.getName().endsWith(".xml");
}
};
FileFilter filter = pathname -> pathname.isFile() && pathname.getName().endsWith(".xml");
// List XML files
File[] files = alfrescoModelDir.listFiles(filter);
if (files != null)
@@ -289,24 +281,18 @@ public class ModelTracker extends AbstractTracker implements Tracker
long start = System.nanoTime();
List<AlfrescoModelDiff> modelDiffs = client.getModelsDiff(coreName, this.infoSrv.getAlfrescoModels());
HashMap<String, M2Model> modelMap = new HashMap<String, M2Model>();
Map<String, M2Model> modelMap = new HashMap<>();
for (AlfrescoModelDiff modelDiff : modelDiffs)
{
switch (modelDiff.getType())
{
case CHANGED:
AlfrescoModel changedModel = client.getModel(coreName, modelDiff.getModelName());
for (M2Namespace namespace : changedModel.getModel().getNamespaces())
{
modelMap.put(namespace.getUri(), changedModel.getModel());
}
break;
case NEW:
AlfrescoModel newModel = client.getModel(coreName, modelDiff.getModelName());
for (M2Namespace namespace : newModel.getModel().getNamespaces())
AlfrescoModel model = client.getModel(coreName, modelDiff.getModelName());
for (M2Namespace namespace : model.getModel().getNamespaces())
{
modelMap.put(namespace.getUri(), newModel.getModel());
modelMap.put(namespace.getUri(), model.getModel());
}
break;
case REMOVED:
@@ -317,7 +303,7 @@ public class ModelTracker extends AbstractTracker implements Tracker
}
}
HashSet<String> loadedModels = new HashSet<String>();
HashSet<String> loadedModels = new HashSet<>();
for (M2Model model : modelMap.values())
{
loadModel(modelMap, loadedModels, model);
@@ -367,7 +353,7 @@ public class ModelTracker extends AbstractTracker implements Tracker
trackerStats.addModelTime(end - start);
if (true == runPostModelLoadInit)
if (runPostModelLoadInit)
{
for (Object key : props.keySet())
{
@@ -450,10 +436,7 @@ public class ModelTracker extends AbstractTracker implements Tracker
{
expandedQName = expandQNameImpl(qName);
}
// else if (AlfrescoSolrDataModel.nonDictionaryFields.get(qName) == null)
// {
// expandedQName = expandQNameImpl(qName);
// }
return QName.createQName(expandedQName);
}
@@ -495,10 +478,7 @@ public class ModelTracker extends AbstractTracker implements Tracker
{
expandedQName = expandQNameImpl(qName);
}
// else if (AlfrescoSolrDataModel.nonDictionaryFields.get(qName) == null)
// {
// expandedQName = expandQNameImpl(qName);
// }
return expandedQName;
}
@@ -513,26 +493,21 @@ public class ModelTracker extends AbstractTracker implements Tracker
final String prefix = modelName.toPrefixString(this.infoSrv.getNamespaceDAO()).replace(":", ".") + ".";
final String postFix = ".xml";
File[] toDelete = alfrescoModelDir.listFiles(new FileFilter()
{
@Override
public boolean accept(File pathname)
File[] toDelete = alfrescoModelDir.listFiles(pathname -> {
if (pathname.isDirectory()) { return false; }
String name = pathname.getName();
if (!name.endsWith(postFix)) { return false; }
if (!name.startsWith(prefix)) { return false; }
// check is number between
String checksum = name.substring(prefix.length(), name.length() - postFix.length());
try
{
if (pathname.isDirectory()) { return false; }
String name = pathname.getName();
if (false == name.endsWith(postFix)) { return false; }
if (false == name.startsWith(prefix)) { return false; }
// check is number between
String checksum = name.substring(prefix.length(), name.length() - postFix.length());
try
{
Long.parseLong(checksum);
return true;
}
catch (NumberFormatException nfe)
{
return false;
}
Long.parseLong(checksum);
return true;
}
catch (NumberFormatException nfe)
{
return false;
}
});
@@ -548,7 +523,7 @@ public class ModelTracker extends AbstractTracker implements Tracker
private void loadModel(Map<String, M2Model> modelMap, HashSet<String> loadedModels, M2Model model)
{
String modelName = model.getName();
if (loadedModels.contains(modelName) == false)
if (!loadedModels.contains(modelName))
{
for (M2Namespace importNamespace : model.getImports())
{