[exo-jcr-commits] exo-jcr SVN: r3677 - in jcr/trunk/exo.jcr.component.ext/src: test/java/org/exoplatform/services/jcr/ext/backup and 1 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Fri Dec 17 06:44:30 EST 2010
Author: tolusha
Date: 2010-12-17 06:44:29 -0500 (Fri, 17 Dec 2010)
New Revision: 3677
Modified:
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsBackupWorkspaceInitializer.java
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/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsWorkspaceInitializer.java
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/TesterRdbmsWorkspaceInitializer.java
Log:
EXOJCR-1078: support rollback changes in case of errors
Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsBackupWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsBackupWorkspaceInitializer.java 2010-12-17 10:46:17 UTC (rev 3676)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsBackupWorkspaceInitializer.java 2010-12-17 11:44:29 UTC (rev 3677)
@@ -16,6 +16,7 @@
*/
package org.exoplatform.services.jcr.ext.backup.impl.rdbms;
+import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.access.AccessManager;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.config.RepositoryEntry;
@@ -27,9 +28,12 @@
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
import org.exoplatform.services.jcr.impl.dataflow.persistent.CacheableWorkspaceDataManager;
+import org.exoplatform.services.jcr.impl.util.jdbc.cleaner.DBCleanerException;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
+import java.io.IOException;
+
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
@@ -54,10 +58,11 @@
public RdbmsBackupWorkspaceInitializer(WorkspaceEntry config, RepositoryEntry repConfig,
CacheableWorkspaceDataManager dataManager, NamespaceRegistryImpl namespaceRegistry,
LocationFactory locationFactory, NodeTypeManagerImpl nodeTypeManager, ValueFactoryImpl valueFactory,
- AccessManager accessManager) throws RepositoryConfigurationException, PathNotFoundException, RepositoryException
+ AccessManager accessManager, RepositoryService repositoryService) throws RepositoryConfigurationException,
+ PathNotFoundException, RepositoryException
{
super(config, repConfig, dataManager, namespaceRegistry, locationFactory, nodeTypeManager, valueFactory,
- accessManager);
+ accessManager, repositoryService);
}
/**
@@ -73,11 +78,34 @@
long start = System.currentTimeMillis();
- // restore from full rdbms backup
- fullRdbmsRestore();
+ try
+ {
+ // restore from full rdbms backup
+ fullRdbmsRestore();
- // restore from incremental backup
- incrementalRead();
+ // restore from incremental backup
+ incrementalRead();
+ }
+ catch (Throwable e)
+ {
+ try
+ {
+ rollback();
+ }
+ catch (RepositoryConfigurationException e1)
+ {
+ throw new RepositoryException("Can't rollback changes", e);
+ }
+ catch (DBCleanerException e1)
+ {
+ throw new RepositoryException("Can't rollback changes", e);
+ }
+ catch (IOException e1)
+ {
+ throw new RepositoryException("Can't rollback changes", e);
+ }
+ throw new RepositoryException(e);
+ }
final NodeData root = (NodeData)dataManager.getItemData(Constants.ROOT_UUID);
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 2010-12-17 10:46:17 UTC (rev 3676)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsWorkspaceInitializer.java 2010-12-17 11:44:29 UTC (rev 3677)
@@ -20,6 +20,7 @@
import org.exoplatform.commons.utils.PrivilegedFileHelper;
import org.exoplatform.commons.utils.SecurityHelper;
+import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.access.AccessManager;
import org.exoplatform.services.jcr.config.LockManagerEntry;
import org.exoplatform.services.jcr.config.QueryHandlerParams;
@@ -27,12 +28,17 @@
import org.exoplatform.services.jcr.config.RepositoryEntry;
import org.exoplatform.services.jcr.config.ValueStorageEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
+import org.exoplatform.services.jcr.core.ManageableRepository;
+import org.exoplatform.services.jcr.core.WorkspaceContainerFacade;
import org.exoplatform.services.jcr.dataflow.serialization.ObjectReader;
import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.ext.backup.impl.IndexCleanHelper;
+import org.exoplatform.services.jcr.ext.backup.impl.ValueStorageCleanHelper;
import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.core.BackupWorkspaceInitializer;
import org.exoplatform.services.jcr.impl.core.LocationFactory;
import org.exoplatform.services.jcr.impl.core.NamespaceRegistryImpl;
+import org.exoplatform.services.jcr.impl.core.SessionRegistry;
import org.exoplatform.services.jcr.impl.core.lock.cacheable.AbstractCacheableLockManager;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
import org.exoplatform.services.jcr.impl.core.query.SystemSearchManager;
@@ -43,6 +49,8 @@
import org.exoplatform.services.jcr.impl.storage.jdbc.DialectDetecter;
import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer;
import org.exoplatform.services.jcr.impl.storage.value.fs.FileValueStorage;
+import org.exoplatform.services.jcr.impl.util.jdbc.cleaner.DBCleanerException;
+import org.exoplatform.services.jcr.impl.util.jdbc.cleaner.DBCleanerService;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
@@ -83,6 +91,10 @@
*/
protected static final Log log = ExoLogger.getLogger("exo.jcr.component.core.RdbmsWorkspaceInitializer");
+ /**
+ * The repository service.
+ */
+ protected final RepositoryService repositoryService;
/**
* List of temporary files.
@@ -95,10 +107,13 @@
public RdbmsWorkspaceInitializer(WorkspaceEntry config, RepositoryEntry repConfig,
CacheableWorkspaceDataManager dataManager, NamespaceRegistryImpl namespaceRegistry,
LocationFactory locationFactory, NodeTypeManagerImpl nodeTypeManager, ValueFactoryImpl valueFactory,
- AccessManager accessManager) throws RepositoryConfigurationException, PathNotFoundException, RepositoryException
+ AccessManager accessManager, RepositoryService repositoryService) throws RepositoryConfigurationException,
+ PathNotFoundException, RepositoryException
{
super(config, repConfig, dataManager, namespaceRegistry, locationFactory, nodeTypeManager, valueFactory,
accessManager);
+
+ this.repositoryService = repositoryService;
}
/**
@@ -114,7 +129,30 @@
long start = System.currentTimeMillis();
- fullRdbmsRestore();
+ try
+ {
+ fullRdbmsRestore();
+ }
+ catch (Throwable e)
+ {
+ try
+ {
+ rollback();
+ }
+ catch (RepositoryConfigurationException e1)
+ {
+ throw new RepositoryException("Can't rollback changes", e);
+ }
+ catch (DBCleanerException e1)
+ {
+ throw new RepositoryException("Can't rollback changes", e);
+ }
+ catch (IOException e1)
+ {
+ throw new RepositoryException("Can't rollback changes", e);
+ }
+ throw new RepositoryException(e);
+ }
final NodeData root = (NodeData)dataManager.getItemData(Constants.ROOT_UUID);
@@ -278,18 +316,6 @@
}
catch (SQLException e)
{
- if (jdbcConn != null)
- {
- try
- {
- jdbcConn.rollback();
- }
- catch (SQLException e1)
- {
- log.error("Rollback error", e1);
- }
- }
-
SQLException next = e.getNextException();
String errorTrace = "";
while (next != null)
@@ -392,13 +418,57 @@
/**
* Rollback changes due to errors.
+ *
+ * @throws RepositoryConfigurationException
+ * @throws RepositoryException
+ * @throws DBCleanerException
+ * @throws IOException
*/
- protected void rollback(Connection jdbcConn)
+ protected void rollback() throws RepositoryException, RepositoryConfigurationException, DBCleanerException,
+ IOException
{
- // TODO
+ boolean isSystem =
+ repositoryService.getRepository(repositoryEntry.getName()).getConfiguration().getSystemWorkspaceName()
+ .equals(workspaceEntry.getName());
+
+ //close all session
+ forceCloseSession(repositoryEntry.getName(), workspaceEntry.getName());
+
+ //clean database
+ new DBCleanerService().cleanWorkspaceData(workspaceEntry);
+
+ //clean index
+ new IndexCleanHelper().removeWorkspaceIndex(workspaceEntry, isSystem);
+
+ //clean value storage
+ new ValueStorageCleanHelper().removeWorkspaceValueStorage(workspaceEntry);
}
/**
+ * Close sessions on specific workspace.
+ *
+ * @param repositoryName
+ * repository name
+ * @param workspaceName
+ * workspace name
+ * @return int return the how many sessions was closed
+ * @throws RepositoryConfigurationException
+ * will be generate RepositoryConfigurationException
+ * @throws RepositoryException
+ * will be generate RepositoryException
+ */
+ private int forceCloseSession(String repositoryName, String workspaceName) throws RepositoryException,
+ RepositoryConfigurationException
+ {
+ ManageableRepository mr = repositoryService.getRepository(repositoryName);
+ WorkspaceContainerFacade wc = mr.getWorkspaceContainer(workspaceName);
+
+ SessionRegistry sessionRegistry = (SessionRegistry)wc.getComponent(SessionRegistry.class);
+
+ return sessionRegistry.closeSessions(workspaceName);
+ }
+
+ /**
* Restoring value storage from backup.
*/
protected void restoreValueStorage() throws RepositoryConfigurationException, IOException
Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsWorkspaceInitializer.java 2010-12-17 10:46:17 UTC (rev 3676)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsWorkspaceInitializer.java 2010-12-17 11:44:29 UTC (rev 3677)
@@ -91,7 +91,7 @@
TesterRdbmsWorkspaceInitializer initializer =
new TesterRdbmsWorkspaceInitializer(newEntry,
repositoryService.getRepository("db1").getConfiguration(), cacheableDataManager, null, null, null,
- (ValueFactoryImpl)valueFactory, null);
+ (ValueFactoryImpl)valueFactory, null, repositoryService);
initializer.restoreValueFiles();
assertTrue(new File(newValueStoragePath).list().length > 0);
@@ -146,7 +146,7 @@
TesterRdbmsWorkspaceInitializer initializer =
new TesterRdbmsWorkspaceInitializer(newEntry,
repositoryService.getRepository("db1").getConfiguration(), cacheableDataManager, null, null, null,
- (ValueFactoryImpl)valueFactory, null);
+ (ValueFactoryImpl)valueFactory, null, repositoryService);
initializer.restoreValueFiles();
assertFalse(new File(newValueStoragePath).exists());
@@ -217,7 +217,7 @@
TesterRdbmsWorkspaceInitializer initializer =
new TesterRdbmsWorkspaceInitializer(newEntry,
repositoryService.getRepository("db1").getConfiguration(), cacheableDataManager, null, null, null,
- (ValueFactoryImpl)valueFactory, null);
+ (ValueFactoryImpl)valueFactory, null, repositoryService);
// restore multi -> multi
initializer.restoreTables(conn, 0, true, workspaceEntry.getLockManager(), url.getFile());
@@ -262,7 +262,7 @@
initializer =
new TesterRdbmsWorkspaceInitializer(newEntry, repositoryService.getRepository("db1").getConfiguration(),
- cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null);
+ cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null, repositoryService);
// restore multi -> single
initializer.restoreTables(conn, 0, false, workspaceEntry.getLockManager(), url.getFile());
@@ -334,7 +334,7 @@
TesterRdbmsWorkspaceInitializer initializer =
new TesterRdbmsWorkspaceInitializer(newEntry, repositoryService.getRepository("db3").getConfiguration(),
- cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null);
+ cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null, repositoryService);
// restore single -> multi
initializer.restoreTables(conn, 0, true, workspaceEntry.getLockManager(), url.getFile());
@@ -379,7 +379,7 @@
initializer =
new TesterRdbmsWorkspaceInitializer(newEntry, repositoryService.getRepository("db3").getConfiguration(),
- cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null);
+ cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null, repositoryService);
// restore single -> single
initializer.restoreTables(conn, 0, false, workspaceEntry.getLockManager(), url.getFile());
Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/TesterRdbmsWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/TesterRdbmsWorkspaceInitializer.java 2010-12-17 10:46:17 UTC (rev 3676)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/TesterRdbmsWorkspaceInitializer.java 2010-12-17 11:44:29 UTC (rev 3677)
@@ -18,6 +18,7 @@
*/
package org.exoplatform.services.jcr.impl.core;
+import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.access.AccessManager;
import org.exoplatform.services.jcr.config.LockManagerEntry;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
@@ -52,10 +53,11 @@
public TesterRdbmsWorkspaceInitializer(WorkspaceEntry config, RepositoryEntry repConfig,
CacheableWorkspaceDataManager dataManager, NamespaceRegistryImpl namespaceRegistry,
LocationFactory locationFactory, NodeTypeManagerImpl nodeTypeManager, ValueFactoryImpl valueFactory,
- AccessManager accessManager) throws RepositoryConfigurationException, PathNotFoundException, RepositoryException
+ AccessManager accessManager, RepositoryService repositoryService) throws RepositoryConfigurationException,
+ PathNotFoundException, RepositoryException
{
super(config, repConfig, dataManager, namespaceRegistry, locationFactory, nodeTypeManager, valueFactory,
- accessManager);
+ accessManager, repositoryService);
}
public void restoreValueFiles() throws RepositoryConfigurationException, IOException
More information about the exo-jcr-commits
mailing list