directory-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Emmanuel Lecharny (JIRA)" <j...@apache.org>
Subject [jira] Commented: (DIRSERVER-1369) Concurrent bind and unbind of objects puts ADS in an inconsistent (unusable) state.
Date Sun, 31 May 2009 09:26:07 GMT

    [ https://issues.apache.org/jira/browse/DIRSERVER-1369?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12714838#action_12714838
] 

Emmanuel Lecharny commented on DIRSERVER-1369:
----------------------------------------------

We are using a continuous build system. if there was some issue with the source, we would
be informed immediately. Also we are careful enough to do a full build *before* commiting
code on trunk so that other developpers don't have issue with compilation.

So far, I have asked someone else to check that the last trunk version was compiling ok. Of
course, this is on Linux, which may be a bit different than on windows, but as far as I can
tell, I rebuild the full server last friday on windows, without any problem. 

If you are using a slow windows machine however, you may have some time issues during the
unit tests for some specific part of the code (probably because we assume that we are running
the tests on a fast enough machine in order to avoid introducing waits in time dependent tests).

In any case, we really don't have time not storage to produce nighty builds atm. This is something
we want to do at some point, but not before july.

Last, not least, i'm really sorry, but I don't have a windows machine available :/ I use a
linux box, and a mac occasionally...

You can ask the ML if someone is kind enough to build this windows binaries...

