You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2013/02/20 14:45:17 UTC
svn commit: r1448166 - in /directory/apacheds/trunk:
core-api/src/main/java/org/apache/directory/server/core/api/
core-api/src/test/java/org/apache/directory/server/core/api/
core/src/main/java/org/apache/directory/server/core/
jdbm-partition/src/main/...
Author: elecharny
Date: Wed Feb 20 13:45:17 2013
New Revision: 1448166
URL: http://svn.apache.org/r1448166
Log:
o Exposed the lockWrite() and unlockWrite() methods in OperationManager
o Protected the backend in the syncWorker thred, by using the OperationManager lock, otherwise we may have some concurrent modification in JDBM
o Flushed the JDBM journal in the sync() method, otherwise the *.db file remain empty.
Modified:
directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/OperationManager.java
directory/apacheds/trunk/core-api/src/test/java/org/apache/directory/server/core/api/MockOperationManager.java
directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultOperationManager.java
directory/apacheds/trunk/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmIndex.java
directory/apacheds/trunk/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmPartition.java
Modified: directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/OperationManager.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/OperationManager.java?rev=1448166&r1=1448165&r2=1448166&view=diff
==============================================================================
--- directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/OperationManager.java (original)
+++ directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/OperationManager.java Wed Feb 20 13:45:17 2013
@@ -27,8 +27,8 @@ import org.apache.directory.server.core.
import org.apache.directory.server.core.api.interceptor.context.BindOperationContext;
import org.apache.directory.server.core.api.interceptor.context.CompareOperationContext;
import org.apache.directory.server.core.api.interceptor.context.DeleteOperationContext;
-import org.apache.directory.server.core.api.interceptor.context.HasEntryOperationContext;
import org.apache.directory.server.core.api.interceptor.context.GetRootDseOperationContext;
+import org.apache.directory.server.core.api.interceptor.context.HasEntryOperationContext;
import org.apache.directory.server.core.api.interceptor.context.LookupOperationContext;
import org.apache.directory.server.core.api.interceptor.context.ModifyOperationContext;
import org.apache.directory.server.core.api.interceptor.context.MoveAndRenameOperationContext;
@@ -129,4 +129,16 @@ public interface OperationManager
* TODO document after determining if this method should be here.
*/
void unbind( UnbindOperationContext unbindContext ) throws LdapException;
+
+
+ /**
+ * Acquires a WriteLock
+ */
+ public void lockWrite();
+
+
+ /**
+ * Releases a WriteLock
+ */
+ public void unlockWrite();
}
Modified: directory/apacheds/trunk/core-api/src/test/java/org/apache/directory/server/core/api/MockOperationManager.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-api/src/test/java/org/apache/directory/server/core/api/MockOperationManager.java?rev=1448166&r1=1448165&r2=1448166&view=diff
==============================================================================
--- directory/apacheds/trunk/core-api/src/test/java/org/apache/directory/server/core/api/MockOperationManager.java (original)
+++ directory/apacheds/trunk/core-api/src/test/java/org/apache/directory/server/core/api/MockOperationManager.java Wed Feb 20 13:45:17 2013
@@ -22,15 +22,14 @@ package org.apache.directory.server.core
import org.apache.directory.api.ldap.model.entry.Entry;
import org.apache.directory.api.ldap.model.exception.LdapException;
-import org.apache.directory.server.core.api.OperationManager;
import org.apache.directory.server.core.api.filtering.BaseEntryFilteringCursor;
import org.apache.directory.server.core.api.filtering.EntryFilteringCursor;
import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
import org.apache.directory.server.core.api.interceptor.context.BindOperationContext;
import org.apache.directory.server.core.api.interceptor.context.CompareOperationContext;
import org.apache.directory.server.core.api.interceptor.context.DeleteOperationContext;
-import org.apache.directory.server.core.api.interceptor.context.HasEntryOperationContext;
import org.apache.directory.server.core.api.interceptor.context.GetRootDseOperationContext;
+import org.apache.directory.server.core.api.interceptor.context.HasEntryOperationContext;
import org.apache.directory.server.core.api.interceptor.context.LookupOperationContext;
import org.apache.directory.server.core.api.interceptor.context.ModifyOperationContext;
import org.apache.directory.server.core.api.interceptor.context.MoveAndRenameOperationContext;
@@ -121,4 +120,14 @@ public class MockOperationManager implem
public void unbind( UnbindOperationContext unbindContext ) throws LdapException
{
}
+
+
+ public void lockWrite()
+ {
+ }
+
+
+ public void unlockWrite()
+ {
+ }
}
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java?rev=1448166&r1=1448165&r2=1448166&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java Wed Feb 20 13:45:17 2013
@@ -330,7 +330,10 @@ public class DefaultDirectoryService imp
try
{
+ // Protect this section against concurrent access
+ getOperationManager().lockWrite();
partitionNexus.sync();
+ getOperationManager().unlockWrite();
}
catch ( Exception e )
{
@@ -1282,7 +1285,7 @@ public class DefaultDirectoryService imp
// load the last stored valid CSN value
LookupOperationContext loc = new LookupOperationContext( getAdminSession(), systemPartition.getSuffixDn(),
SchemaConstants.ALL_ATTRIBUTES_ARRAY );
-
+
Entry entry = systemPartition.lookup( loc );
Attribute cntextCsnAt = entry.get( SchemaConstants.CONTEXT_CSN_AT );
@@ -1813,9 +1816,9 @@ public class DefaultDirectoryService imp
{
LOG.debug( "---> Initializing the DefaultDirectoryService " );
}
-
+
csnFactory.setReplicaId( replicaId );
-
+
// If no interceptor list is defined, setup a default list
if ( interceptors == null )
{
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultOperationManager.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultOperationManager.java?rev=1448166&r1=1448165&r2=1448166&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultOperationManager.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultOperationManager.java Wed Feb 20 13:45:17 2013
@@ -107,27 +107,27 @@ public class DefaultOperationManager imp
/**
* Acquires a WriteLock
*/
- private void lockWrite()
+ public void lockWrite()
{
rwLock.writeLock().lock();
}
/**
- * Releases a ReadLock
+ * Releases a WriteLock
*/
- private void unlockRead()
+ public void unlockWrite()
{
- rwLock.readLock().unlock();
+ rwLock.writeLock().unlock();
}
/**
- * Releases a WriteLock
+ * Releases a ReadLock
*/
- private void unlockWrite()
+ private void unlockRead()
{
- rwLock.writeLock().unlock();
+ rwLock.readLock().unlock();
}
@@ -342,7 +342,7 @@ public class DefaultOperationManager imp
{
Entry parentEntry = directoryService.getReferralManager().getParentReferral( dn );
Dn childDn = dn.getDescendantOf( parentEntry.getDn() );
-
+
// Depending on the Context.REFERRAL property value, we will throw
// a different exception.
if ( addContext.isReferralIgnored() )
@@ -362,7 +362,7 @@ public class DefaultOperationManager imp
// Unlock the referral manager
directoryService.getReferralManager().unlock();
}
-
+
// Call the Add method
Interceptor head = directoryService.getInterceptor( addContext.getNextInterceptor() );
@@ -440,12 +440,12 @@ public class DefaultOperationManager imp
{
// Check if we have an ancestor for this Dn
Entry parentEntry = directoryService.getReferralManager().getParentReferral( dn );
-
+
if ( parentEntry != null )
{
// We have found a parent referral for the current Dn
Dn childDn = dn.getDescendantOf( parentEntry.getDn() );
-
+
if ( directoryService.getReferralManager().isReferral( dn ) )
{
// This is a referral. We can delete it if the ManageDsaIt flag is true
@@ -531,12 +531,12 @@ public class DefaultOperationManager imp
try
{
Entry parentEntry = directoryService.getReferralManager().getParentReferral( dn );
-
+
if ( parentEntry != null )
{
// We have found a parent referral for the current Dn
Dn childDn = dn.getDescendantOf( parentEntry.getDn() );
-
+
if ( directoryService.getReferralManager().isReferral( dn ) )
{
// This is a referral. We can delete it if the ManageDsaIt flag is true
@@ -551,7 +551,7 @@ public class DefaultOperationManager imp
else if ( directoryService.getReferralManager().hasParentReferral( dn ) )
{
// We can't delete an entry which has an ancestor referral
-
+
// Depending on the Context.REFERRAL property value, we will throw
// a different exception.
if ( deleteContext.isReferralIgnored() )
@@ -721,7 +721,7 @@ public class DefaultOperationManager imp
{
// Check if we have an ancestor for this Dn
Entry parentEntry = referralManager.getParentReferral( dn );
-
+
if ( parentEntry != null )
{
if ( referralManager.isReferral( dn ) )
@@ -733,7 +733,7 @@ public class DefaultOperationManager imp
// Throw a Referral Exception
// We have found a parent referral for the current Dn
Dn childDn = dn.getDescendantOf( parentEntry.getDn() );
-
+
LdapReferralException exception = buildReferralException( parentEntry, childDn );
throw exception;
}
@@ -741,14 +741,14 @@ public class DefaultOperationManager imp
else if ( referralManager.hasParentReferral( dn ) )
{
// We can't delete an entry which has an ancestor referral
-
+
// Depending on the Context.REFERRAL property value, we will throw
// a different exception.
if ( modifyContext.isReferralIgnored() )
{
// We have found a parent referral for the current Dn
Dn childDn = dn.getDescendantOf( parentEntry.getDn() );
-
+
LdapPartialResultException exception = buildLdapPartialResultException( childDn );
throw exception;
}
@@ -756,7 +756,7 @@ public class DefaultOperationManager imp
{
// We have found a parent referral for the current Dn
Dn childDn = dn.getDescendantOf( parentEntry.getDn() );
-
+
LdapReferralException exception = buildReferralException( parentEntry, childDn );
throw exception;
}
@@ -822,12 +822,12 @@ public class DefaultOperationManager imp
{
// Check if we have an ancestor for this Dn
Entry parentEntry = directoryService.getReferralManager().getParentReferral( dn );
-
+
if ( parentEntry != null )
{
// We have found a parent referral for the current Dn
Dn childDn = dn.getDescendantOf( parentEntry.getDn() );
-
+
if ( directoryService.getReferralManager().isReferral( dn ) )
{
// This is a referral. We can delete it if the ManageDsaIt flag is true
@@ -842,7 +842,7 @@ public class DefaultOperationManager imp
else if ( directoryService.getReferralManager().hasParentReferral( dn ) )
{
// We can't delete an entry which has an ancestor referral
-
+
// Depending on the Context.REFERRAL property value, we will throw
// a different exception.
if ( moveContext.isReferralIgnored() )
@@ -857,7 +857,7 @@ public class DefaultOperationManager imp
}
}
}
-
+
// Now, check the destination
// If he parent Dn is a referral, or has a referral ancestor, we have to issue a AffectMultipleDsas result
// as stated by RFC 3296 Section 5.6.2
@@ -927,12 +927,12 @@ public class DefaultOperationManager imp
{
// Check if we have an ancestor for this Dn
Entry parentEntry = directoryService.getReferralManager().getParentReferral( dn );
-
+
if ( parentEntry != null )
{
// We have found a parent referral for the current Dn
Dn childDn = dn.getDescendantOf( parentEntry.getDn() );
-
+
if ( directoryService.getReferralManager().isReferral( dn ) )
{
// This is a referral. We can delete it if the ManageDsaIt flag is true
@@ -947,7 +947,7 @@ public class DefaultOperationManager imp
else if ( directoryService.getReferralManager().hasParentReferral( dn ) )
{
// We can't delete an entry which has an ancestor referral
-
+
// Depending on the Context.REFERRAL property value, we will throw
// a different exception.
if ( moveAndRenameContext.isReferralIgnored() )
@@ -967,7 +967,7 @@ public class DefaultOperationManager imp
// Normalize the moveAndRenameContext Dn
Dn newSuperiorDn = moveAndRenameContext.getNewSuperiorDn();
newSuperiorDn.apply( directoryService.getSchemaManager() );
-
+
// If he parent Dn is a referral, or has a referral ancestor, we have to issue a AffectMultipleDsas result
// as stated by RFC 3296 Section 5.6.2
if ( directoryService.getReferralManager().isReferral( newSuperiorDn )
@@ -977,7 +977,7 @@ public class DefaultOperationManager imp
// as stated by RFC 3296 Section 5.6.2
LdapAffectMultipleDsaException exception = new LdapAffectMultipleDsaException();
//exception.setRemainingName( dn );
-
+
throw exception;
}
}
@@ -1045,12 +1045,12 @@ public class DefaultOperationManager imp
{
// Check if we have an ancestor for this Dn
Entry parentEntry = directoryService.getReferralManager().getParentReferral( dn );
-
+
if ( parentEntry != null )
{
// We have found a parent referral for the current Dn
Dn childDn = dn.getDescendantOf( parentEntry.getDn() );
-
+
if ( directoryService.getReferralManager().isReferral( dn ) )
{
// This is a referral. We can delete it if the ManageDsaIt flag is true
@@ -1065,7 +1065,7 @@ public class DefaultOperationManager imp
else if ( directoryService.getReferralManager().hasParentReferral( dn ) )
{
// We can't delete an entry which has an ancestor referral
-
+
// Depending on the Context.REFERRAL property value, we will throw
// a different exception.
if ( renameContext.isReferralIgnored() )
@@ -1141,12 +1141,12 @@ public class DefaultOperationManager imp
{
// Check if we have an ancestor for this Dn
Entry parentEntry = directoryService.getReferralManager().getParentReferral( dn );
-
+
if ( parentEntry != null )
{
// We have found a parent referral for the current Dn
Dn childDn = dn.getDescendantOf( parentEntry.getDn() );
-
+
if ( directoryService.getReferralManager().isReferral( dn ) )
{
// This is a referral. We can return it if the ManageDsaIt flag is true
@@ -1162,7 +1162,7 @@ public class DefaultOperationManager imp
else if ( directoryService.getReferralManager().hasParentReferral( dn ) )
{
// We can't search an entry which has an ancestor referral
-
+
// Depending on the Context.REFERRAL property value, we will throw
// a different exception.
if ( searchContext.isReferralIgnored() )
Modified: directory/apacheds/trunk/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmIndex.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmIndex.java?rev=1448166&r1=1448165&r2=1448166&view=diff
==============================================================================
--- directory/apacheds/trunk/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmIndex.java (original)
+++ directory/apacheds/trunk/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmIndex.java Wed Feb 20 13:45:17 2013
@@ -680,6 +680,19 @@ public class JdbmIndex<K, V> extends Abs
public synchronized void sync() throws IOException
{
commit( recMan );
+
+ BaseRecordManager baseRecordManager = null;
+
+ if ( recMan instanceof CacheRecordManager )
+ {
+ baseRecordManager = ( ( BaseRecordManager ) ( ( CacheRecordManager ) recMan ).getRecordManager() );
+ }
+ else
+ {
+ baseRecordManager = ( ( BaseRecordManager ) recMan );
+ }
+
+ baseRecordManager.getTransactionManager().synchronizeLog();
}
Modified: directory/apacheds/trunk/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmPartition.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmPartition.java?rev=1448166&r1=1448165&r2=1448166&view=diff
==============================================================================
--- directory/apacheds/trunk/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmPartition.java (original)
+++ directory/apacheds/trunk/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmPartition.java Wed Feb 20 13:45:17 2013
@@ -320,6 +320,12 @@ public class JdbmPartition extends Abstr
( ( JdbmMasterTable ) master ).sync();
recMan.commit();
+
+ if ( recMan instanceof CacheRecordManager )
+ {
+ ( ( BaseRecordManager ) ( ( CacheRecordManager ) recMan ).getRecordManager() ).getTransactionManager()
+ .synchronizeLog();
+ }
}