[
https://issues.apache.org/jira/browse/DIRAPI-342?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16848565#comment-16848565
]
Emmanuel Lecharny commented on DIRAPI-342:
------------------------------------------
Thanks Stefan,
you clearly have a point.
>From what I can see, the big problem is when we call {{close()}}, we don't set
>the session in a state where we can't reconnect until the future map is
>cleaned: we just expect it will be done during the {{sessionClosed()}} event
>processing, which might be differed.
Now, I wonder if it wouldn't be a better solution to check if the session is in
{{closing}} state when we try to connect again (we don't check this status
currently). Typically, we should probably check the {{closeFuture}} returned by
the call to {{ldapSession.closeNow()}} in {{close()}} when we try a connect
(which means this closeFuture}} *MUST* be stored globally in the connection.
This would be something like :
- when closing the connection, store the {{closeFuture}} in the connection
- when doing a connect, check if there is a {{closeFuture}} and if so, wait on
it
- clean up the session when the {{sessionClosed()}} event is finally received
wdyt ?
> Unbind breaks connection
> ------------------------
>
> Key: DIRAPI-342
> URL: https://issues.apache.org/jira/browse/DIRAPI-342
> Project: Directory Client API
> Issue Type: Bug
> Affects Versions: 2.0.0.AM2
> Reporter: Stefan Seelmann
> Priority: Major
> Fix For: 2.0.0.AM4, 2.0.0
>
>
> The DelegatedAuthIT/DelegatedAuthOverSslIT/DelegatedAuthOverTlsIT tests fail
> randomly (I try to stabilize tests on Windows, but also happens on Jenkins).
> They all do multiple bind() and unbind() on the same connection, it seems the
> unbind() is the reason.
> A simple test to reproduce the problem (on Linux):
> {code}
> @Test
> public void testSimpleBindAndUnbindLoop() throws Exception
> {
> try ( LdapConnection connection = new LdapNetworkConnection(
> Network.LOOPBACK_HOSTNAME,
> getLdapServer().getPort() ) )
> {
> for ( int i = 0; i < 10000; i++ )
> {
> System.out.println( i );
> connection.bind( "uid=admin,ou=system", "secret" );
> assertTrue( connection.isAuthenticated() );
> connection.unBind();
> assertFalse( connection.isAuthenticated() );
> // Thread.sleep( 10L );
> }
> }
> }
> {code}
> Without the unbind() or when sleeping for 10ms it works fine.
> Otherwise I saw 3 different errors:
> {code}
> org.apache.directory.ldap.client.api.exception.InvalidConnectionException:
> ERR_04108_INVALID_CONNECTION Cannot connect on the server, the connection is
> invalid
> at
> org.apache.directory.ldap.client.api.LdapNetworkConnection.checkSession(LdapNetworkConnection.java:574)
> at
> org.apache.directory.ldap.client.api.LdapNetworkConnection.bindAsync(LdapNetworkConnection.java:1596)
> at
> org.apache.directory.ldap.client.api.LdapNetworkConnection.bind(LdapNetworkConnection.java:1488)
> at
> org.apache.directory.ldap.client.api.AbstractLdapConnection.bind(AbstractLdapConnection.java:134)
> at
> org.apache.directory.ldap.client.api.AbstractLdapConnection.bind(AbstractLdapConnection.java:118)
> {code}
> {code}
> org.apache.directory.api.ldap.model.exception.LdapException:
> ERR_04169_RESPONSE_QUEUE_EMPTIED The response queue has been emptied, no
> response was found.
> at
> org.apache.directory.ldap.client.api.LdapNetworkConnection.bind(LdapNetworkConnection.java:1534)
> at
> org.apache.directory.ldap.client.api.AbstractLdapConnection.bind(AbstractLdapConnection.java:134)
> at
> org.apache.directory.ldap.client.api.AbstractLdapConnection.bind(AbstractLdapConnection.java:118)
> Caused by: org.apache.directory.api.ldap.model.exception.LdapException:
> ERR_04170_TIMEOUT_OCCURED TimeOut occurred
> at
> org.apache.directory.ldap.client.api.LdapNetworkConnection.bind(LdapNetworkConnection.java:1505)
> {code}
> {code}
> org.apache.directory.api.ldap.model.exception.LdapProtocolErrorException:
> PROTOCOL_ERROR: The server will disconnect!
> at
> org.apache.directory.api.ldap.model.message.ResultCodeEnum.processResponse(ResultCodeEnum.java:2137)
> at
> org.apache.directory.ldap.client.api.AbstractLdapConnection.bind(AbstractLdapConnection.java:136)
> at
> org.apache.directory.ldap.client.api.AbstractLdapConnection.bind(AbstractLdapConnection.java:118)
> at
> org.apache.directory.shared.client.api.operations.bind.SimpleBindRequestTest.testSimpleBindAndUnbindLoop(SimpleBindRequestTest.java:664)
> {code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)