You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ka...@apache.org on 2012/10/31 15:20:56 UTC
svn commit: r1404161 - in /directory/apacheds/trunk:
core-api/src/main/java/org/apache/directory/server/core/api/
core-api/src/main/java/org/apache/directory/server/core/api/partition/
core-api/src/main/resources/ core-api/src/test/java/org/apache/dire...
Author: kayyagari
Date: Wed Oct 31 14:20:55 2012
New Revision: 1404161
URL: http://svn.apache.org/viewvc?rev=1404161&view=rev
Log:
o completely changed the way CacheService is initialized
o added methods to let Partition implementations handle the Entry cache
o moved the ldapServer.start() statement out of the try-catch block to fail fast
o added some sample cache configurations
Modified:
directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/CacheService.java
directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/DirectoryService.java
directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/partition/AbstractPartition.java
directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/partition/Partition.java
directory/apacheds/trunk/core-api/src/main/resources/directory-cacheservice.xml
directory/apacheds/trunk/core-api/src/test/java/org/apache/directory/server/core/api/MockDirectoryService.java
directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
directory/apacheds/trunk/service/src/main/java/org/apache/directory/server/ApacheDsService.java
directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java
Modified: directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/CacheService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/CacheService.java?rev=1404161&r1=1404160&r2=1404161&view=diff
==============================================================================
--- directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/CacheService.java (original)
+++ directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/CacheService.java Wed Oct 31 14:20:55 2012
@@ -26,6 +26,8 @@ import java.io.File;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Status;
+import net.sf.ehcache.config.Configuration;
+import net.sf.ehcache.config.ConfigurationFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -51,50 +53,111 @@ public class CacheService
/** the ehcache cache manager */
private CacheManager cacheManager;
+ private boolean initialized;
public CacheService()
{
}
-
- public void initialize( DirectoryService dirService )
+
+ /**
+ * Creates a new instance of CacheService with the given cache manager.
+ *
+ * @param cachemanager
+ */
+ public CacheService( CacheManager cachemanager )
+ {
+ this.cacheManager = cachemanager;
+ if ( cachemanager != null )
+ {
+ initialized = true;
+ }
+ }
+
+
+ public void initialize( InstanceLayout layout )
{
+ if ( initialized )
+ {
+ LOG.debug( "CacheService was already initialized, returning" );
+ return;
+ }
+
if ( ( cacheManager != null ) && ( cacheManager.getStatus() == Status.STATUS_ALIVE ) )
{
LOG.warn( "cache service was already initialized and is alive" );
+ initialized = true;
return;
}
- File configFile = new File( dirService.getInstanceLayout().getConfDirectory(), DIRECTORY_CACHESERVICE_XML );
+ File configFile = new File( layout.getConfDirectory(), DIRECTORY_CACHESERVICE_XML );
+ Configuration cc;
+
if ( !configFile.exists() )
{
LOG.info( "no custom cache configuration was set, loading the default cache configuration" );
-
- cacheManager = new CacheManager( getClass().getClassLoader().getResource( DIRECTORY_CACHESERVICE_XML ) );
+ cc = ConfigurationFactory.parseConfiguration( getClass().getClassLoader().getResource( DIRECTORY_CACHESERVICE_XML ) );
}
else
{
LOG.info( "loading cache configuration from the file {}", configFile );
- cacheManager = new CacheManager( configFile.getAbsolutePath() );
+ cc = ConfigurationFactory.parseConfiguration( configFile );
}
+
+ cc.getDiskStoreConfiguration().setPath( layout.getCacheDirectory().getAbsolutePath() );
+ cacheManager = new CacheManager( cc );
+
+ initialized = true;
}
public void destroy()
{
+ if ( !initialized )
+ {
+ return;
+ }
+
LOG.info( "clearing all the caches" );
+ initialized = false;
+
cacheManager.clearAll();
- cacheManager.shutdown();
}
public Cache getCache( String name )
{
+ if ( !initialized )
+ {
+ throw new IllegalStateException( "CacheService was not initialized" );
+ }
+
LOG.info( "fetching the cache named {}", name );
- return cacheManager.getCache( name );
+ Cache cache = cacheManager.getCache( name );
+
+ if( cache == null )
+ {
+ cacheManager.addCache( name );
+ cache = cacheManager.getCache( name );
+ }
+
+ return cache;
+ }
+
+
+ public void remove( String name )
+ {
+ cacheManager.removeCache( name );
}
+
+
+ public void attach( Cache cache )
+ {
+ cacheManager.addCache( cache );
+ }
+
}
Modified: directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/DirectoryService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/DirectoryService.java?rev=1404161&r1=1404160&r2=1404161&view=diff
==============================================================================
--- directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/DirectoryService.java (original)
+++ directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/DirectoryService.java Wed Oct 31 14:20:55 2012
@@ -47,7 +47,6 @@ import org.apache.directory.shared.ldap.
import org.apache.directory.shared.ldap.model.schema.SchemaManager;
import org.apache.directory.shared.ldap.util.tree.DnNode;
-
/**
* Provides JNDI service to {@link AbstractContextFactory}.
*
@@ -614,4 +613,12 @@ public interface DirectoryService extend
* @return the Dn factory
*/
DnFactory getDnFactory();
+
+
+ /**
+ * Sets the CacheService
+ *
+ * @param cacheService the cache service
+ */
+ void setCacheService( CacheService cacheService );
}
Modified: directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/partition/AbstractPartition.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/partition/AbstractPartition.java?rev=1404161&r1=1404160&r2=1404161&view=diff
==============================================================================
--- directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/partition/AbstractPartition.java (original)
+++ directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/partition/AbstractPartition.java Wed Oct 31 14:20:55 2012
@@ -25,6 +25,7 @@ import java.io.OutputStream;
import javax.naming.InvalidNameException;
+import org.apache.directory.server.core.api.CacheService;
import org.apache.directory.server.i18n.I18n;
import org.apache.directory.shared.ldap.model.entry.Entry;
import org.apache.directory.shared.ldap.model.exception.LdapException;
@@ -59,7 +60,9 @@ public abstract class AbstractPartition
/** The root Dn for this partition */
protected Dn suffixDn;
-
+ /** the cache service */
+ protected CacheService cacheService;
+
/**
* {@inheritDoc}
*/
@@ -234,4 +237,14 @@ public abstract class AbstractPartition
{
this.contextEntry = contextEntry;
}
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setCacheService( CacheService cacheService )
+ {
+ this.cacheService = cacheService;
+ }
}
Modified: directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/partition/Partition.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/partition/Partition.java?rev=1404161&r1=1404160&r2=1404161&view=diff
==============================================================================
--- directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/partition/Partition.java (original)
+++ directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/api/partition/Partition.java Wed Oct 31 14:20:55 2012
@@ -24,6 +24,7 @@ import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
+import org.apache.directory.server.core.api.CacheService;
import org.apache.directory.server.core.api.entry.ServerSearchResult;
import org.apache.directory.server.core.api.filtering.EntryFilteringCursor;
import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
@@ -294,4 +295,12 @@ public interface Partition
* @throws IOException if we can't write the data
*/
void dumpIndex( OutputStream stream, String name ) throws IOException;
+
+
+ /**
+ * set the Cache service
+ *
+ * @param cacheService
+ */
+ void setCacheService( CacheService cacheService );
}
Modified: directory/apacheds/trunk/core-api/src/main/resources/directory-cacheservice.xml
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-api/src/main/resources/directory-cacheservice.xml?rev=1404161&r1=1404160&r2=1404161&view=diff
==============================================================================
--- directory/apacheds/trunk/core-api/src/main/resources/directory-cacheservice.xml (original)
+++ directory/apacheds/trunk/core-api/src/main/resources/directory-cacheservice.xml Wed Oct 31 14:20:55 2012
@@ -160,4 +160,29 @@
timeToIdleSeconds="300"
diskPersistent="false" />
+ <!-- partition caches
+ the name format:
+ name="{partition-suffix}" for partition
+ name="{partition-suffix}:{index name/OID}" for each partition's index (currently only RDN index supports cache)
+ -->
+ <cache name="ou=system"
+ maxElementsInMemory="1000"
+ eternal="false"
+ overflowToDisk="true"
+ diskSpoolBufferSizeMB="20"
+ timeToIdleSeconds="300"
+ timeToLiveSeconds="600"
+ memoryStoreEvictionPolicy="LFU"
+ diskPersistent="false"/>
+
+ <cache name="ou=system:apacheRdn"
+ maxElementsInMemory="10000"
+ eternal="false"
+ overflowToDisk="false"
+ timeToIdleSeconds="300"
+ timeToLiveSeconds="600"
+ memoryStoreEvictionPolicy="LFU"
+ diskPersistent="false"/>
+
+
</ehcache>
\ No newline at end of file
Modified: directory/apacheds/trunk/core-api/src/test/java/org/apache/directory/server/core/api/MockDirectoryService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-api/src/test/java/org/apache/directory/server/core/api/MockDirectoryService.java?rev=1404161&r1=1404160&r2=1404161&view=diff
==============================================================================
--- directory/apacheds/trunk/core-api/src/test/java/org/apache/directory/server/core/api/MockDirectoryService.java (original)
+++ directory/apacheds/trunk/core-api/src/test/java/org/apache/directory/server/core/api/MockDirectoryService.java Wed Oct 31 14:20:55 2012
@@ -612,4 +612,12 @@ public class MockDirectoryService implem
{
// TODO Auto-generated method stub
}
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setCacheService( CacheService cacheService )
+ {
+ // nothing
+ }
}
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=1404161&r1=1404160&r2=1404161&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 Oct 31 14:20:55 2012
@@ -1813,15 +1813,19 @@ 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 )
{
setDefaultInterceptorConfigurations();
}
- cacheService = new CacheService();
- cacheService.initialize( this );
+ if ( cacheService != null )
+ {
+ cacheService.initialize( instanceLayout );
+ }
// Initialize the AP caches
accessControlAPCache = new DnNode<AccessControlAdministrativePoint>();
@@ -1832,8 +1836,10 @@ public class DefaultDirectoryService imp
dnFactory = new DefaultDnFactory( schemaManager, cacheService.getCache( "dnCache" ) );
// triggers partition to load schema fully from schema partition
+ schemaPartition.setCacheService( cacheService );
schemaPartition.initialize();
partitions.add( schemaPartition );
+ systemPartition.setCacheService( cacheService );
systemPartition.getSuffixDn().apply( schemaManager );
adminDn = getDnFactory().create( ServerDNConstants.ADMIN_SYSTEM_DN );
@@ -2327,4 +2333,14 @@ public class DefaultDirectoryService imp
{
return evaluator;
}
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setCacheService( CacheService cacheService )
+ {
+ this.cacheService = cacheService;
+ }
+
}
\ No newline at end of file
Modified: directory/apacheds/trunk/service/src/main/java/org/apache/directory/server/ApacheDsService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/service/src/main/java/org/apache/directory/server/ApacheDsService.java?rev=1404161&r1=1404160&r2=1404161&view=diff
==============================================================================
--- directory/apacheds/trunk/service/src/main/java/org/apache/directory/server/ApacheDsService.java (original)
+++ directory/apacheds/trunk/service/src/main/java/org/apache/directory/server/ApacheDsService.java Wed Oct 31 14:20:55 2012
@@ -38,6 +38,7 @@ import org.apache.directory.server.confi
import org.apache.directory.server.config.beans.LdapServerBean;
import org.apache.directory.server.config.beans.NtpServerBean;
import org.apache.directory.server.config.builder.ServiceBuilder;
+import org.apache.directory.server.core.api.CacheService;
import org.apache.directory.server.core.api.CoreSession;
import org.apache.directory.server.core.api.DirectoryService;
import org.apache.directory.server.core.api.InstanceLayout;
@@ -161,9 +162,12 @@ public class ApacheDsService
LOG.info( "using partition dir {}", partitionsDir.getAbsolutePath() );
+ CacheService cacheService = new CacheService();
+ cacheService.initialize( instanceLayout );
+
initSchemaManager( instanceLayout );
initSchemaLdifPartition( instanceLayout );
- initConfigPartition( instanceLayout );
+ initConfigPartition( instanceLayout, cacheService );
// Read the configuration
cpReader = new ConfigPartitionReader( configPartition );
@@ -173,7 +177,7 @@ public class ApacheDsService
DirectoryServiceBean directoryServiceBean = configBean.getDirectoryServiceBean();
// Initialize the DirectoryService now
- DirectoryService directoryService = initDirectoryService( instanceLayout, directoryServiceBean );
+ DirectoryService directoryService = initDirectoryService( instanceLayout, directoryServiceBean, cacheService );
// start the LDAP server
startLdap( directoryServiceBean.getLdapServerBean(), directoryService );
@@ -258,9 +262,10 @@ public class ApacheDsService
* initializes a LDIF partition for configuration
*
* @param instanceLayout the instance layout
+ * @param cacheService the Cache service
* @throws Exception in case of any issues while extracting the schema
*/
- private void initConfigPartition( InstanceLayout instanceLayout ) throws Exception
+ private void initConfigPartition( InstanceLayout instanceLayout, CacheService cacheService ) throws Exception
{
File confFile = new File( instanceLayout.getConfDirectory(), LdifConfigExtractor.LDIF_CONFIG_FILE );
@@ -280,13 +285,14 @@ public class ApacheDsService
configPartition.setPartitionPath( confFile.toURI() );
configPartition.setSuffixDn( new Dn( schemaManager, "ou=config" ) );
configPartition.setSchemaManager( schemaManager );
-
+ configPartition.setCacheService( cacheService );
+
configPartition.initialize();
}
private DirectoryService initDirectoryService( InstanceLayout instanceLayout,
- DirectoryServiceBean directoryServiceBean ) throws Exception
+ DirectoryServiceBean directoryServiceBean, CacheService cacheService ) throws Exception
{
LOG.info( "Initializing the DirectoryService..." );
@@ -304,7 +310,9 @@ public class ApacheDsService
// Store the default directories
directoryService.setInstanceLayout( instanceLayout );
-
+
+ directoryService.setCacheService( cacheService );
+
directoryService.startup();
AttributeType ocAt = schemaManager.lookupAttributeTypeRegistry( SchemaConstants.OBJECT_CLASS_AT );
@@ -374,14 +382,7 @@ public class ApacheDsService
ldapServer.setDirectoryService( directoryService );
// And start the server now
- try
- {
- ldapServer.start();
- }
- catch ( Exception e )
- {
- LOG.error( "Cannot start the server : " + e.getMessage() );
- }
+ ldapServer.start();
LOG.info( "LDAP server: started in {} milliseconds", ( System.currentTimeMillis() - startTime ) + "" );
}
Modified: directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java?rev=1404161&r1=1404160&r2=1404161&view=diff
==============================================================================
--- directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java (original)
+++ directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java Wed Oct 31 14:20:55 2012
@@ -45,6 +45,7 @@ import org.apache.directory.server.core.
import org.apache.directory.server.core.api.interceptor.context.ModifyOperationContext;
import org.apache.directory.server.core.api.interceptor.context.MoveAndRenameOperationContext;
import org.apache.directory.server.core.api.interceptor.context.MoveOperationContext;
+import org.apache.directory.server.core.api.interceptor.context.OperationContext;
import org.apache.directory.server.core.api.interceptor.context.RenameOperationContext;
import org.apache.directory.server.core.api.interceptor.context.SearchOperationContext;
import org.apache.directory.server.core.api.interceptor.context.UnbindOperationContext;
@@ -802,6 +803,8 @@ public abstract class AbstractBTreeParti
// We now defer the deletion to the implementing class
delete( id );
+
+ updateCache( deleteContext );
}
catch ( LdapException le )
{
@@ -1180,7 +1183,14 @@ public abstract class AbstractBTreeParti
try
{
lockRead();
- Entry entry = master.get( id );
+ Entry entry = lookupCache( id );
+
+ if( entry != null )
+ {
+ return new ClonedServerEntry( entry );
+ }
+
+ entry = master.get( id );
if ( entry != null )
{
@@ -1195,6 +1205,8 @@ public abstract class AbstractBTreeParti
entry.setDn( dn );
+ addToCache( id, entry );
+
return new ClonedServerEntry( entry );
}
@@ -1229,8 +1241,13 @@ public abstract class AbstractBTreeParti
{
try
{
- Entry entry = null;
-
+ Entry entry = lookupCache( id );
+
+ if( entry != null )
+ {
+ return new ClonedServerEntry( entry );
+ }
+
try
{
lockRead();
@@ -1249,6 +1266,7 @@ public abstract class AbstractBTreeParti
entry.setDn( dn );
}
+ addToCache( id, entry );
return new ClonedServerEntry( entry );
}
@@ -1275,6 +1293,8 @@ public abstract class AbstractBTreeParti
modifyContext.getModItems().toArray( new Modification[]
{} ) );
modifyContext.setAlteredEntry( modifiedEntry );
+
+ updateCache( modifyContext );
}
catch ( Exception e )
{
@@ -1618,6 +1638,7 @@ public abstract class AbstractBTreeParti
Entry modifiedEntry = moveContext.getModifiedEntry();
move( oldDn, newSuperior, newDn, modifiedEntry );
+ updateCache( moveContext );
}
catch ( Exception e )
{
@@ -1741,6 +1762,7 @@ public abstract class AbstractBTreeParti
Entry modifiedEntry = moveAndRenameContext.getModifiedEntry();
moveAndRename( oldDn, newSuperiorDn, newRdn, modifiedEntry, deleteOldRdn );
+ updateCache( moveAndRenameContext );
}
catch ( LdapException le )
{
@@ -1908,6 +1930,8 @@ public abstract class AbstractBTreeParti
{
rename( oldDn, newRdn, deleteOldRdn, null );
}
+
+ updateCache( renameContext );
}
catch ( Exception e )
{
@@ -2881,4 +2905,41 @@ public abstract class AbstractBTreeParti
{
masterTableLock.writeLock().unlock();
}
+
+
+ /**
+ * updates the cache based on the type of OperationContext
+ *
+ * @param opCtx the operation's context
+ */
+ public void updateCache( OperationContext opCtx )
+ {
+ // partition implementations should override this if they want to use cache
+ }
+
+
+ /**
+ * looks up for the entry with the given ID in the cache
+ *
+ * @param id the ID of the entry
+ * @return the Entry if exists, null otherwise
+ */
+ public Entry lookupCache( String id )
+ {
+ return null;
+ }
+
+
+ /**
+ * adds the given entry to cache
+ *
+ * Note: this method is not called during add operation to avoid filling the cache
+ * with all the added entries
+ *
+ * @param id ID of the entry
+ * @param entry the Entry
+ */
+ public void addToCache( String id, Entry entry )
+ {
+ }
}