> Concurrent bind and unbind of objects puts ADS in an inconsistent (unusable) state.
> -----------------------------------------------------------------------------------
>
>                 Key: DIRSERVER-1369
>                 URL: https://issues.apache.org/jira/browse/DIRSERVER-1369
>             Project: Directory ApacheDS
>          Issue Type: Bug
>    Affects Versions: 1.5.4
>         Environment: Windows-xp, JDK-1.5 
>            Reporter: Murali Krishna 
>            Priority: Blocker
>             Fix For: 1.5.5
>
>         Attachments: MultiThreadedTest.java, MultiThreadedTest.java
>
>   Original Estimate: 120h
>  Remaining Estimate: 120h
>
> This is with reference to a problem we faced when performing concurrent bind and unbind
of objects with ADS-1.5.4 release build.
> Please find the java program at the bottom.
> Steps to reproduce:
> 1. Install apache_1.5.4 zip version of it and not the installer and change port numbers
to 1389 and 1636 respectively.
> 2. Create a naming context ( JDBM partition) on the lines of dc=example,dc=com
> 3. Also create the entry dc=example,dc=com
> 4. Run the java program provided below.
> Actual Result:
> The console throws up numerous Naming Exceptions with message "[LDAP: error code 80 -
OTHER: failed for     Del request
>         Entry : '2.5.4.3=adsadminpref_thread-11,0.9.2342.19200300.100.1.25=example,0.9.2342.19200300.100.1.25=com'
> : null]; remaining name 'cn=tdsadminPref_Thread-11,dc=telelogic,dc=com' " for each thread
operating on a preference object.
> As a result, the server gets into an inconsistent state and unoperational.
> Expected Result: 
> The server should continuously bind and unbind the java hash table object.
> What could have caused this and how do we correct this.
> Are there any specific configurations to be made in the server.xml.
> I tried modifying some of the attributes like syncOnWrite, syncOnMillis, maxThreads,
cachesize and also rebind (instead of bind and unbind) in the java program , but in vain.
> This is very important for us and do help us in this regard.
> Java program:
> import java.util.Date;
> import java.util.HashMap;
> import java.util.Hashtable;
> import java.util.Map;
> import javax.naming.CommunicationException;
> import javax.naming.Context;
> import javax.naming.NameAlreadyBoundException;
> import javax.naming.NameNotFoundException;
> import javax.naming.NamingException;
> import javax.naming.ldap.InitialLdapContext;
> import javax.naming.ldap.LdapContext;
> import com.telelogic.tds.common.TDSConstants;
> import com.telelogic.tds.common.TDSProperties;
> import com.telelogic.tds.engine.ldap.jndi.TDSDirObjectConstants;
> public class MultiThreadedTest extends Thread {
>     @Override
>     public void run() {
>         try {
>             LdapContext _tdsContext = null, _cntx;
>             _tdsContext = getContext();
>             // Create the initial context             
>             Map<String, Object> hMap = new HashMap<String, Object>();
>             hMap.put("data", "dsfdfd");
>             // authenticate user
>             int delay = 1;
>             while (true) {
>                 try {
>                     System.out.println(" Ops started " + getName());
>                     _cntx = _tdsContext.newInstance(null);                   
>                     setUserPreferences(_cntx, "adsadminPref_" + getName(), hMap);
>                     System.out.println(new Date()
>                         + " Preferences SET "
>                         + getName()
>                         + " "
>                         + getId()
>                         + " SIZE-- "
>                         + ((hMap.get("data") != null) ? hMap.get("data")
>                             .toString().length() : 0));
>                     _cntx.close();
>                     System.out.println(" Ops conducted successfully "
>                         + getName());
>                 } catch (NamingException e) {
>                     System.out.println(new Date() + " NAMING EXCETPION"
>                         + getName() + " " + getId());
>                     e.printStackTrace();
>                 } catch (Exception ex) {
>                     System.out.println(new Date() + " NAMING EXCETPION"
>                         + getName() + " " + getId());
>                     ex.printStackTrace();
>                 }
>                 Thread.sleep(delay);
>             }
>         } catch (Throwable e) {
>             e.printStackTrace();
>         }
>     }
>     private static LdapContext getContext() {
>         Hashtable<String, String> env = new Hashtable<String, String>();
>         LdapContext context = null;
>         String adminName = "uid=admin,ou=system";
>         String adminPassword = "secret";
>         env.put(Context.INITIAL_CONTEXT_FACTORY,
>             "com.sun.jndi.ldap.LdapCtxFactory");
>         env.put(Context.SECURITY_AUTHENTICATION, "simple");
>         env.put(Context.SECURITY_PRINCIPAL, adminName);
>         env.put(Context.SECURITY_CREDENTIALS, adminPassword);
>         //env.put(Context.PROVIDER_URL, "ldap://10.255.0.40:389");
>         env.put(Context.PROVIDER_URL, "ldap://localhost:1389");
>         env.put(TDSConstants.JNDI_LDAP_CONNECTION_TIMEOUT, TDSProperties
>             .getProperty(TDSConstants.LDAP_CONNECTION_TIMEOUT, "2000"));
>         env.put("com.sun.jndi.ldap.connect.pool", TDSProperties.getProperty(
>             "com.sun.jndi.ldap.connect.pool", "true"));
>         try {
>             context = new InitialLdapContext(env, null);
>         } catch (NamingException ne) {
>             System.exit(1);
>         }
>         return context;
>     }
>     public static void setUserPreferences(LdapContext context, String userName,
>         Map<String, Object> attributes) throws NamingException {
>         LdapContext derivedContext = context;
>         String bindOp =
>             TDSDirObjectConstants.CN + TDSDirObjectConstants.EQUAL_SYNTAX
>                 + userName + "," + "dc=example,dc=com";
>         try {
>             try {
>                 // Step 1: Unbind the user preferences data
>                 derivedContext.unbind(bindOp);
>             } catch (CommunicationException ce) {
>                 System.out.println("Trying to re-connect to RDS");
>                 //Impl reconnect logic
>             } catch (NameNotFoundException nnf) {
>                 System.out.println("User: " + userName
>                     + " cannot be found in the Ldap server");
>             }
>             try {
>                 // Step 2: Bind the user preferences data
>                 derivedContext.bind(bindOp, attributes);
>             } catch (CommunicationException ce) {
>                 System.out.println("Trying to re-connect to RDS");
>             } catch (NameAlreadyBoundException nab) {
>                 System.out.println("User: " + userName
>                     + " already exists in the Ldap server");
>             }
>             //derivedContext.rebind(bindOp, attributes);
>         } catch (NamingException ne) {
>             System.out.println("Could not set user profile for user: "
>                 + userName);
>             throw ne;
>         }
>     }
>     /**
>      * @param args
>      */
>     public static void main(String[] args) {
>         Thread t1, t2 = null;
>         for (int i = 0; i < 15; ++i) {
>             t1 = new MultiThreadedTest();
>             t1.start();
>         }
>     }
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message