[exo-jcr-commits] exo-jcr SVN: r4229 - in jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl: backup and 3 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Wed Apr 13 05:55:03 EDT 2011
Author: tolusha
Date: 2011-04-13 05:55:03 -0400 (Wed, 13 Apr 2011)
New Revision: 4229
Added:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/RepositorySuspendController.java
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/Suspendable.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/SearchIndex.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java
Log:
EXOJCR-1301: Allow to use external backup tools in a secure manner
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java 2011-04-12 13:53:48 UTC (rev 4228)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java 2011-04-13 09:55:03 UTC (rev 4229)
@@ -34,6 +34,7 @@
import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.core.security.JCRRuntimePermissions;
+import org.exoplatform.services.jcr.impl.backup.RepositorySuspendController;
import org.exoplatform.services.jcr.impl.core.AddNamespacePluginHolder;
import org.exoplatform.services.jcr.impl.core.LocationFactory;
import org.exoplatform.services.jcr.impl.core.NamespaceDataPersister;
@@ -638,6 +639,8 @@
{
public Void run()
{
+
+ registerComponentImplementation(RepositorySuspendController.class);
registerComponentImplementation(IdGenerator.class);
registerComponentImplementation(RepositoryIndexSearcherHolder.class);
Added: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/RepositorySuspendController.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/RepositorySuspendController.java (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/RepositorySuspendController.java 2011-04-13 09:55:03 UTC (rev 4229)
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2009 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.backup;
+
+import org.exoplatform.management.annotations.Managed;
+import org.exoplatform.management.annotations.ManagedDescription;
+import org.exoplatform.management.jmx.annotations.NameTemplate;
+import org.exoplatform.management.jmx.annotations.Property;
+import org.exoplatform.services.jcr.core.ManageableRepository;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.picocontainer.Startable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Allows via JMX suspend and resume repository's components.
+ *
+ * @author <a href="mailto:anatoliy.bazko at gmail.com">Anatoliy Bazko</a>
+ * @version $Id: RepositorySuspendController.java 34360 2009-07-22 23:58:59Z tolusha $
+ */
+ at Managed
+ at NameTemplate(@Property(key = "service", value = "RepositorySuspendController"))
+public class RepositorySuspendController implements Startable
+{
+ /**
+ * Repository ONLINE state.
+ */
+ private final int ONLINE = 1;
+
+ /**
+ * Repository SUSPENDED state.
+ */
+ private final int SUSPENDED = 3;
+
+ /**
+ * Undefined state.
+ */
+ private final int UNDEFINED = 4;
+
+ private final ManageableRepository repository;
+
+ /**
+ * Logger.
+ */
+ protected static Log log = ExoLogger.getLogger("exo.jcr.component.core.RepositorySuspendController");
+
+ /**
+ * RepositoryController constructor.
+ */
+ public RepositorySuspendController(ManageableRepository repository)
+ {
+ this.repository = repository;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Managed
+ @ManagedDescription("Suspend repository which means that allow only read operations. All writing threads will wait until resume operations invoked.")
+ public void suspend()
+ {
+ for (Suspendable component : getSuspendableComponents())
+ {
+ try
+ {
+ component.suspend();
+ }
+ catch (SuspendException e)
+ {
+ log.error("Can't suspend component", e);
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Managed
+ @ManagedDescription("Resume repository. All previously suspended threads continue working.")
+ public void resume()
+ {
+ List<Suspendable> components = getSuspendableComponents();
+ Collections.reverse(components);
+
+ for (Suspendable component : components)
+ {
+ try
+ {
+ if (component.isSuspended())
+ {
+ component.resume();
+ }
+ }
+ catch (ResumeException e)
+ {
+ log.error("Can't resume component", e);
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Managed
+ @ManagedDescription("Returns repository state.")
+ public int getState()
+ {
+ int state = ONLINE;
+
+ boolean hasSuspendedComponents = false;
+ boolean hasOnlineComponents = false;
+
+ for (Suspendable component : getSuspendableComponents())
+ {
+ if (component.isSuspended())
+ {
+ hasSuspendedComponents = true;
+
+ if (hasOnlineComponents)
+ {
+ return UNDEFINED;
+ }
+
+ state = SUSPENDED;
+ }
+ else
+ {
+ hasOnlineComponents = true;
+ if (hasSuspendedComponents)
+ {
+ return UNDEFINED;
+ }
+ }
+ }
+
+ return state;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void start()
+ {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void stop()
+ {
+ }
+
+ private List<Suspendable> getSuspendableComponents()
+ {
+ List<Suspendable> components = new ArrayList<Suspendable>();
+ for (String workspaceName : repository.getWorkspaceNames())
+ {
+ components.addAll(repository.getWorkspaceContainer(workspaceName).getComponentInstancesOfType(
+ Suspendable.class));
+ }
+
+ return components;
+ }
+}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/Suspendable.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/Suspendable.java 2011-04-12 13:53:48 UTC (rev 4228)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/Suspendable.java 2011-04-13 09:55:03 UTC (rev 4229)
@@ -25,17 +25,24 @@
public interface Suspendable
{
/**
- * Suspend component.
+ * Suspend component.
*
- * @throws SuspendException of error occurred
+ * @throws SuspendException of error occurred
*/
void suspend() throws SuspendException;
/**
- * Resume component.
+ * Resume component.
*
- * @throws ResumeException of error occurred
+ * @throws ResumeException of error occurred
*/
void resume() throws ResumeException;
+ /**
+ * Indicates if component is suspended or not.
+ *
+ * @return
+ */
+ boolean isSuspended();
+
}
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-04-12 13:53:48 UTC (rev 4228)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java 2011-04-13 09:55:03 UTC (rev 4229)
@@ -1056,6 +1056,14 @@
}
/**
+ * {@inheritDoc}
+ */
+ public boolean isSuspended()
+ {
+ return isSuspended;
+ }
+
+ /**
* Switches index into online or offline modes.
*
* @param isOnline
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-04-12 13:53:48 UTC (rev 4228)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java 2011-04-13 09:55:03 UTC (rev 4229)
@@ -515,6 +515,11 @@
protected CountDownLatch latcher = null;
/**
+ * Indicates if component suspended or not.
+ */
+ protected boolean isSuspended = false;
+
+ /**
* Working constructor.
*
* @throws RepositoryConfigurationException
@@ -3090,6 +3095,8 @@
{
latcher = new CountDownLatch(1);
close();
+
+ isSuspended = true;
}
/**
@@ -3103,6 +3110,8 @@
doInit();
latcher.countDown();
+
+ isSuspended = false;
}
catch (IOException e)
{
@@ -3115,6 +3124,14 @@
}
/**
+ * {@inheritDoc}
+ */
+ public boolean isSuspended()
+ {
+ return isSuspended;
+ }
+
+ /**
* If component is suspended need to wait resuming and not allow
* execute query on closed index.
*
@@ -3122,7 +3139,7 @@
*/
private void waitForResuming() throws IOException
{
- if (latcher != null && latcher.getCount() != 0)
+ if (isSuspended)
{
try
{
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-04-12 13:53:48 UTC (rev 4228)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java 2011-04-13 09:55:03 UTC (rev 4229)
@@ -1148,6 +1148,14 @@
isResponsibleForResuming = false;
}
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isSuspended()
+ {
+ return isSuspended;
+ }
+
private void suspendLocally() throws SuspendException
{
if (isSuspended)
More information about the exo-jcr-commits
mailing list