Author: tolusha
Date: 2011-08-15 10:18:02 -0400 (Mon, 15 Aug 2011)
New Revision: 4754
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/AbstractRepositoryServiceConfiguration.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/RepositoryServiceConfiguration.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryServiceImpl.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestRepositoryManagement.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java
Log:
EXOJCR-1467: Concurrent repository creation
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/AbstractRepositoryServiceConfiguration.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/AbstractRepositoryServiceConfiguration.java 2011-08-15
07:11:30 UTC (rev 4753)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/AbstractRepositoryServiceConfiguration.java 2011-08-15
14:18:02 UTC (rev 4754)
@@ -18,8 +18,8 @@
*/
package org.exoplatform.services.jcr.config;
-import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
* Created by The eXo Platform SAS .
@@ -31,7 +31,7 @@
public abstract class AbstractRepositoryServiceConfiguration
{
- protected List<RepositoryEntry> repositoryConfigurations = new
ArrayList<RepositoryEntry>();
+ protected List<RepositoryEntry> repositoryConfigurations = new
CopyOnWriteArrayList<RepositoryEntry>();
protected String defaultRepositoryName;
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/RepositoryServiceConfiguration.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/RepositoryServiceConfiguration.java 2011-08-15
07:11:30 UTC (rev 4753)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/RepositoryServiceConfiguration.java 2011-08-15
14:18:02 UTC (rev 4754)
@@ -33,6 +33,7 @@
import javax.jcr.RepositoryException;
+
/**
* Created by The eXo Platform SAS.
*
@@ -52,14 +53,16 @@
this.defaultRepositoryName = defaultRepositoryName;
this.repositoryConfigurations = repositoryEntries;
}
-
+
public final RepositoryEntry getRepositoryConfiguration(String name) throws
RepositoryConfigurationException
{
for (int i = 0; i < getRepositoryConfigurations().size(); i++)
{
RepositoryEntry conf = getRepositoryConfigurations().get(i);
if (conf.getName().equals(name))
+ {
return conf;
+ }
}
throw new RepositoryConfigurationException("Repository not configured " +
name);
}
@@ -74,11 +77,6 @@
this.defaultRepositoryName = conf.getDefaultRepositoryName();
this.repositoryConfigurations = conf.getRepositoryConfigurations();
-
- // setDefaultRepositoryName(conf.getDefaultRepositoryName());
- // getRepositoryConfigurations().clear();
- //
getRepositoryConfigurations().addAll(conf.getRepositoryConfigurations());
-
}
catch (JiBXException e)
{
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryServiceImpl.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryServiceImpl.java 2011-08-15
07:11:30 UTC (rev 4753)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryServiceImpl.java 2011-08-15
14:18:02 UTC (rev 4754)
@@ -48,6 +48,7 @@
import java.util.Map;
import java.util.Map.Entry;
import java.util.StringTokenizer;
+import java.util.concurrent.ConcurrentHashMap;
import javax.jcr.RepositoryException;
@@ -67,7 +68,8 @@
private final ThreadLocal<String> currentRepositoryName = new
ThreadLocal<String>();
- private final HashMap<String, RepositoryContainer> repositoryContainers = new
HashMap<String, RepositoryContainer>();
+ private final ConcurrentHashMap<String, RepositoryContainer>
repositoryContainers =
+ new ConcurrentHashMap<String, RepositoryContainer>();
private final List<ComponentPlugin> addNodeTypePlugins;
@@ -124,7 +126,7 @@
* Add namespaces and nodetypes from service plugins.
*
*/
- public synchronized void createRepository(RepositoryEntry rEntry) throws
RepositoryConfigurationException,
+ public void createRepository(RepositoryEntry rEntry) throws
RepositoryConfigurationException,
RepositoryException
{
// Need privileges to manage repository.
@@ -145,16 +147,22 @@
// key=repository_name
try
{
- repositoryContainers.put(rEntry.getName(), repositoryContainer);
- SecurityHelper.doPrivilegedAction(new PrivilegedAction<Void>()
+ if (repositoryContainers.putIfAbsent(rEntry.getName(), repositoryContainer) ==
null)
{
- public Void run()
+ SecurityHelper.doPrivilegedAction(new PrivilegedAction<Void>()
{
- managerStartChanges.registerListeners(repositoryContainer);
- repositoryContainer.start();
- return null;
- }
- });
+ public Void run()
+ {
+ managerStartChanges.registerListeners(repositoryContainer);
+ repositoryContainer.start();
+ return null;
+ }
+ });
+ }
+ else
+ {
+ throw new RepositoryConfigurationException("Repository container "
+ rEntry.getName() + " already started");
+ }
}
catch (Throwable t)
{
Modified:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestRepositoryManagement.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestRepositoryManagement.java 2011-08-15
07:11:30 UTC (rev 4753)
+++
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestRepositoryManagement.java 2011-08-15
14:18:02 UTC (rev 4754)
@@ -18,13 +18,21 @@
*/
package org.exoplatform.services.jcr.impl.core;
+import org.exoplatform.container.xml.PropertiesParam;
import org.exoplatform.services.jcr.JcrImplBaseTest;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.config.RepositoryEntry;
+import org.exoplatform.services.jcr.config.RepositoryServiceConfiguration;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.core.ManageableRepository;
+import org.exoplatform.services.jcr.impl.config.JDBCConfigurationPersister;
import org.exoplatform.services.jcr.util.TesterConfigurationHelper;
+import org.jibx.runtime.BindingDirectory;
+import org.jibx.runtime.IBindingFactory;
+import org.jibx.runtime.IUnmarshallingContext;
+import java.util.concurrent.CountDownLatch;
+
/**
* @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey
Kabashnyuk</a>
* @version $Id: TestRepositoryManagement.java 11907 2008-03-13 15:36:21Z ksm $
@@ -50,7 +58,6 @@
this.helper = TesterConfigurationHelper.getInstance();
}
-
public void testAddNewRepository() throws Exception
{
ManageableRepository repository = helper.createRepository(container, false, null);
@@ -128,4 +135,88 @@
}
}
+
+ public void testAddNewRepositorMultiThreading() throws Exception
+ {
+ int theadsCount = 10;
+
+ RepositoryCreationThread[] threads = new RepositoryCreationThread[theadsCount];
+ CountDownLatch latcher = new CountDownLatch(1);
+
+ for (int i = 0; i < theadsCount; i++)
+ {
+ threads[i] = new RepositoryCreationThread(latcher);
+ threads[i].start();
+ }
+
+ latcher.countDown();
+
+ for (int i = 0; i < theadsCount; i++)
+ {
+ threads[i].join();
+ }
+
+ PropertiesParam props = new PropertiesParam();
+ props.setProperty("dialect", "auto");
+ props.setProperty("source-name", "jdbcjcr");
+
+ JDBCConfigurationPersister persiter = new JDBCConfigurationPersister();
+ persiter.init(props);
+
+ IBindingFactory factory =
BindingDirectory.getFactory(RepositoryServiceConfiguration.class);
+ IUnmarshallingContext uctx = factory.createUnmarshallingContext();
+ RepositoryServiceConfiguration storedConf =
+ (RepositoryServiceConfiguration)uctx.unmarshalDocument(persiter.read(), null);
+
+ for (int i = 0; i < theadsCount; i++)
+ {
+ // test if respository has been created
+ ManageableRepository repository = threads[i].getRepository();
+ assertNotNull(repository);
+
+ // check configuration in persiter
+ storedConf.getRepositoryConfiguration(repository.getConfiguration().getName());
+
+ // check configuration in RepositoryServic
+
assertNotNull(repositoryService.getConfig().getRepositoryConfiguration(repository.getConfiguration().getName()));
+
+ // login into newly created repository
+ ManageableRepository newRepository =
repositoryService.getRepository(repository.getConfiguration().getName());
+ assertNotNull(repository.login(credentials,
newRepository.getConfiguration().getSystemWorkspaceName())
+ .getRootNode());
+ }
+ }
+
+ private class RepositoryCreationThread extends Thread
+ {
+ private CountDownLatch latcher;
+
+ private ManageableRepository repository;
+
+ RepositoryCreationThread(CountDownLatch latcher)
+ {
+ this.latcher = latcher;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void run()
+ {
+ try
+ {
+ latcher.await();
+ repository = helper.createRepository(container, false, null);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public ManageableRepository getRepository()
+ {
+ return repository;
+ }
+ }
}
Modified:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java 2011-08-15
07:11:30 UTC (rev 4753)
+++
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java 2011-08-15
14:18:02 UTC (rev 4754)
@@ -105,6 +105,7 @@
RepositoryService service =
(RepositoryService)container.getComponentInstanceOfType(RepositoryService.class);
RepositoryEntry repoEntry = createRepositoryEntry(isMultiDb, null, dsName);
service.createRepository(repoEntry);
+ service.getConfig().retain();
return service.getRepository(repoEntry.getName());
}