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