[exo-jcr-commits] exo-jcr SVN: r1710 - in jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr: impl/storage/inmemory and 2 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Mon Feb 8 02:35:27 EST 2010
Author: tolusha
Date: 2010-02-08 02:35:26 -0500 (Mon, 08 Feb 2010)
New Revision: 1710
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/WorkspacePersistentDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/inmemory/InmemoryContainerImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/storage/WorkspaceDataContainer.java
Log:
EXOJCR-464: avoid deadlock on Sybase DB
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 2010-02-05 17:21:55 UTC (rev 1709)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java 2010-02-08 07:35:26 UTC (rev 1710)
@@ -37,11 +37,6 @@
import java.util.concurrent.CountDownLatch;
import javax.jcr.RepositoryException;
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.NotSupportedException;
-import javax.transaction.RollbackException;
-import javax.transaction.SystemException;
import javax.transaction.TransactionManager;
/**
@@ -379,7 +374,7 @@
public List<PropertyData> getChildPropertiesData(NodeData nodeData) throws RepositoryException
{
List<PropertyData> childs = getChildPropertiesData(nodeData, false);
- for (PropertyData prop: childs)
+ for (PropertyData prop : childs)
{
fixPropertyValues(prop);
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java 2010-02-05 17:21:55 UTC (rev 1709)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java 2010-02-08 07:35:26 UTC (rev 1710)
@@ -92,7 +92,6 @@
* Value sorages provider (for dest file suggestion on save).
*/
// TODO protected final ValueStoragePluginProvider valueStorageProvider;
-
/**
* Persistent level listeners. This listeners can be filtered by filters from
* <code>liestenerFilters</code> list.
@@ -234,7 +233,7 @@
// if it's different container instances
? systemDataContainer.equals(dataContainer) && thisConnection != null
// but container confugrations are same and non-system connnection open
- // reuse this connection as system
+ // reuse this connection as system
? systemDataContainer.reuseConnection(thisConnection)
// or open one new system
: systemDataContainer.openConnection()
@@ -256,7 +255,7 @@
// if it's different container instances
? dataContainer.equals(systemDataContainer) && systemConnection != null
// but container confugrations are same and system connnection open
- // reuse system connection as this
+ // reuse system connection as this
? dataContainer.reuseConnection(systemConnection)
// or open one new
: dataContainer.openConnection()
@@ -273,7 +272,7 @@
protected PlainChangesLogImpl save(PlainChangesLog changesLog) throws InvalidItemStateException,
RepositoryException, IOException
{ //LOG.info(changesLog.dump())
- // copy state
+ // copy state
PlainChangesLogImpl newLog =
new PlainChangesLogImpl(new ArrayList<ItemState>(), changesLog.getSessionId(), changesLog.getEventType(),
changesLog.getPairId());
@@ -554,29 +553,43 @@
else
{
// check in persistence
- final WorkspaceStorageConnection acon = con; //dataContainer.openConnection();
- try
+ if (dataContainer.isCheckSNSNewConnection())
{
- NodeData parent = (NodeData)acon.getItemData(node.getParentIdentifier());
- QPathEntry myName = node.getQPath().getEntries()[node.getQPath().getEntries().length - 1];
- ItemData sibling =
- acon.getItemData(parent, new QPathEntry(myName.getNamespace(), myName.getName(),
- myName.getIndex() - 1));
- if (sibling == null || !sibling.isNode())
+ final WorkspaceStorageConnection acon = dataContainer.openConnection();
+ try
{
- throw new InvalidItemStateException("Node can't be saved " + node.getQPath().getAsString()
- + ". No same-name sibling exists with index " + (myName.getIndex() - 1) + ".");
+ checkPersistedSNS(node, acon);
}
+ finally
+ {
+ acon.close();
+ }
}
- finally
+ else
{
- //acon.close();
+ checkPersistedSNS(node, con);
}
}
}
}
/**
+ * Check if same-name sibling exists in persistence.
+ */
+ private void checkPersistedSNS(NodeData node, WorkspaceStorageConnection acon) throws RepositoryException
+ {
+ NodeData parent = (NodeData)acon.getItemData(node.getParentIdentifier());
+ QPathEntry myName = node.getQPath().getEntries()[node.getQPath().getEntries().length - 1];
+ ItemData sibling =
+ acon.getItemData(parent, new QPathEntry(myName.getNamespace(), myName.getName(), myName.getIndex() - 1));
+ if (sibling == null || !sibling.isNode())
+ {
+ throw new InvalidItemStateException("Node can't be saved " + node.getQPath().getAsString()
+ + ". No same-name sibling exists with index " + (myName.getIndex() - 1) + ".");
+ }
+ }
+
+ /**
* Performs actual item data deleting.
*
* @param item
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/inmemory/InmemoryContainerImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/inmemory/InmemoryContainerImpl.java 2010-02-05 17:21:55 UTC (rev 1709)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/inmemory/InmemoryContainerImpl.java 2010-02-08 07:35:26 UTC (rev 1710)
@@ -99,4 +99,12 @@
{
return this.equals(another);
}
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isCheckSNSNewConnection()
+ {
+ return true;
+ }
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java 2010-02-05 17:21:55 UTC (rev 1709)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java 2010-02-08 07:35:26 UTC (rev 1710)
@@ -45,7 +45,6 @@
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
-import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;
@@ -106,6 +105,8 @@
protected String storageVersion;
+ protected boolean checkSNSNewConnection;
+
protected int maxBufferSize;
protected File swapDirectory;
@@ -332,6 +333,15 @@
}
LOG.info("Using a dialect '" + this.dbDialect + "'");
+ try
+ {
+ this.checkSNSNewConnection = wsConfig.getContainer().getParameterBoolean(CHECK_SNS_NEW_CONNECTION);
+ }
+ catch (RepositoryConfigurationException e)
+ {
+ this.checkSNSNewConnection = true;
+ }
+
// ------------- Values swap config ------------------
try
{
@@ -878,4 +888,13 @@
{
return dbUserName;
}
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isCheckSNSNewConnection()
+ {
+ return checkSNSNewConnection;
+ }
+
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/storage/WorkspaceDataContainer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/storage/WorkspaceDataContainer.java 2010-02-05 17:21:55 UTC (rev 1709)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/storage/WorkspaceDataContainer.java 2010-02-08 07:35:26 UTC (rev 1710)
@@ -47,6 +47,8 @@
public final static String DEF_SWAPDIR = System.getProperty("java.io.tmpdir");
+ public final static String CHECK_SNS_NEW_CONNECTION = "check-sns-new-connection";
+
/**
* [G.A] do we need it here or in WorkspaceDataManager better??
*
@@ -89,4 +91,8 @@
*/
WorkspaceStorageConnection reuseConnection(WorkspaceStorageConnection original) throws RepositoryException;
+ /**
+ * @return the value of 'check-sns-new-connection' parameter
+ */
+ boolean isCheckSNSNewConnection();
}
More information about the exo-jcr-commits
mailing list