exo-jcr SVN: r4910 - in jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl: rdbms and 1 other directory.
by do-not-reply@jboss.org
Author: areshetnyak
Date: 2011-09-14 04:29:13 -0400 (Wed, 14 Sep 2011)
New Revision: 4910
Modified:
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsWorkspaceInitializer.java
Log:
EXOJCR-1487 : Repository was suspended for use case of RDBMS restore workspace if using single-db. Suspending of repository is necessary to avoid inconsistency DB, because in during RDBMS restoring is removing constraints on DB.
Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java 2011-09-14 07:17:22 UTC (rev 4909)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java 2011-09-14 08:29:13 UTC (rev 4910)
@@ -31,7 +31,6 @@
import org.exoplatform.services.jcr.config.SimpleParameterEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.config.WorkspaceInitializerEntry;
-import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.core.WorkspaceContainerFacade;
import org.exoplatform.services.jcr.ext.backup.BackupChain;
import org.exoplatform.services.jcr.ext.backup.BackupChainLog;
@@ -954,68 +953,39 @@
WorkspaceInitializerEntry wiEntry = new WorkspaceInitializerEntry();
- try
+ if ((Class.forName(fBackupType).equals(FullBackupJob.class)))
{
- if ((Class.forName(fBackupType).equals(FullBackupJob.class)))
- {
- // set the initializer SysViewWorkspaceInitializer
- wiEntry.setType(SysViewWorkspaceInitializer.class.getCanonicalName());
+ // set the initializer SysViewWorkspaceInitializer
+ wiEntry.setType(SysViewWorkspaceInitializer.class.getCanonicalName());
- List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
- wieParams.add(new SimpleParameterEntry(SysViewWorkspaceInitializer.RESTORE_PATH_PARAMETER, pathBackupFile));
+ List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
+ wieParams.add(new SimpleParameterEntry(SysViewWorkspaceInitializer.RESTORE_PATH_PARAMETER, pathBackupFile));
- wiEntry.setParameters(wieParams);
- }
- else if ((Class.forName(fBackupType)
- .equals(org.exoplatform.services.jcr.ext.backup.impl.rdbms.FullBackupJob.class)))
- {
- // set state SUSPENDED to other workspaces if singledb
- if (workspaceEntry.getContainer().getParameterBoolean("multi-db") == false)
- {
- defRep.setState(ManageableRepository.SUSPENDED);
- }
- // set the initializer RdbmsWorkspaceInitializer
- wiEntry.setType(RdbmsWorkspaceInitializer.class.getCanonicalName());
+ wiEntry.setParameters(wieParams);
+ }
+ else if ((Class.forName(fBackupType)
+ .equals(org.exoplatform.services.jcr.ext.backup.impl.rdbms.FullBackupJob.class)))
+ {
+ // set the initializer RdbmsWorkspaceInitializer
+ wiEntry.setType(RdbmsWorkspaceInitializer.class.getCanonicalName());
- List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
- wieParams.add(new SimpleParameterEntry(RdbmsWorkspaceInitializer.RESTORE_PATH_PARAMETER, new File(
- pathBackupFile).getParent()));
+ List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
+ wieParams.add(new SimpleParameterEntry(RdbmsWorkspaceInitializer.RESTORE_PATH_PARAMETER, new File(
+ pathBackupFile).getParent()));
- wiEntry.setParameters(wieParams);
- }
+ wiEntry.setParameters(wieParams);
+ }
- workspaceEntry.setInitializer(wiEntry);
+ workspaceEntry.setInitializer(wiEntry);
- //restore
- defRep.configWorkspace(workspaceEntry);
- defRep.createWorkspace(workspaceEntry.getName());
+ //restore
+ defRep.configWorkspace(workspaceEntry);
+ defRep.createWorkspace(workspaceEntry.getName());
- //set original workspace initializer
- WorkspaceContainerFacade wcf = defRep.getWorkspaceContainer(workspaceEntry.getName());
- WorkspaceEntry createdWorkspaceEntry = (WorkspaceEntry) wcf.getComponent(WorkspaceEntry.class);
- createdWorkspaceEntry.setInitializer(wieOriginal);
- }
- finally
- {
- try
- {
- if (workspaceEntry.getContainer().getParameterBoolean("multi-db") == false)
- {
- if (defRep.getState() != ManageableRepository.ONLINE)
- {
- defRep.setState(ManageableRepository.ONLINE);
- }
- }
- }
- catch (RepositoryException e)
- {
- log.error("Con not set ONLYNE state for repository +\"" + defRep.getName() + "\"", e);
- }
- catch (RepositoryConfigurationException e)
- {
- log.error("Con not set ONLYNE state for repository +\"" + defRep.getName() + "\"", e);
- }
- }
+ //set original workspace initializer
+ WorkspaceContainerFacade wcf = defRep.getWorkspaceContainer(workspaceEntry.getName());
+ WorkspaceEntry createdWorkspaceEntry = (WorkspaceEntry) wcf.getComponent(WorkspaceEntry.class);
+ createdWorkspaceEntry.setInitializer(wieOriginal);
}
private void incrementalRestore(String pathBackupFile, String repositoryName, String workspaceName)
Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsWorkspaceInitializer.java 2011-09-14 07:17:22 UTC (rev 4909)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsWorkspaceInitializer.java 2011-09-14 08:29:13 UTC (rev 4910)
@@ -154,8 +154,20 @@
List<Backupable> backupableComponents =
repository.getWorkspaceContainer(workspaceName).getComponentInstancesOfType(Backupable.class);
+ boolean isRepositorySuspended = false;
+ Throwable throwable = null;
try
{
+ // set state SUSPENDED to other workspaces if singledb
+ if (workspaceEntry.getContainer().getParameterBoolean("multi-db") == false)
+ {
+ if (repositoryEntry.getWorkspaceEntries().size() != 1)
+ {
+ repository.setState(ManageableRepository.SUSPENDED);
+ isRepositorySuspended = true;
+ }
+ }
+
// restore all components
for (Backupable component : backupableComponents)
{
@@ -179,6 +191,8 @@
}
catch (Throwable e)
{
+ throwable = e;
+
for (DataRestore restorer : dataRestorers)
{
try
@@ -206,6 +220,26 @@
log.error("Can't close restorer", e);
}
}
+
+ try
+ {
+ if (isRepositorySuspended)
+ {
+ repository.setState(ManageableRepository.ONLINE);
+ }
+ }
+ catch (RepositoryException e)
+ {
+ if (throwable == null)
+ {
+ log.error("Con not set ONLYNE state for repository " + repository.getConfiguration().getName(), e);
+ }
+ else
+ {
+ throw new RepositoryException("Con not set ONLYNE state for repository "
+ + repository.getConfiguration().getName(), e);
+ }
+ }
}
}
}
14 years, 7 months
exo-jcr SVN: r4909 - in jcr/trunk/exo.jcr.component.core/src: main/java/org/exoplatform/services/jcr/impl/core and 7 other directories.
by do-not-reply@jboss.org
Author: dkuleshov
Date: 2011-09-14 03:17:22 -0400 (Wed, 14 Sep 2011)
New Revision: 4909
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/ItemDataConsumer.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ItemImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemAutocreator.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/ACLInheritanceSupportedWorkspaceDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/ShareableSupportedWorkspaceDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/VersionableWorkspaceDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/infinispan/BufferedISPNCache.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/TransactionableDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestMultipleListenersNotifying.java
Log:
EXOJCR-1533: removed extra NullItemData creations
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/ItemDataConsumer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/ItemDataConsumer.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/ItemDataConsumer.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -71,6 +71,24 @@
ItemData getItemData(NodeData parent, QPathEntry name, ItemType itemType) throws RepositoryException;
/**
+ * Find Item by parent (id) and name (with path index) of defined type and create
+ * or not (defined by createNullItemData) null item data.
+ *
+ * @param parent
+ * NodeData
+ * @param name
+ * item name
+ * @param itemType
+ * itemType
+ * @param createNullItemData
+ * defines if NullItemData should be created
+ * @return ItemData, data by parent and name
+ * @throws RepositoryException
+ */
+ ItemData getItemData(NodeData parent, QPathEntry name, ItemType itemType, boolean createNullItemData)
+ throws RepositoryException;
+
+ /**
* Find Item by identifier.
*
* @param String identifier
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ItemImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ItemImpl.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ItemImpl.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -449,7 +449,7 @@
PropertyDefinitionDatas defs;
ItemImpl prevItem =
dataManager.getItem(parentNode.nodeData(), new QPathEntry(propertyName, 0), true,
- dataManager.isNew(parentNode.getIdentifier()), ItemType.PROPERTY);
+ dataManager.isNew(parentNode.getIdentifier()), ItemType.PROPERTY, false);
NodeTypeDataManager ntm = session.getWorkspace().getNodeTypesHolder();
NodeData parentData = (NodeData)parentNode.getData();
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -641,7 +641,7 @@
PropertyData prop =
(PropertyData)dataManager.getItemData(((NodeData)getData()), new QPathEntry(Constants.JCR_MIXINTYPES, 0),
- ItemType.PROPERTY);
+ ItemType.PROPERTY, false);
ItemState state;
if (prop != null)
@@ -1922,7 +1922,7 @@
for (PropertyDefinitionData pd : ntmanager.getAllPropertyDefinitions(removedName))
{
- ItemData p = dataManager.getItemData(nodeData(), new QPathEntry(pd.getName(), 1), ItemType.PROPERTY);
+ ItemData p = dataManager.getItemData(nodeData(), new QPathEntry(pd.getName(), 1), ItemType.PROPERTY, false);
if (p != null && !p.isNode())
{
// remove it
@@ -3061,13 +3061,15 @@
int ind = 1;
- NodeData sibling = (NodeData)dataManager.getItemData(parentNode, new QPathEntry(nameToAdd, ind), ItemType.NODE);
+ NodeData sibling =
+ (NodeData)dataManager.getItemData(parentNode, new QPathEntry(nameToAdd, ind), ItemType.NODE, false);
while (sibling != null)
{
if (allowSns)
{
ind++;
- sibling = (NodeData)dataManager.getItemData(parentNode, new QPathEntry(nameToAdd, ind), ItemType.NODE);
+ sibling =
+ (NodeData)dataManager.getItemData(parentNode, new QPathEntry(nameToAdd, ind), ItemType.NODE, false);
}
else
{
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -237,12 +237,23 @@
*/
public ItemData getItemData(NodeData parent, QPathEntry name, ItemType itemType) throws RepositoryException
{
- return getItemData(parent, name, false, itemType);
+ return getItemData(parent, name, false, itemType, true);
}
- private ItemData getItemData(NodeData parent, QPathEntry name, boolean skipCheckInPersistence, ItemType itemType)
+ /**
+ * {@inheritDoc}
+ */
+ public ItemData getItemData(NodeData parent, QPathEntry name, ItemType itemType, boolean createNullItemData)
throws RepositoryException
{
+ return getItemData(parent, name, false, itemType, createNullItemData);
+ }
+
+
+ private ItemData getItemData(NodeData parent, QPathEntry name, boolean skipCheckInPersistence, ItemType itemType,
+ boolean createNullItemData)
+ throws RepositoryException
+ {
if (name.getName().equals(JCRPath.PARENT_RELPATH) && name.getNamespace().equals(Constants.NS_DEFAULT_URI))
{
if (parent.getIdentifier().equals(Constants.ROOT_UUID))
@@ -270,7 +281,7 @@
// 2. Try from txdatamanager
if (!(skipCheckInPersistence))
{
- data = transactionableManager.getItemData(parent, name, itemType);
+ data = transactionableManager.getItemData(parent, name, itemType, createNullItemData);
}
}
else if (!state.isDeleted())
@@ -364,6 +375,32 @@
public ItemImpl getItem(NodeData parent, QPathEntry name, boolean pool, ItemType itemType, boolean apiRead)
throws RepositoryException
{
+ return getItem(parent, name, pool, itemType, apiRead, true);
+ }
+
+ /**
+ * For internal use. Return Item by parent NodeDada and the name of searched item.
+ *
+ * @param parent
+ * - parent of the searched item
+ * @param name
+ * - item name
+ * @param itemType
+ * - item type
+ * @param pool
+ * - indicates does the item fall in pool
+ * @param apiRead
+ * - if true will call postRead Action and check permissions
+ * @param createNullItemData
+ * - defines if there is a need to create NullItemData
+ *
+ * @return existed item or null if not found
+ * @throws RepositoryException
+ */
+ public ItemImpl getItem(NodeData parent, QPathEntry name, boolean pool, ItemType itemType, boolean apiRead,
+ boolean createNullItemData)
+ throws RepositoryException
+ {
long start = 0;
if (log.isDebugEnabled())
{
@@ -374,7 +411,7 @@
ItemImpl item = null;
try
{
- return item = readItem(getItemData(parent, name, itemType), parent, pool, apiRead);
+ return item = readItem(getItemData(parent, name, itemType, createNullItemData), parent, pool, apiRead);
}
finally
{
@@ -405,9 +442,15 @@
public ItemImpl getItem(NodeData parent, QPathEntry name, boolean pool, boolean skipCheckInPersistence)
throws RepositoryException
{
- return getItem(parent, name, pool, skipCheckInPersistence, ItemType.UNKNOWN);
+ return getItem(parent, name, pool, skipCheckInPersistence, ItemType.UNKNOWN, true);
}
+ public ItemImpl getItem(NodeData parent, QPathEntry name, boolean pool, boolean skipCheckInPersistence,
+ ItemType itemType) throws RepositoryException
+ {
+ return getItem(parent, name, pool, skipCheckInPersistence, itemType, true);
+ }
+
/**
* Return Item by parent NodeDada and the name of searched item.
*
@@ -425,7 +468,7 @@
* @throws RepositoryException
*/
public ItemImpl getItem(NodeData parent, QPathEntry name, boolean pool, boolean skipCheckInPersistence,
- ItemType itemType) throws RepositoryException
+ ItemType itemType, boolean createNullItemData) throws RepositoryException
{
long start = 0;
if (log.isDebugEnabled())
@@ -437,7 +480,9 @@
ItemImpl item = null;
try
{
- return item = readItem(getItemData(parent, name, skipCheckInPersistence, itemType), parent, pool, true);
+ return item =
+ readItem(getItemData(parent, name, skipCheckInPersistence, itemType, createNullItemData), parent, pool,
+ true);
}
finally
{
@@ -2817,4 +2862,5 @@
return -i1.getData().getQPath().compareTo(i2.getData().getQPath());
}
}
+
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemAutocreator.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemAutocreator.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemAutocreator.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -118,7 +118,7 @@
{
final ItemData pdata =
avoidCheckExistedChildItems ? null : targetDataManager.getItemData(parent, new QPathEntry(
- ndef.getName(), 0), ItemType.NODE);
+ ndef.getName(), 0), ItemType.NODE, false);
if (pdata == null && !addedNodes.contains(ndef.getName()) || pdata != null && !pdata.isNode())
{
@@ -163,7 +163,7 @@
final ItemData pdata =
avoidCheckExistedChildItems ? null : targetDataManager.getItemData(parent, new QPathEntry(
- pdef.getName(), 0), ItemType.PROPERTY);
+ pdef.getName(), 0), ItemType.PROPERTY, false);
if (pdata == null && !addedProperties.contains(pdef.getName()) || pdata != null && pdata.isNode())
{
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/ACLInheritanceSupportedWorkspaceDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/ACLInheritanceSupportedWorkspaceDataManager.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/ACLInheritanceSupportedWorkspaceDataManager.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -108,12 +108,21 @@
*/
public ItemData getItemData(NodeData parent, QPathEntry name, ItemType itemType) throws RepositoryException
{
- return persistentManager.getItemData(parent, name, itemType);
+ return getItemData(parent, name, itemType, true);
}
/**
* {@inheritDoc}
*/
+ public ItemData getItemData(NodeData parent, QPathEntry name, ItemType itemType, boolean createNullItemData)
+ throws RepositoryException
+ {
+ return persistentManager.getItemData(parent, name, itemType, createNullItemData);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public ItemData getItemData(String identifier) throws RepositoryException
{
return persistentManager.getItemData(identifier);
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -723,6 +723,16 @@
public ItemData getItemData(final NodeData parentData, final QPathEntry name, final ItemType itemType)
throws RepositoryException
{
+ return getItemData(parentData, name, itemType, true);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public ItemData getItemData(final NodeData parentData, final QPathEntry name, final ItemType itemType,
+ final boolean createNullItemData)
+ throws RepositoryException
+ {
if (cache.isEnabled())
{
// 1. Try from cache
@@ -745,7 +755,7 @@
{
public ItemData run() throws RepositoryException
{
- return getPersistedItemData(parentData, name, itemType);
+ return getPersistedItemData(parentData, name, itemType, createNullItemData);
}
});
}
@@ -1732,6 +1742,46 @@
}
/**
+ * Get persisted ItemData.
+ *
+ * @param parentData
+ * parent
+ * @param name
+ * Item name
+ * @param itemType
+ * item type
+ * @param createNullItemData
+ * indicates if nullItem should be created
+ * @return ItemData
+ * @throws RepositoryException
+ * error
+ */
+ protected ItemData getPersistedItemData(NodeData parentData, QPathEntry name, ItemType itemType,
+ boolean createNullItemData) throws RepositoryException
+ {
+ ItemData data = super.getItemData(parentData, name, itemType);
+ if (cache.isEnabled())
+ {
+ if (data != null)
+ {
+ cache.put(data);
+ }
+ else if (createNullItemData)
+ {
+ if (itemType == ItemType.NODE || itemType == ItemType.UNKNOWN)
+ {
+ cache.put(new NullNodeData(parentData, name));
+ }
+ else
+ {
+ cache.put(new NullPropertyData(parentData, name));
+ }
+ }
+ }
+ return data;
+ }
+
+ /**
* Call
* {@link org.exoplatform.services.jcr.impl.dataflow.persistent.WorkspacePersistentDataManager#getItemData(java.lang.String)
* WorkspaceDataManager.getItemDataByIdentifier(java.lang.String)} and cache result if non null returned.
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/ShareableSupportedWorkspaceDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/ShareableSupportedWorkspaceDataManager.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/ShareableSupportedWorkspaceDataManager.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -108,12 +108,21 @@
*/
public ItemData getItemData(NodeData parent, QPathEntry name, ItemType itemType) throws RepositoryException
{
- return persistentManager.getItemData(parent, name, itemType);
+ return getItemData(parent, name, itemType, true);
}
/**
* {@inheritDoc}
*/
+ public ItemData getItemData(NodeData parent, QPathEntry name, ItemType itemType, boolean createNullItemData)
+ throws RepositoryException
+ {
+ return persistentManager.getItemData(parent, name, itemType, createNullItemData);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public ItemData getItemData(String identifier) throws RepositoryException
{
return persistentManager.getItemData(identifier);
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/VersionableWorkspaceDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/VersionableWorkspaceDataManager.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/VersionableWorkspaceDataManager.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -183,15 +183,24 @@
@Override
public ItemData getItemData(NodeData parentData, QPathEntry name, ItemType itemType) throws RepositoryException
{
+ return getItemData(parentData, name, itemType, true);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public ItemData getItemData(NodeData parentData, QPathEntry name, ItemType itemType, boolean createNullItemData)
+ throws RepositoryException
+ {
if (parentData != null)
{
final QPath ipath = QPath.makeChildPath(parentData.getQPath(), name);
if (isSystemDescendant(ipath) && !this.equals(versionDataManager))
{
- return versionDataManager.getItemData(parentData, name, itemType);
+ return versionDataManager.getItemData(parentData, name, itemType, createNullItemData);
}
}
- return super.getItemData(parentData, name, itemType);
+ return super.getItemData(parentData, name, itemType, createNullItemData);
}
/**
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/infinispan/BufferedISPNCache.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/infinispan/BufferedISPNCache.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/infinispan/BufferedISPNCache.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -264,7 +264,8 @@
LOG.error("Unexpected object found by key " + key.toString() + ". Expected Set, but found:"
+ existingObject.getClass().getName());
}
- else if (!localMode && cache.getConfiguration().getCacheMode() != CacheMode.LOCAL)
+ else if (!localMode && cache.getConfiguration().getCacheMode() != CacheMode.LOCAL
+ && cache.getCacheManager().getMembers().size() > 1)
{
// to prevent consistency issue since we don't have the list in the local cache, we are in cluster env
// and we are in a non local mode, we clear the list in order to enforce other cluster nodes to reload it from the db
@@ -328,7 +329,8 @@
LOG.error("Unexpected object found by key " + key.toString() + ". Expected Map, but found:"
+ existingObject.getClass().getName());
}
- else if (!localMode && cache.getConfiguration().getCacheMode() != CacheMode.LOCAL)
+ else if (!localMode && cache.getConfiguration().getCacheMode() != CacheMode.LOCAL
+ && cache.getCacheManager().getMembers().size() > 1)
{
// to prevent consistency issue since we don't have the list in the local cache, we are in cluster env
// and we are in a non local mode, we remove all the patterns in order to enforce other cluster nodes to reload them from the db
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -1090,7 +1090,8 @@
LOG.error("Unexpected object found by FQN:" + getFqn() + " and key:" + key + ". Expected Set, but found:"
+ existingObject.getClass().getName());
}
- else if (!localMode && cache.getConfiguration().getCacheMode() != CacheMode.LOCAL)
+ else if (!localMode && cache.getConfiguration().getCacheMode() != CacheMode.LOCAL
+ && cache.getMembers().size() > 1)
{
// to prevent consistency issue since we don't have the list in the local cache, we are in cluster env
// and we are in a non local mode, we clear the list in order to enforce other cluster nodes to reload it from the db
@@ -1129,7 +1130,7 @@
@Override
public void apply()
{
- if (!localMode && cache.getConfiguration().getCacheMode() != CacheMode.LOCAL)
+ if (!localMode && cache.getConfiguration().getCacheMode() != CacheMode.LOCAL && cache.getMembers().size() > 1)
{
// to prevent consistency issue since we don't have the list in the local cache, we are in cluster env
// and we are in a non local mode, we remove all the patterns in order to enforce other cluster nodes to reload them from the db
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -120,6 +120,15 @@
/**
* {@inheritDoc}
*/
+ public ItemData getItemData(NodeData parentData, QPathEntry name, ItemType itemType, boolean createNullItemData)
+ throws RepositoryException
+ {
+ return copyItemData(storageDataManager.getItemData(parentData, name, itemType, createNullItemData));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public ItemData getItemData(String identifier) throws RepositoryException
{
return copyItemData(storageDataManager.getItemData(identifier));
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/TransactionableDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/TransactionableDataManager.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/TransactionableDataManager.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -349,6 +349,15 @@
*/
public ItemData getItemData(NodeData parentData, QPathEntry name, ItemType itemType) throws RepositoryException
{
+ return getItemData(parentData, name, itemType, true);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public ItemData getItemData(NodeData parentData, QPathEntry name, ItemType itemType, boolean createNullItemData)
+ throws RepositoryException
+ {
ItemData data = null;
if (txStarted())
{
@@ -364,7 +373,7 @@
}
else
{
- return storageDataManager.getItemData(parentData, name, itemType);
+ return storageDataManager.getItemData(parentData, name, itemType, createNullItemData);
}
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -226,7 +226,7 @@
ItemData sameNameNode = null;
try
{
- sameNameNode = dataConsumer.getItemData(parentData, new QPathEntry(name, 0), ItemType.NODE);
+ sameNameNode = dataConsumer.getItemData(parentData, new QPathEntry(name, 0), ItemType.NODE, false);
}
catch (PathNotFoundException e)
{
Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestMultipleListenersNotifying.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestMultipleListenersNotifying.java 2011-09-14 07:05:54 UTC (rev 4908)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestMultipleListenersNotifying.java 2011-09-14 07:17:22 UTC (rev 4909)
@@ -20,6 +20,10 @@
import org.exoplatform.services.jcr.dataflow.ItemStateChangesLog;
import org.exoplatform.services.jcr.dataflow.persistent.ItemsPersistenceListener;
+import org.exoplatform.services.jcr.datamodel.ItemData;
+import org.exoplatform.services.jcr.datamodel.ItemType;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.datamodel.QPathEntry;
import org.exoplatform.services.jcr.impl.storage.SystemDataContainerHolder;
import javax.jcr.InvalidItemStateException;
@@ -48,6 +52,12 @@
{
super.save(new ChangesLogWrapper(changes));
}
+
+ public ItemData getItemData(NodeData parent, QPathEntry name, ItemType itemType, boolean createNullItemData)
+ throws RepositoryException
+ {
+ return null;
+ }
}
class Counter
14 years, 7 months
exo-jcr SVN: r4908 - in jcr/trunk/exo.jcr.component.ext/src: test/java/org/exoplatform/services/jcr/ext/backup and 1 other directories.
by do-not-reply@jboss.org
Author: areshetnyak
Date: 2011-09-14 03:05:54 -0400 (Wed, 14 Sep 2011)
New Revision: 4908
Modified:
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistingWorkspaceSameConfigRestore.java
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java
Log:
EXOJCR-1487 : Repository was suspended for use case of RDBMS restore workspace if using single-db. Suspending of repository is necessary to avoid inconsistency DB, because in during RDBMS restoring is removing constraints on DB.
Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java 2011-09-14 06:03:55 UTC (rev 4907)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java 2011-09-14 07:05:54 UTC (rev 4908)
@@ -954,39 +954,68 @@
WorkspaceInitializerEntry wiEntry = new WorkspaceInitializerEntry();
- if ((Class.forName(fBackupType).equals(FullBackupJob.class)))
+ try
{
- // set the initializer SysViewWorkspaceInitializer
- wiEntry.setType(SysViewWorkspaceInitializer.class.getCanonicalName());
+ if ((Class.forName(fBackupType).equals(FullBackupJob.class)))
+ {
+ // set the initializer SysViewWorkspaceInitializer
+ wiEntry.setType(SysViewWorkspaceInitializer.class.getCanonicalName());
- List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
- wieParams.add(new SimpleParameterEntry(SysViewWorkspaceInitializer.RESTORE_PATH_PARAMETER, pathBackupFile));
+ List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
+ wieParams.add(new SimpleParameterEntry(SysViewWorkspaceInitializer.RESTORE_PATH_PARAMETER, pathBackupFile));
- wiEntry.setParameters(wieParams);
- }
- else if ((Class.forName(fBackupType)
- .equals(org.exoplatform.services.jcr.ext.backup.impl.rdbms.FullBackupJob.class)))
- {
- // set the initializer RdbmsWorkspaceInitializer
- wiEntry.setType(RdbmsWorkspaceInitializer.class.getCanonicalName());
+ wiEntry.setParameters(wieParams);
+ }
+ else if ((Class.forName(fBackupType)
+ .equals(org.exoplatform.services.jcr.ext.backup.impl.rdbms.FullBackupJob.class)))
+ {
+ // set state SUSPENDED to other workspaces if singledb
+ if (workspaceEntry.getContainer().getParameterBoolean("multi-db") == false)
+ {
+ defRep.setState(ManageableRepository.SUSPENDED);
+ }
+ // set the initializer RdbmsWorkspaceInitializer
+ wiEntry.setType(RdbmsWorkspaceInitializer.class.getCanonicalName());
- List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
- wieParams.add(new SimpleParameterEntry(RdbmsWorkspaceInitializer.RESTORE_PATH_PARAMETER, new File(
- pathBackupFile).getParent()));
+ List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
+ wieParams.add(new SimpleParameterEntry(RdbmsWorkspaceInitializer.RESTORE_PATH_PARAMETER, new File(
+ pathBackupFile).getParent()));
- wiEntry.setParameters(wieParams);
- }
+ wiEntry.setParameters(wieParams);
+ }
- workspaceEntry.setInitializer(wiEntry);
+ workspaceEntry.setInitializer(wiEntry);
- //restore
- defRep.configWorkspace(workspaceEntry);
- defRep.createWorkspace(workspaceEntry.getName());
+ //restore
+ defRep.configWorkspace(workspaceEntry);
+ defRep.createWorkspace(workspaceEntry.getName());
- //set original workspace initializer
- WorkspaceContainerFacade wcf = defRep.getWorkspaceContainer(workspaceEntry.getName());
- WorkspaceEntry createdWorkspaceEntry = (WorkspaceEntry)wcf.getComponent(WorkspaceEntry.class);
- createdWorkspaceEntry.setInitializer(wieOriginal);
+ //set original workspace initializer
+ WorkspaceContainerFacade wcf = defRep.getWorkspaceContainer(workspaceEntry.getName());
+ WorkspaceEntry createdWorkspaceEntry = (WorkspaceEntry) wcf.getComponent(WorkspaceEntry.class);
+ createdWorkspaceEntry.setInitializer(wieOriginal);
+ }
+ finally
+ {
+ try
+ {
+ if (workspaceEntry.getContainer().getParameterBoolean("multi-db") == false)
+ {
+ if (defRep.getState() != ManageableRepository.ONLINE)
+ {
+ defRep.setState(ManageableRepository.ONLINE);
+ }
+ }
+ }
+ catch (RepositoryException e)
+ {
+ log.error("Con not set ONLYNE state for repository +\"" + defRep.getName() + "\"", e);
+ }
+ catch (RepositoryConfigurationException e)
+ {
+ log.error("Con not set ONLYNE state for repository +\"" + defRep.getName() + "\"", e);
+ }
+ }
}
private void incrementalRestore(String pathBackupFile, String repositoryName, String workspaceName)
Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistingWorkspaceSameConfigRestore.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistingWorkspaceSameConfigRestore.java 2011-09-14 06:03:55 UTC (rev 4907)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistingWorkspaceSameConfigRestore.java 2011-09-14 07:05:54 UTC (rev 4908)
@@ -74,12 +74,21 @@
try
{
- repositoryService.getRepository(repositoryName).getWorkspaceContainer(wEntry.getName())
- .setState(ManageableRepository.SUSPENDED);
+ ManageableRepository repository = repositoryService.getRepository(repositoryName);
+ if (wEntry.getContainer().getParameterBoolean("multi-db") == false)
+ {
+ repository.setState(ManageableRepository.SUSPENDED);
+ }
+ else
+ {
+ repository.getWorkspaceContainer(wEntry.getName()).setState(
+ ManageableRepository.SUSPENDED);
+ }
+
// get all restorers
List<Backupable> backupable =
- repositoryService.getRepository(repositoryName).getWorkspaceContainer(wEntry.getName())
+ repository.getWorkspaceContainer(wEntry.getName())
.getComponentInstancesOfType(Backupable.class);
File storageDir = backupChainLog.getBackupConfig().getBackupDir();
@@ -105,16 +114,23 @@
restorer.commit();
}
- repositoryService.getRepository(repositoryName).getWorkspaceContainer(wEntry.getName())
- .setState(ManageableRepository.ONLINE);
+ if (wEntry.getContainer().getParameterBoolean("multi-db") == false)
+ {
+ repository.setState(ManageableRepository.ONLINE);
+ }
+ else
+ {
+ repository.getWorkspaceContainer(wEntry.getName()).setState(
+ ManageableRepository.ONLINE);
+ }
// incremental restore
DataManager dataManager =
- (WorkspacePersistentDataManager)repositoryService.getRepository(repositoryName)
- .getWorkspaceContainer(wEntry.getName()).getComponent(WorkspacePersistentDataManager.class);
+ (WorkspacePersistentDataManager) repository.getWorkspaceContainer(wEntry.getName()).getComponent(
+ WorkspacePersistentDataManager.class);
FileCleanerHolder fileCleanHolder =
- (FileCleanerHolder)repositoryService.getRepository(repositoryName).getWorkspaceContainer(wEntry.getName())
+ (FileCleanerHolder) repository.getWorkspaceContainer(wEntry.getName())
.getComponent(FileCleanerHolder.class);
JCRRestore restorer = new JCRRestore(dataManager, fileCleanHolder.getFileCleaner());
@@ -157,8 +173,22 @@
try
{
- repositoryService.getRepository(repositoryName).getWorkspaceContainer(wEntry.getName())
- .setState(ManageableRepository.ONLINE);
+ ManageableRepository repository = repositoryService.getRepository(repositoryName);
+
+ if (wEntry.getContainer().getParameterBoolean("multi-db") == false)
+ {
+ if (repository.getState() != ManageableRepository.ONLINE)
+ {
+ repository.setState(ManageableRepository.ONLINE);
+ }
+ }
+ else
+ {
+ if (repository.getWorkspaceContainer(wEntry.getName()).getState() != ManageableRepository.ONLINE)
+ {
+ repository.getWorkspaceContainer(wEntry.getName()).setState(ManageableRepository.ONLINE);
+ }
+ }
}
catch (RepositoryException e)
{
Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java 2011-09-14 06:03:55 UTC (rev 4907)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java 2011-09-14 07:05:54 UTC (rev 4908)
@@ -20,6 +20,7 @@
import org.exoplatform.commons.utils.PrivilegedFileHelper;
import org.exoplatform.commons.utils.PrivilegedSystemHelper;
import org.exoplatform.services.jcr.config.RepositoryEntry;
+import org.exoplatform.services.jcr.config.SimpleParameterEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.ext.backup.impl.JobRepositoryRestore;
@@ -31,6 +32,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.List;
import java.util.Map;
/**
@@ -1306,6 +1308,107 @@
}
/**
+ * Use JobExistingWorkspaceSameConfigRestore to restore.
+ */
+ public void testExistedWorkspaceRestoreSingleDBTwoWS() throws Exception
+ {
+ // prepare
+ String dsName1 = helper.createDatasource();
+ String dsName2 = helper.createDatasource();
+
+ ManageableRepository repository = helper.createRepository(container, false, dsName1);
+ WorkspaceEntry wsEntry1 = helper.createWorkspaceEntry(false, dsName1);
+ helper.addWorkspace(repository, wsEntry1);
+ addConent(repository, wsEntry1.getName());
+
+ WorkspaceEntry wsEntry2 = helper.createWorkspaceEntry(false, dsName2);
+ helper.addWorkspace(repository, wsEntry2);
+ addConent(repository, wsEntry2.getName());
+
+ // backup
+ File backDir = new File("target/backup/" + IdGenerator.generate());
+ backDir.mkdirs();
+
+ BackupConfig config = new BackupConfig();
+ config.setRepository(repository.getConfiguration().getName());
+ config.setWorkspace(wsEntry1.getName());
+ config.setBackupType(BackupManager.FULL_BACKUP_ONLY);
+ config.setBackupDir(backDir);
+
+ BackupChain bch = backup.startBackup(config);
+ waitEndOfBackup(bch);
+ backup.stopBackup(bch);
+
+ // restore
+ File backLog = new File(bch.getLogFilePath());
+ assertTrue(backLog.exists());
+
+ BackupChainLog bchLog = new BackupChainLog(backLog);
+
+ assertNotNull(bchLog.getStartedTime());
+ assertNotNull(bchLog.getFinishedTime());
+
+ backup.restoreExistingWorkspace(bchLog, repository.getConfiguration().getName(), repository.getConfiguration()
+ .getWorkspaceEntries().get(1), false);
+ checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(1).getName());
+ checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(2).getName());
+ }
+
+ /**
+ * Use JobExistingWorkspaceRestore to restore.
+ */
+ public void testExistedWorkspaceRestoreSingleDBTwoWSWithDiffConfig() throws Exception
+ {
+ // prepare
+ String dsName1 = helper.createDatasource();
+ String dsName2 = helper.createDatasource();
+
+ ManageableRepository repository = helper.createRepository(container, false, dsName1);
+ WorkspaceEntry wsEntry1 = helper.createWorkspaceEntry(false, dsName1);
+ helper.addWorkspace(repository, wsEntry1);
+ addConent(repository, wsEntry1.getName());
+
+ WorkspaceEntry wsEntry2 = helper.createWorkspaceEntry(false, dsName2);
+ helper.addWorkspace(repository, wsEntry2);
+ addConent(repository, wsEntry2.getName());
+
+ // backup
+ File backDir = new File("target/backup/" + IdGenerator.generate());
+ backDir.mkdirs();
+
+ BackupConfig config = new BackupConfig();
+ config.setRepository(repository.getConfiguration().getName());
+ config.setWorkspace(wsEntry1.getName());
+ config.setBackupType(BackupManager.FULL_BACKUP_ONLY);
+ config.setBackupDir(backDir);
+
+ BackupChain bch = backup.startBackup(config);
+ waitEndOfBackup(bch);
+ backup.stopBackup(bch);
+
+ // restore
+ File backLog = new File(bch.getLogFilePath());
+ assertTrue(backLog.exists());
+
+ BackupChainLog bchLog = new BackupChainLog(backLog);
+
+ assertNotNull(bchLog.getStartedTime());
+ assertNotNull(bchLog.getFinishedTime());
+
+ // change cofig
+ WorkspaceEntry wsEntry = helper.copyWorkspaceEntry(repository.getConfiguration().getWorkspaceEntries().get(1));
+
+ List<SimpleParameterEntry> params = wsEntry.getContainer().getParameters();
+ params.set(2, new SimpleParameterEntry("max-buffer-size", "307200"));
+
+ wsEntry.getContainer().setParameters(params);
+
+ backup.restoreExistingWorkspace(bchLog, repository.getConfiguration().getName(), wsEntry, false);
+ checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(1).getName());
+ checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(2).getName());
+ }
+
+ /**
* Set new backup directory in RepositoryBackupChainLog
*
* @param src
Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java 2011-09-14 06:03:55 UTC (rev 4907)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java 2011-09-14 07:05:54 UTC (rev 4908)
@@ -129,8 +129,91 @@
return repository;
}
+
+ /**
+ * Create copy of workspace entry.
+ */
+ public WorkspaceEntry copyWorkspaceEntry(WorkspaceEntry baseWorkspaceEntry) throws Exception
+ {
+ // container entry
+ ArrayList<SimpleParameterEntry> params = new ArrayList<SimpleParameterEntry>();
+ params.addAll(copyList(baseWorkspaceEntry.getContainer().getParameters()));
+ ContainerEntry containerEntry =
+ new ContainerEntry(baseWorkspaceEntry.getContainer().getType(), params);
+ containerEntry.setParameters(params);
+ // value storage
+ ArrayList<ValueStorageEntry> list = new ArrayList<ValueStorageEntry>();
+
+
+ for (ValueStorageEntry baseValueStorageEntry : baseWorkspaceEntry.getContainer().getValueStorages())
+ {
+ ArrayList<ValueStorageFilterEntry> vsparams = new ArrayList<ValueStorageFilterEntry>();
+
+ for (ValueStorageFilterEntry baseValueStorageFilterEntry : baseValueStorageEntry.getFilters())
+ {
+ ValueStorageFilterEntry filterEntry = new ValueStorageFilterEntry();
+ filterEntry.setPropertyType(baseValueStorageFilterEntry.getPropertyType());
+ filterEntry.setPropertyName(baseValueStorageFilterEntry.getPropertyName());
+ filterEntry.setAncestorPath(baseValueStorageFilterEntry.getAncestorPath());
+ filterEntry.setMinValueSize(baseValueStorageFilterEntry.getMinValueSize());
+
+ vsparams.add(filterEntry);
+ }
+
+ ValueStorageEntry valueStorageEntry =
+ new ValueStorageEntry(baseValueStorageEntry.getType(),vsparams);
+ ArrayList<SimpleParameterEntry> spe = new ArrayList<SimpleParameterEntry>();
+ spe.addAll(copyList(baseValueStorageEntry.getParameters()));
+ valueStorageEntry.setId(baseValueStorageEntry.getId());
+ valueStorageEntry.setParameters(spe);
+ valueStorageEntry.setFilters(vsparams);
+
+ // containerEntry.setValueStorages();
+ list.add(valueStorageEntry);
+ }
+
+ containerEntry.setValueStorages(list);
+
+ // Indexer
+ params = new ArrayList<SimpleParameterEntry>();
+ params.addAll(copyList(baseWorkspaceEntry.getQueryHandler().getParameters()));
+ QueryHandlerEntry qEntry =
+ new QueryHandlerEntry(baseWorkspaceEntry.getQueryHandler().getType(), params);
+
+ // Cache
+ params = new ArrayList<SimpleParameterEntry>();
+ params.addAll(copyList(baseWorkspaceEntry.getCache().getParameters()));
+ CacheEntry cacheEntry = new CacheEntry(params);
+ cacheEntry.setType(baseWorkspaceEntry.getCache().getType());
+
+ WorkspaceEntry workspaceEntry = new WorkspaceEntry();
+ workspaceEntry.setContainer(containerEntry);
+ workspaceEntry.setCache(cacheEntry);
+ workspaceEntry.setQueryHandler(qEntry);
+ workspaceEntry.setName(baseWorkspaceEntry.getName());
+ workspaceEntry.setUniqueName(baseWorkspaceEntry.getUniqueName());
+
+ return workspaceEntry;
+
+ }
+
/**
+ * Create copy of list with SimpleParameterEntry-s
+ */
+ private List<SimpleParameterEntry> copyList(List<SimpleParameterEntry> baseArrayList)
+ {
+ ArrayList<SimpleParameterEntry> arrayList = new ArrayList<SimpleParameterEntry>();
+
+ for (SimpleParameterEntry baseParameter : baseArrayList)
+ {
+ arrayList.add(new SimpleParameterEntry(baseParameter.getName(), baseParameter.getValue()));
+ }
+
+ return arrayList;
+ }
+
+ /**
* Create workspace entry.
*/
public WorkspaceEntry createWorkspaceEntry(boolean isMultiDb, String dsName) throws Exception
14 years, 7 months
exo-jcr SVN: r4907 - jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-09-14 02:03:55 -0400 (Wed, 14 Sep 2011)
New Revision: 4907
Modified:
jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/query-handler-config.xml
Log:
EXOJCR-1503: [DOC] improve RDBMS reindexing for PGSQL
Modified: jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/query-handler-config.xml
===================================================================
--- jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/query-handler-config.xml 2011-09-13 15:14:47 UTC (rev 4906)
+++ jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/query-handler-config.xml 2011-09-14 06:03:55 UTC (rev 4907)
@@ -176,9 +176,7 @@
<entry>rdbms-reindexing</entry>
<entry>indicate that need to use rdbms reindexing mechanism if
- possible, the default value is true. To increase the spead of
- re-indexing for PostgreSQL need to set enable_seqscan=off or
- default_statistics_target=50 in configuration of DB</entry>
+ possible, the default value is true</entry>
</row>
<row>
@@ -201,6 +199,15 @@
</tbody>
</tgroup>
</table>
+
+ <note>
+ <para>If you use postgreSQL and the parameter rdbms-reindexing is set
+ to true, the performances of the queries used while indexing can be
+ improved by setting the parameter "enable_seqscan" to "off" or
+ "default_statistics_target" to at least "50" in the configuration of
+ your database. Then you need to restart DB server and make analyze of
+ the JCR_SVALUE (JCR_MVALUE) table.</para>
+ </note>
</section>
<section>
14 years, 7 months
exo-jcr SVN: r4906 - jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-09-13 11:14:47 -0400 (Tue, 13 Sep 2011)
New Revision: 4906
Modified:
jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/query-handler-config.xml
Log:
EXOJCR-1503: improve RDBMS reindexing for PGSQL
Modified: jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/query-handler-config.xml
===================================================================
--- jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/query-handler-config.xml 2011-09-13 14:20:22 UTC (rev 4905)
+++ jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/query-handler-config.xml 2011-09-13 15:14:47 UTC (rev 4906)
@@ -176,7 +176,9 @@
<entry>rdbms-reindexing</entry>
<entry>indicate that need to use rdbms reindexing mechanism if
- possible, the default value is true</entry>
+ possible, the default value is true. To increase the spead of
+ re-indexing for PostgreSQL need to set enable_seqscan=off or
+ default_statistics_target=50 in configuration of DB</entry>
</row>
<row>
14 years, 7 months
exo-jcr SVN: r4905 - in jcr/trunk/exo.jcr.component.core/src: main/java/org/exoplatform/services/jcr/impl/core/query and 2 other directories.
by do-not-reply@jboss.org
Author: nzamosenchuk
Date: 2011-09-13 10:20:22 -0400 (Tue, 13 Sep 2011)
New Revision: 4905
Added:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/AbstractRecoveryFilter.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DocNumberRecoveryFilter.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DummyRecoveryFilter.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SystemPropertyRecoveryFilter.java
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/QueryHandlerParams.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/AbstractQueryHandler.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexRecoveryImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandler.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandlerContext.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchIndexConfigurationHelper.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/SlowQueryHandler.java
Log:
EXOJCR-1505 : feature implemented and tested. When initializing a SearchIndex it checks if local index is really used and instantiates all the filters configured. Each filter in constructor performs required operations like RPC command's registration. And calling stop on SearchManager invoked close() on each filter. This method should free the resources obtained by filter. When filters are initialized index invokes accept() on each one. When any returns true, current indexes dropped and reindexed or retrieved from coordinator node.
There are couple implementations of filters:
- DummyRecoveryFilter: always returns true, for cases when index must be recovered each time;
- SystemPropertyRecoveryFilter : return value of system property;
- DocNumberRecoveryFilter : checks number of documents in index on coordinator side and self-side. Return true is differs.
EXOJCR-1529 : commit contains a fix for this issues also. Additional parameter is passed from SearchManager to MultiIndex.
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/QueryHandlerParams.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/QueryHandlerParams.java 2011-09-13 13:55:32 UTC (rev 4904)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/QueryHandlerParams.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -113,8 +113,10 @@
public static final String PARAM_RDBMS_REINDEXING = "rdbms-reindexing";
- public static final String PARAM_INDEX_RECOVERY_MODE = "index-recovery-mode";
-
public static final String PARAM_ASYNC_REINDEXING = "async-reindexing";
+ public static final String PARAM_INDEX_RECOVERY_MODE = "index-recovery-mode";
+
+ public static final String PARAM_INDEX_RECOVERY_FILTER = "index-recovery-filter";
+
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/AbstractQueryHandler.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/AbstractQueryHandler.java 2011-09-13 13:55:32 UTC (rev 4904)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/AbstractQueryHandler.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -110,7 +110,6 @@
*/
public void init() throws IOException, RepositoryException, RepositoryConfigurationException
{
- // TODO Auto-generated method stub
doInit();
initialized = true;
}
@@ -264,12 +263,4 @@
{
this.indexUpdateMonitor = indexUpdateMonitor;
}
-
- /**
- * @see org.exoplatform.services.jcr.impl.core.query.QueryHandler#setOnline(boolean)
- */
- public void setOnline(boolean isOnline) throws IOException
- {
- setOnline(isOnline, false);
- }
}
\ No newline at end of file
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexRecoveryImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexRecoveryImpl.java 2011-09-13 13:55:32 UTC (rev 4904)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexRecoveryImpl.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -125,7 +125,7 @@
public Serializable execute(Serializable[] args) throws Throwable
{
boolean isOnline = (Boolean)args[0];
- searchManager.setOnline(isOnline);
+ searchManager.setOnline(isOnline, false, false);
IndexRecoveryImpl.this.isOnline = isOnline;
return null;
}
@@ -300,7 +300,7 @@
throw new RepositoryException(e);
}
}
-
+
/**
* @see org.exoplatform.services.jcr.impl.core.query.IndexRecovery#checkIndexReady()
*/
@@ -452,7 +452,7 @@
// node which was responsible for resuming leave the cluster, so resume component
log
.error("Node responsible for setting index back online seems to leave the cluster. Setting back online.");
- searchManager.setOnline(true);
+ searchManager.setOnline(true, false, false);
}
catch (SecurityException e1)
{
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandler.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandler.java 2011-09-13 13:55:32 UTC (rev 4904)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandler.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -200,26 +200,19 @@
/**
* Switches index into corresponding ONLINE or OFFLINE mode. Offline mode means that new indexing data is
- * collected but index is guaranteed to be unmodified during offline state. Queries are denied in offline
- * mode. Please refer to {{@link #setOnline(boolean, boolean)}} if queries must be allowed while index is
- * offline.
- *
- * @param isOnline
- * @throws IOException
- */
- void setOnline(boolean isOnline) throws IOException;
-
- /**
- * Switches index into corresponding ONLINE or OFFLINE mode. Offline mode means that new indexing data is
* collected but index is guaranteed to be unmodified during offline state. Passing the allowQuery flag, can
* allow or deny performing queries on index during offline mode. AllowQuery is not used when setting index
- * back online.
+ * back online. When dropStaleIndexes is set, indexes present on the moment of switching index offline will be
+ * marked as stale and removed on switching it back online.
*
* @param isOnline
* @param allowQuery
+ * doesn't matter, when switching index to online
+ * @param dropStaleIndexes
+ * doesn't matter, when switching index to online
* @throws IOException
*/
- void setOnline(boolean isOnline, boolean allowQuery) throws IOException;
+ void setOnline(boolean isOnline, boolean allowQuery, boolean dropStaleIndexes) throws IOException;
/**
* Offline mode means that new indexing data is collected but index is guaranteed to be unmodified during
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandlerContext.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandlerContext.java 2011-09-13 13:55:32 UTC (rev 4904)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandlerContext.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -72,6 +72,8 @@
private final boolean createInitialIndex;
+ private final boolean recoveryFilterUsed;
+
private final LuceneVirtualTableResolver virtualTableResolver;
/**
@@ -88,7 +90,7 @@
* Field containing RPCService, if any configured in container
*/
private final RPCService rpcService;
-
+
private final String repositoryName;
/**
@@ -121,7 +123,8 @@
public QueryHandlerContext(WorkspaceContainerFacade container, ItemDataConsumer stateMgr, IndexingTree indexingTree,
NodeTypeDataManager nodeTypeDataManager, NamespaceRegistryImpl nsRegistry, QueryHandler parentHandler,
String indexDirectory, DocumentReaderService extractor, boolean createInitialIndex,
- LuceneVirtualTableResolver virtualTableResolver, IndexRecovery indexRecovery, RPCService rpcService, String repositoryName)
+ boolean useIndexRecoveryFilters, LuceneVirtualTableResolver virtualTableResolver, IndexRecovery indexRecovery,
+ RPCService rpcService, String repositoryName)
{
this.indexRecovery = indexRecovery;
this.container = container;
@@ -137,6 +140,7 @@
this.rpcService = rpcService;
this.parentHandler = parentHandler;
this.repositoryName = repositoryName;
+ this.recoveryFilterUsed = useIndexRecoveryFilters;
((NodeTypeDataManagerImpl)this.nodeTypeDataManager).addListener(propRegistry);
}
@@ -165,6 +169,14 @@
}
/**
+ * @return the recoveryFilterUsed
+ */
+ public boolean isRecoveryFilterUsed()
+ {
+ return recoveryFilterUsed;
+ }
+
+ /**
* Returns the persistent {@link ItemStateManager} of the workspace this
* <code>QueryHandler</code> is based on.
*
@@ -256,7 +268,7 @@
{
return rpcService;
}
-
+
/**
* @return
* The name of current repository
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchIndexConfigurationHelper.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchIndexConfigurationHelper.java 2011-09-13 13:55:32 UTC (rev 4904)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchIndexConfigurationHelper.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -202,5 +202,9 @@
{
searchIndex.setAsyncReindexing(Boolean.parseBoolean(value));
}
+ else if (QueryHandlerParams.PARAM_INDEX_RECOVERY_FILTER.equals(name))
+ {
+ searchIndex.addRecoveryFilterClass(value);
+ }
}
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java 2011-09-13 13:55:32 UTC (rev 4904)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -18,9 +18,9 @@
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
-import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.WildcardQuery;
+import org.apache.lucene.search.BooleanClause.Occur;
import org.exoplatform.commons.utils.PrivilegedFileHelper;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.configuration.ConfigurationManager;
@@ -237,7 +237,7 @@
* Switches index between online and offline modes
*/
private RemoteCommand changeIndexState;
-
+
private final ExoContainerContext ctx;
private String hotReindexingState = "not stated";
@@ -754,10 +754,18 @@
throw new RepositoryConfigurationException(e);
}
+ // Recovery Filters are
+ String changesFilterClassName = config.getParameterValue(QueryHandlerParams.PARAM_CHANGES_FILTER_CLASS, null);
+
+ boolean recoveryFilterUsed =
+ (org.exoplatform.services.jcr.impl.core.query.ispn.LocalIndexChangesFilter.class.getName().equals(
+ changesFilterClassName) || org.exoplatform.services.jcr.impl.core.query.jbosscache.LocalIndexChangesFilter.class
+ .getName().equals(changesFilterClassName)) ? true : false;
+
QueryHandlerContext context =
new QueryHandlerContext(container, itemMgr, indexingTree, nodeTypeDataManager, nsReg, parentHandler,
- PrivilegedFileHelper.getAbsolutePath(getIndexDirectory()), extractor, true, virtualTableResolver,
- indexRecovery, rpcService, repositoryName);
+ PrivilegedFileHelper.getAbsolutePath(getIndexDirectory()), extractor, true, recoveryFilterUsed,
+ virtualTableResolver, indexRecovery, rpcService, repositoryName);
return context;
}
@@ -918,7 +926,8 @@
catch (NoSuchMethodException e)
{
// No constructor with the workspace id can be found so we use the default constructor
- Constructor<?> constuctor = qHandlerClass.getConstructor(QueryHandlerEntry.class, ConfigurationManager.class);
+ Constructor<?> constuctor =
+ qHandlerClass.getConstructor(QueryHandlerEntry.class, ConfigurationManager.class);
handler = (QueryHandler)constuctor.newInstance(config, cfm);
}
QueryHandler parentHandler = (this.parentSearchManager != null) ? parentSearchManager.getHandler() : null;
@@ -1114,28 +1123,22 @@
}
/**
- * Switches index into online or offline modes.
+ * Switches index into corresponding ONLINE or OFFLINE mode. Offline mode means that new indexing data is
+ * collected but index is guaranteed to be unmodified during offline state. Passing the allowQuery flag, can
+ * allow or deny performing queries on index during offline mode. AllowQuery is not used when setting index
+ * back online. When dropStaleIndexes is set, indexes present on the moment of switching index offline will be
+ * marked as stale and removed on switching it back online.
*
* @param isOnline
- * @throws IOException
- */
- public void setOnline(boolean isOnline) throws IOException
- {
- // deny queries
- handler.setOnline(isOnline, false);
- }
-
- /**
- * Switches index into online or offline modes. Passing the allowQuery flag, can
- * allow or deny performing queries on index during offline mode
- *
- * @param isOnline
* @param allowQuery
+ * doesn't matter, when switching index to online
+ * @param dropStaleIndexes
+ * doesn't matter, when switching index to online
* @throws IOException
*/
- public void setOnline(boolean isOnline, boolean allowQuery) throws IOException
+ public void setOnline(boolean isOnline, boolean allowQuery, boolean dropStaleIndexes) throws IOException
{
- handler.setOnline(isOnline, allowQuery);
+ handler.setOnline(isOnline, allowQuery, dropStaleIndexes);
}
public boolean isOnline()
@@ -1217,7 +1220,7 @@
}
else
{
- handler.setOnline(false, !dropExisting);
+ handler.setOnline(false, !dropExisting, true);
}
// launch reindexing thread safely, resume nodes if any exception occurs
if (handler instanceof SearchIndex)
@@ -1270,7 +1273,7 @@
{
try
{
- handler.setOnline(true, true);
+ handler.setOnline(true, true, true);
}
catch (IOException e)
{
@@ -1416,7 +1419,7 @@
{
boolean isOnline = (Boolean)args[0];
boolean allowQuery = (args.length == 2) ? (Boolean)args[1] : false;
- SearchManager.this.setOnline(isOnline, allowQuery);
+ SearchManager.this.setOnline(isOnline, allowQuery, true);
return null;
}
});
Added: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/AbstractRecoveryFilter.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/AbstractRecoveryFilter.java (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/AbstractRecoveryFilter.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.query.lucene;
+
+import org.exoplatform.services.jcr.impl.core.query.QueryHandlerContext;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * @author <a href="mailto:nzamosenchuk@exoplatform.com">Nikolay Zamosenchuk</a>
+ * @version $Id: AbstractRecoveryFilter.java 34360 2009-07-22 23:58:59Z nzamosenchuk $
+ *
+ */
+public abstract class AbstractRecoveryFilter
+{
+
+ protected SearchIndex searchIndex;
+
+ protected QueryHandlerContext context;
+
+ /**
+ * Default constructor accepting searchIndex instance
+ * @param searchIndex
+ */
+ public AbstractRecoveryFilter(SearchIndex searchIndex)
+ {
+ this.searchIndex = searchIndex;
+ this.context = searchIndex.getContext();
+ }
+
+ /**
+ * Frees resources associated with current filter
+ */
+ public void close()
+ {
+
+ }
+
+ /**
+ * @return true if index should be re-retrieved on JCR start
+ */
+ public abstract boolean accept() throws RepositoryException;
+
+}
Property changes on: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/AbstractRecoveryFilter.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DocNumberRecoveryFilter.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DocNumberRecoveryFilter.java (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DocNumberRecoveryFilter.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.query.lucene;
+
+import org.exoplatform.services.rpc.RPCException;
+import org.exoplatform.services.rpc.RPCService;
+import org.exoplatform.services.rpc.RemoteCommand;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.Serializable;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * Filter asks coordinator for the number of documents in it's index. Returns true
+ * is it differs with local index.
+ *
+ * @author <a href="mailto:nzamosenchuk@exoplatform.com">Nikolay Zamosenchul</a>
+ * @version $Id: DocNumberRecoveryFilter.java 34360 2009-07-22 23:58:59Z nzamosenchuk $
+ */
+public class DocNumberRecoveryFilter extends AbstractRecoveryFilter
+{
+
+ private static final Logger log = LoggerFactory.getLogger("exo.jcr.component.core.index.DocNumberRecoveryFilter");
+
+ protected RemoteCommand getDocsNumCommand;
+
+ protected RPCService rpcService;
+
+ /**
+ * @param searchIndex
+ */
+ public DocNumberRecoveryFilter(SearchIndex searchIndex)
+ {
+ super(searchIndex);
+
+ rpcService = context.getRPCService();
+
+ getDocsNumCommand = rpcService.registerCommand(new RemoteCommand()
+ {
+ public String getId()
+ {
+ return "org.exoplatform.services.jcr.impl.core.query.lucene.DocNumberRecoveryFilter-getDocNum-"
+ + DocNumberRecoveryFilter.this.searchIndex.getWsId() + "-"
+ + (DocNumberRecoveryFilter.this.searchIndex.getContext().getParentHandler() == null);
+ }
+
+ public Serializable execute(Serializable[] args) throws Throwable
+ {
+ log.info("Remote command invoked");
+ return Integer.valueOf(DocNumberRecoveryFilter.this.searchIndex.getIndex().numDocs());
+ }
+ });
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean accept() throws RepositoryException
+ {
+ try
+ {
+ if (!rpcService.isCoordinator())
+ {
+ Integer docsNumber = (Integer)rpcService.executeCommandOnCoordinator(getDocsNumCommand, true);
+ log.info("Remote result received: " + docsNumber + " and local is: " + searchIndex.getIndex().numDocs());
+ return docsNumber.intValue() != searchIndex.getIndex().numDocs();
+ }
+ // if current node is coordinator
+ return false;
+ }
+ catch (SecurityException e)
+ {
+ throw new RepositoryException(e.getMessage(), e);
+ }
+ catch (RPCException e)
+ {
+ throw new RepositoryException(e.getMessage(), e);
+ }
+ catch (IOException e)
+ {
+ throw new RepositoryException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public void close()
+ {
+ rpcService.unregisterCommand(getDocsNumCommand);
+ super.close();
+ }
+
+}
Property changes on: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DocNumberRecoveryFilter.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DummyRecoveryFilter.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DummyRecoveryFilter.java (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DummyRecoveryFilter.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.query.lucene;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * Always returns true, which means that index will be always re-retrieved on node startup
+ *
+ * @author <a href="mailto:nzamosenchuk@exoplatform.com">Nikolay Zamosenchul</a>
+ * @version $Id: DummyRecoveryFilter.java 34360 2009-07-22 23:58:59Z nzamosenchuk $
+ */
+public class DummyRecoveryFilter extends AbstractRecoveryFilter
+{
+
+ /**
+ * @param searchIndex
+ */
+ public DummyRecoveryFilter(SearchIndex searchIndex)
+ {
+ super(searchIndex);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean accept() throws RepositoryException
+ {
+ return true;
+ }
+
+}
Property changes on: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DummyRecoveryFilter.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java 2011-09-13 13:55:32 UTC (rev 4904)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -430,13 +430,26 @@
* @throws IllegalStateException
* if this index is not empty.
*/
- void createInitialIndex(ItemDataConsumer stateMgr) throws IOException
+ void createInitialIndex(ItemDataConsumer stateMgr, boolean doForceReindexing) throws IOException
{
// only do an initial index if there are no indexes at all
boolean indexCreated = false;
+
+ if (doForceReindexing && !indexes.isEmpty())
+ {
+ log.info("Removing stale indexes.");
+
+ List<PersistentIndex> oldIndexes = new ArrayList<PersistentIndex>(indexes);
+ for (PersistentIndex persistentIndex : oldIndexes)
+ {
+ deleteIndex(persistentIndex);
+ }
+ attemptDelete();
+ }
+
if (indexNames.size() == 0)
{
- setOnline(false);
+ setOnline(false, false);
try
{
@@ -513,7 +526,7 @@
}
finally
{
- setOnline(true);
+ setOnline(true, false);
}
}
else
@@ -809,25 +822,28 @@
private void invokeOfflineIndex() throws IOException
{
List<String> processedIDs = offlineIndex.getProcessedIDs();
- // remove all nodes placed in offline index
- update(processedIDs, Collections.<Document> emptyList());
+ if (!processedIDs.isEmpty())
+ {
+ // remove all nodes placed in offline index
+ update(processedIDs, Collections.<Document> emptyList());
- executeAndLog(new Start(Action.INTERNAL_TRANSACTION));
+ executeAndLog(new Start(Action.INTERNAL_TRANSACTION));
- // create index
- CreateIndex create = new CreateIndex(getTransactionId(), null);
- executeAndLog(create);
+ // create index
+ CreateIndex create = new CreateIndex(getTransactionId(), null);
+ executeAndLog(create);
- // invoke offline (copy offline into working index)
- executeAndLog(new OfflineInvoke(getTransactionId(), create.getIndexName()));
+ // invoke offline (copy offline into working index)
+ executeAndLog(new OfflineInvoke(getTransactionId(), create.getIndexName()));
- // add new index
- AddIndex add = new AddIndex(getTransactionId(), create.getIndexName());
- executeAndLog(add);
+ // add new index
+ AddIndex add = new AddIndex(getTransactionId(), create.getIndexName());
+ executeAndLog(add);
- executeAndLog(new Commit(getTransactionId()));
+ executeAndLog(new Commit(getTransactionId()));
- indexNames.write();
+ indexNames.write();
+ }
offlineIndex.close();
deleteIndex(offlineIndex);
offlineIndex = null;
@@ -3361,7 +3377,7 @@
* @param isOnline
* @throws IOException
*/
- public synchronized void setOnline(boolean isOnline) throws IOException
+ public synchronized void setOnline(boolean isOnline, boolean dropStaleIndexes) throws IOException
{
// if mode really changed
if (online != isOnline)
@@ -3404,7 +3420,11 @@
flush();
}
releaseMultiReader();
- staleIndexes.addAll(indexes);
+ if (dropStaleIndexes)
+ {
+ staleIndexes.addAll(indexes);
+ }
+
online = false;
}
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java 2011-09-13 13:55:32 UTC (rev 4904)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -75,6 +75,8 @@
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Arrays;
@@ -521,6 +523,10 @@
*/
protected boolean isSuspended = false;
+ protected Set<String> recoveryFilterClasses = new HashSet<String>();
+
+ protected List<AbstractRecoveryFilter> recoveryFilters = null;
+
/**
* Working constructor.
*
@@ -583,13 +589,13 @@
{
indexDirectory = new File(path);
- if (!indexDirectory.exists())
+ if (!indexDirectory.exists())
+ {
+ if (!indexDirectory.mkdirs())
{
- if (!indexDirectory.mkdirs())
- {
- throw new RepositoryException("fail to create index dir " + path);
- }
+ throw new RepositoryException("fail to create index dir " + path);
}
+ }
}
else
{
@@ -641,7 +647,11 @@
// if RW mode, create initial index and start check
if (modeHandler.getMode() == IndexerIoMode.READ_WRITE)
{
+ // set true if indexRecoveryFilters are required and some filter gives positive flag
final boolean doReindexing = (index.numDocs() == 0 && context.isCreateInitialIndex());
+ // if existing index should be removed
+ final boolean doForceReindexing = (context.isRecoveryFilterUsed() && isIndexRecoveryRequired());
+
final boolean doCheck = (consistencyCheckEnabled && (index.getRedoLogApplied() || forceConsistencyCheck));
final ItemDataConsumer itemStateManager = context.getItemStateManager();
@@ -654,7 +664,7 @@
{
try
{
- reindex(doReindexing, doCheck, itemStateManager);
+ reindex(doReindexing, doForceReindexing, doCheck, itemStateManager);
}
catch (IOException e)
{
@@ -668,7 +678,7 @@
}
else
{
- reindex(doReindexing, doCheck, itemStateManager);
+ reindex(doReindexing, doForceReindexing, doCheck, itemStateManager);
}
}
// initialize spell checker
@@ -700,12 +710,100 @@
return wsId;
}
- private void reindex(boolean doReindexing, boolean doCheck, ItemDataConsumer itemStateManager) throws IOException
+ /**
+ * Adds new recovery filter to existing list.
+ *
+ * @param recoveryFilterClassName
+ */
+ public void addRecoveryFilterClass(String recoveryFilterClassName)
{
- if (doReindexing)
+ recoveryFilterClasses.add(recoveryFilterClassName);
+ }
+
+ /**
+ * Invokes all recovery filters from the set
+ * @return true if any filter requires reindexing
+ */
+ @SuppressWarnings("unchecked")
+ private boolean isIndexRecoveryRequired() throws RepositoryException
+ {
+ // instantiate filters first, if not initialized
+ if (recoveryFilters == null)
{
- index.createInitialIndex(itemStateManager);
+ recoveryFilters = new ArrayList<AbstractRecoveryFilter>();
+ log.info("Initializing RecoveryFilters.");
+ for (String recoveryFilterClassName : recoveryFilterClasses)
+ {
+ AbstractRecoveryFilter filter = null;
+ Class<? extends AbstractRecoveryFilter> filterClass;
+ try
+ {
+ filterClass =
+ (Class<? extends AbstractRecoveryFilter>)Class.forName(recoveryFilterClassName, true, this.getClass()
+ .getClassLoader());
+ Constructor<? extends AbstractRecoveryFilter> constuctor = filterClass.getConstructor(SearchIndex.class);
+ filter = constuctor.newInstance(this);
+ recoveryFilters.add(filter);
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new RepositoryException(e.getMessage(), e);
+ }
+ catch (IllegalArgumentException e)
+ {
+ throw new RepositoryException(e.getMessage(), e);
+ }
+ catch (InstantiationException e)
+ {
+ throw new RepositoryException(e.getMessage(), e);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new RepositoryException(e.getMessage(), e);
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new RepositoryException(e.getMessage(), e);
+ }
+ catch (SecurityException e)
+ {
+ throw new RepositoryException(e.getMessage(), e);
+ }
+ catch (NoSuchMethodException e)
+ {
+ throw new RepositoryException(e.getMessage(), e);
+ }
+ }
}
+
+ // invoke filters
+ for (AbstractRecoveryFilter filter : recoveryFilters)
+ {
+ if (filter.accept())
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @param doReindexing
+ * performs indexing if set to true
+ * @param doForceReindexing
+ * skips index existence check
+ * @param doCheck
+ * checks index
+ * @param itemStateManager
+ * @throws IOException
+ */
+ private void reindex(boolean doReindexing, boolean doForceReindexing, boolean doCheck,
+ ItemDataConsumer itemStateManager) throws IOException
+ {
+ if (doReindexing || doForceReindexing)
+ {
+ index.createInitialIndex(itemStateManager, doForceReindexing);
+ }
if (doCheck)
{
log.info("Running consistency check...");
@@ -974,6 +1072,17 @@
*/
public void close()
{
+ // cleanup resources obtained by filters
+ if (recoveryFilters != null)
+ {
+ for (AbstractRecoveryFilter filter : recoveryFilters)
+ {
+ filter.close();
+ }
+ recoveryFilters.clear();
+ recoveryFilters = null;
+ }
+
if (synonymProviderConfigFs != null)
{
try
@@ -1902,7 +2011,7 @@
if (log.isDebugEnabled())
{
time = System.currentTimeMillis() - time;
- log.debug("Retrieved {} aggregate roots in {} ms.", new Integer(found), new Long(time));
+ log.debug("Retrieved {} aggregate roots in {} ms.", new Integer(found), new Long(time));
}
}
}
@@ -3042,7 +3151,7 @@
/**
* @see org.exoplatform.services.jcr.impl.core.query.QueryHandler#setOnline(boolean, boolean)
*/
- public void setOnline(boolean isOnline, boolean allowQuery) throws IOException
+ public void setOnline(boolean isOnline, boolean allowQuery, boolean dropStaleIndexes) throws IOException
{
checkOpen();
if (isOnline)
@@ -3053,7 +3162,7 @@
{
this.allowQuery = allowQuery;
}
- index.setOnline(isOnline);
+ index.setOnline(isOnline, dropStaleIndexes);
}
/**
Added: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SystemPropertyRecoveryFilter.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SystemPropertyRecoveryFilter.java (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SystemPropertyRecoveryFilter.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.query.lucene;
+
+import org.exoplatform.commons.utils.PropertyManager;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * Filter returns the value of system property "org.exoplatform.jcr.recoveryfilter.forcereindexing"
+ *
+ * @author <a href="mailto:nzamosenchuk@exoplatform.com">Nikolay Zamosenchul</a>
+ * @version $Id: SystemPropertyRecoveryFilter.java 34360 2009-07-22 23:58:59Z nzamosenchuk $
+ */
+public class SystemPropertyRecoveryFilter extends AbstractRecoveryFilter
+{
+
+ public static final String FORCE_REINDEXING_RECOVERY_FILTER_PROPERTY =
+ "org.exoplatform.jcr.recoveryfilter.forcereindexing";
+
+ /**
+ * @param searchIndex
+ */
+ public SystemPropertyRecoveryFilter(SearchIndex searchIndex)
+ {
+ super(searchIndex);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean accept() throws RepositoryException
+ {
+ return Boolean.valueOf(PropertyManager.getProperty(FORCE_REINDEXING_RECOVERY_FILTER_PROPERTY));
+ }
+}
Property changes on: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SystemPropertyRecoveryFilter.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/SlowQueryHandler.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/SlowQueryHandler.java 2011-09-13 13:55:32 UTC (rev 4904)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/SlowQueryHandler.java 2011-09-13 14:20:22 UTC (rev 4905)
@@ -116,9 +116,9 @@
}
/**
- * @see org.exoplatform.services.jcr.impl.core.query.QueryHandler#setOnline(boolean, boolean)
+ * @see org.exoplatform.services.jcr.impl.core.query.QueryHandler#setOnline(boolean, boolean, boolean)
*/
- public void setOnline(boolean isOnline, boolean allowQuery) throws IOException
+ public void setOnline(boolean isOnline, boolean allowQuery, boolean dropStaleIndexes) throws IOException
{
// TODO Auto-generated method stub
14 years, 7 months
exo-jcr SVN: r4904 - jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/core.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-09-13 09:55:32 -0400 (Tue, 13 Sep 2011)
New Revision: 4904
Modified:
jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/core/ldap-configuration.xml
Log:
EXOJCR-1530: [DOC] Connections leaks in LDAP OrganizationService
Modified: jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/core/ldap-configuration.xml
===================================================================
--- jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/core/ldap-configuration.xml 2011-09-13 13:08:32 UTC (rev 4903)
+++ jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/core/ldap-configuration.xml 2011-09-13 13:55:32 UTC (rev 4904)
@@ -111,6 +111,9 @@
<field name="version"><string>3</string></field>
<field name="referralMode"><string>follow</string></field>
<!-- field name="serverName"><string>active.directory</string></field-->
+ <field name="minConnection"><int>5</int></field>
+ <field name="maxConnection"><int>10</int></field>
+ <field name="timeout"><int>50000</int></field>
</object>
</object-param>
</init-params>
@@ -163,6 +166,24 @@
servers. Any other value will be ignore and the service will act as
on a standard LDAP.</para>
</listitem>
+
+ <listitem>
+ <para><emphasis role="bold">maxConnection</emphasis>: the maximum
+ number of connections per connection identity that can be maintained
+ concurrently.</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis role="bold">minConnection</emphasis>: the number of
+ connections per connection identity to create when initially
+ creating a connection for the identity.</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis role="bold">timeout</emphasis>: the number of
+ milliseconds that an idle connection may remain in the pool without
+ being closed and removed from the pool.</para>
+ </listitem>
</itemizedlist>
</section>
14 years, 7 months
exo-jcr SVN: r4903 - core/trunk/exo.core.component.ldap/src/main/java/org/exoplatform/services/ldap/impl.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-09-13 09:08:32 -0400 (Tue, 13 Sep 2011)
New Revision: 4903
Modified:
core/trunk/exo.core.component.ldap/src/main/java/org/exoplatform/services/ldap/impl/LDAPConnectionConfig.java
core/trunk/exo.core.component.ldap/src/main/java/org/exoplatform/services/ldap/impl/LDAPServiceImpl.java
Log:
EXOJCR-1530: Connections leaks in LDAP OrganizationService
Modified: core/trunk/exo.core.component.ldap/src/main/java/org/exoplatform/services/ldap/impl/LDAPConnectionConfig.java
===================================================================
--- core/trunk/exo.core.component.ldap/src/main/java/org/exoplatform/services/ldap/impl/LDAPConnectionConfig.java 2011-09-13 12:58:47 UTC (rev 4902)
+++ core/trunk/exo.core.component.ldap/src/main/java/org/exoplatform/services/ldap/impl/LDAPConnectionConfig.java 2011-09-13 13:08:32 UTC (rev 4903)
@@ -40,6 +40,8 @@
private int maxConnection;
+ private int timeout;
+
private String referralMode = "follow";
public String getRootDN()
@@ -72,6 +74,11 @@
this.version = v;
}
+ public void setTimeout(int timeout)
+ {
+ this.timeout = timeout;
+ }
+
public String getAuthenticationType()
{
return authenticationType;
@@ -97,6 +104,11 @@
return this.maxConnection;
}
+ public int getTimeout()
+ {
+ return timeout;
+ }
+
public void setMaxConnection(int n)
{
this.maxConnection = n;
Modified: core/trunk/exo.core.component.ldap/src/main/java/org/exoplatform/services/ldap/impl/LDAPServiceImpl.java
===================================================================
--- core/trunk/exo.core.component.ldap/src/main/java/org/exoplatform/services/ldap/impl/LDAPServiceImpl.java 2011-09-13 12:58:47 UTC (rev 4902)
+++ core/trunk/exo.core.component.ldap/src/main/java/org/exoplatform/services/ldap/impl/LDAPServiceImpl.java 2011-09-13 13:08:32 UTC (rev 4903)
@@ -32,7 +32,6 @@
import java.io.File;
import java.util.HashMap;
import java.util.Hashtable;
-import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -85,8 +84,12 @@
env.put(Context.SECURITY_PRINCIPAL, config.getRootDN());
env.put(Context.SECURITY_CREDENTIALS, config.getPassword());
- PrivilegedSystemHelper.setProperty("com.sun.jndi.ldap.connect.timeout", "60000");
-
+ if (config.getTimeout() > 0)
+ {
+ PrivilegedSystemHelper.setProperty("com.sun.jndi.ldap.connect.pool.timeout",
+ Integer.toString(config.getTimeout()));
+ }
+
if (config.getMinConnection() > 0)
{
PrivilegedSystemHelper.setProperty("com.sun.jndi.ldap.connect.pool.initsize",
@@ -205,46 +208,6 @@
*/
public void addDeleteObject(ComponentPlugin plugin) throws NamingException
{
- if (false && plugin instanceof DeleteObjectCommand)
- {
- DeleteObjectCommand command = (DeleteObjectCommand)plugin;
- List<String> objectsToDelete = command.getObjectsToDelete();
- if (objectsToDelete == null || objectsToDelete.size() == 0)
- return;
- LdapContext ctx = getLdapContext();
- for (String name : objectsToDelete)
- {
- try
- {
- try
- {
- unbind(ctx, name);
- }
- catch (CommunicationException e1)
- {
- // create new LDAP context
- ctx = getLdapContext(true);
- // try repeat operation where communication error occurs
- unbind(ctx, name);
- }
- catch (ServiceUnavailableException e2)
- {
- // do the same as for CommunicationException
- ctx = getLdapContext(true);
- //
- unbind(ctx, name);
- }
- }
- catch (Exception e3)
- {
- // Catch all exceptions here.
- // Just inform about exception if it is not connection problem.
- LOG.error("Remove object (" + name + ") failed. ", e3);
- }
- }
- // close context
- release(ctx);
- }
}
private void unbind(LdapContext ctx, String name) throws NamingException
14 years, 7 months
exo-jcr SVN: r4902 - core/branches/2.3.x/patch/2.3.10/COR-237.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-09-13 08:58:47 -0400 (Tue, 13 Sep 2011)
New Revision: 4902
Modified:
core/branches/2.3.x/patch/2.3.10/COR-237/COR-237.patch
Log:
COR-237: patch updated
Modified: core/branches/2.3.x/patch/2.3.10/COR-237/COR-237.patch
===================================================================
--- core/branches/2.3.x/patch/2.3.10/COR-237/COR-237.patch 2011-09-13 12:48:46 UTC (rev 4901)
+++ core/branches/2.3.x/patch/2.3.10/COR-237/COR-237.patch 2011-09-13 12:58:47 UTC (rev 4902)
@@ -7,10 +7,9 @@
env.put(Context.SECURITY_PRINCIPAL, config.getRootDN());
env.put(Context.SECURITY_CREDENTIALS, config.getPassword());
- // TODO move it in configuration ?
-- env.put("com.sun.jndi.ldap.connect.timeout", "60000");
-
-+ System.setProperty("com.sun.jndi.ldap.connect.timeout", "60000");
+
+ env.put("com.sun.jndi.ldap.connect.timeout", "60000");
+
+ if (config.getMinConnection() > 0)
+ {
+ System.setProperty("com.sun.jndi.ldap.connect.pool.initsize", Integer.toString(config.getMinConnection()));
14 years, 7 months
exo-jcr SVN: r4901 - core/branches.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-09-13 08:48:46 -0400 (Tue, 13 Sep 2011)
New Revision: 4901
Removed:
core/branches/2.4.0-GA-CP02-SNAPSHOT/
Log:
EXOJCR-1528: delete branch
14 years, 7 months