Author: tolusha
Date: 2011-07-05 04:49:25 -0400 (Tue, 05 Jul 2011)
New Revision: 4592
Modified:
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationServiceImpl.java
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/creation/cluster/TestRepositoryCreationServiceInClusterNode1.java
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/creation/cluster/TestRepositoryCreationServiceInClusterNode2.java
Log:
EXOJCR-1422: Remove repository in cluster mode
Modified:
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationServiceImpl.java
===================================================================
---
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationServiceImpl.java 2011-07-05
07:42:37 UTC (rev 4591)
+++
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationServiceImpl.java 2011-07-05
08:49:25 UTC (rev 4592)
@@ -122,6 +122,8 @@
private RemoteCommand startRepository;
+ private RemoteCommand removeRepository;
+
/**
* Constructor RepositoryCreationServiceImpl.
*/
@@ -218,6 +220,22 @@
return null;
}
});
+
+ removeRepository = rpcService.registerCommand(new RemoteCommand()
+ {
+ public String getId()
+ {
+ return
"org.exoplatform.services.jcr.ext.repository.creation.RepositoryCreationServiceImpl-removeRepository";
+ }
+
+ public Serializable execute(Serializable[] args) throws Throwable
+ {
+ String repositoryName = (String)args[0];
+ removeRepositoryLocally(repositoryName);
+
+ return null;
+ }
+ });
}
else
{
@@ -308,7 +326,15 @@
if (result != null)
{
- throw new RepositoryCreationException("CreateRepository command must
not return any results.");
+ if (result instanceof Throwable)
+ {
+ throw new RepositoryCreationException("Can't create repository
" + rEntry.getName(),
+ (Throwable)result);
+ }
+ else
+ {
+ throw new RepositoryCreationException("createRepository command
returned uknown result type.");
+ }
}
}
catch (RPCException e)
@@ -336,22 +362,18 @@
for (Object result : results)
{
- if (result instanceof RPCException)
+ if (result != null)
{
- Throwable cause = ((RPCException)result).getCause();
- if (cause instanceof RepositoryCreationException)
+ if (result instanceof Throwable)
{
throw new RepositoryCreationException("Repository " +
rEntry.getName()
- + " created on coordinator, but can not be started at other
cluster nodes: "
- + cause.getMessage(), cause);
+ + " created on coordinator, but can not be started at other
cluster nodes", ((Throwable)result));
}
+ else
+ {
+ throw new RepositoryCreationException("startRepository command
returns uknown result type");
+ }
}
- if (result instanceof Throwable)
- {
- throw new RepositoryCreationException("Repository " +
rEntry.getName()
- + " created on coordinator, but can not be started at other
cluster nodes: "
- + ((Throwable)result).getMessage(), ((Throwable)result));
- }
}
}
catch (RPCException e)
@@ -389,6 +411,10 @@
{
return (String)result;
}
+ else if (result instanceof Throwable)
+ {
+ throw new RepositoryCreationException("Can't reserve repository
" + repositoryName, (Throwable)result);
+ }
else
{
throw new RepositoryCreationException("ReserveRepositoryName command
returns unknown type result.");
@@ -700,6 +726,7 @@
this.rpcService.unregisterCommand(reserveRepositoryName);
this.rpcService.unregisterCommand(createRepository);
this.rpcService.unregisterCommand(startRepository);
+ this.rpcService.unregisterCommand(removeRepository);
}
}
@@ -708,7 +735,37 @@
*/
public void removeRepository(String repositoryName) throws
RepositoryCreationException
{
- removeRepositoryLocally(repositoryName);
+ if (rpcService != null)
+ {
+ try
+ {
+ List<Object> results =
rpcService.executeCommandOnAllNodes(removeRepository, true, repositoryName);
+
+ for (Object result : results)
+ {
+ if (result != null)
+ {
+ if (result instanceof Throwable)
+ {
+ throw new RepositoryCreationException("Can't remove
repository " + repositoryName,
+ (Throwable)result);
+ }
+ else
+ {
+ throw new RepositoryCreationException("removeRepository command
returned uknown result type");
+ }
+ }
+ }
+ }
+ catch (RPCException e)
+ {
+ throw new RepositoryCreationException("Can't remove repository
" + repositoryName, e);
+ }
+ }
+ else
+ {
+ removeRepositoryLocally(repositoryName);
+ }
}
/**
Modified:
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/creation/cluster/TestRepositoryCreationServiceInClusterNode1.java
===================================================================
---
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/creation/cluster/TestRepositoryCreationServiceInClusterNode1.java 2011-07-05
07:42:37 UTC (rev 4591)
+++
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/creation/cluster/TestRepositoryCreationServiceInClusterNode1.java 2011-07-05
08:49:25 UTC (rev 4592)
@@ -32,6 +32,8 @@
import java.util.HashMap;
import java.util.Map;
+import javax.jcr.RepositoryException;
+
/**
* Created by The eXo Platform SAS.
*
@@ -53,8 +55,8 @@
connProps.put("password", "24635457");
DBCreationProperties creationProps =
- new DBCreationProperties("jdbc:mysql://localhost/", connProps,
- "src/test/resources/test-mysql.sql", "user1",
"pass1");
+ new DBCreationProperties("jdbc:mysql://localhost/", connProps,
"src/test/resources/test-mysql.sql", "user3",
+ "pass3");
// prepare
String dsName = helper.createDatasource();
@@ -81,7 +83,7 @@
(RepositoryCreationService)container.getComponentInstanceOfType(RepositoryCreationService.class);
assertNotNull(creatorService);
- String tenantName = "tenant_2";
+ String tenantName = "tenant_4";
String repoToken = creatorService.reserveRepositoryName(tenantName);
// restore
@@ -106,7 +108,22 @@
assertNotNull(repoService.getConfig().getRepositoryConfiguration(tenantName));
log.info("Node1: Repository has been created");
- Thread.sleep(100000);
+ Thread.sleep(60000);
+
+ // remove repository
+ creatorService.removeRepository(tenantName);
+
+ try
+ {
+ repoService.getRepository(tenantName);
+ fail("Exception should be thrown");
+ }
+ catch (RepositoryException e)
+ {
+ // expected behavior, repository should be missing
+ }
+
+ log.info("Node1: Repository removed");
}
@Override
Modified:
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/creation/cluster/TestRepositoryCreationServiceInClusterNode2.java
===================================================================
---
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/creation/cluster/TestRepositoryCreationServiceInClusterNode2.java 2011-07-05
07:42:37 UTC (rev 4591)
+++
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/creation/cluster/TestRepositoryCreationServiceInClusterNode2.java 2011-07-05
08:49:25 UTC (rev 4592)
@@ -16,11 +16,14 @@
*/
package org.exoplatform.services.jcr.ext.repository.creation.cluster;
+import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.ext.backup.AbstractBackupTestCase;
import org.exoplatform.services.jcr.ext.backup.ExtendedBackupManager;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
+import javax.jcr.RepositoryException;
+
/**
* Created by The eXo Platform SAS.
*
@@ -36,7 +39,7 @@
log.info("Node2: Waits for the repository creation");
Thread.sleep(60000);
- String tenantName = "tenant_2";
+ String tenantName = "tenant_4";
// check
ManageableRepository restoredRepository =
repositoryService.getRepository(tenantName);
@@ -48,7 +51,21 @@
session.getRootNode();
log.info("Node2: test passed. I have root node");
- Thread.sleep(100000);
+ Thread.sleep(120000);
+
+ RepositoryService repoService =
(RepositoryService)this.container.getComponentInstance(RepositoryService.class);
+
+ try
+ {
+ repoService.getRepository(tenantName);
+ fail("Exception should be thrown");
+ }
+ catch (RepositoryException e)
+ {
+ // expected behavior, repository should be missing
+ }
+
+ log.info("Node2: Repository removed");
}
@Override