Hello, I was investigating global unit test failure on Fedora 18 for most of today, I would like to share results I found so far.
Unit test and its related scripts on F18 now reports NSS BUSY exception, just like this one: # ./make-testcert Traceback (most recent call last): File "./make-testcert", line 134, in <module> sys.exit(makecert(reqdir)) File "./make-testcert", line 111, in makecert add=True) File "./make-testcert", line 68, in run result = self.execute(method, *args, **options) File "/root/freeipa-master2/ipalib/backend.py", line 146, in execute raise error #pylint: disable=E0702 ipalib.errors.NetworkError: cannot connect to 'http://vm-042.idm.lab.bos.redhat.com/ipa/session/xml': [Errno -8053] (SEC_ERROR_BUSY) NSS could not shutdown. Objects are still in use. Something In F18 must have changed, this worked before... But leaked NSSConnection objects without proper close() now ends with the exception above. In case of make-testcert script, the exception is raised because the script does the following procedure: 1) connect, do one command 2) disconnect 3) connect, do second command However, during disconnect, NSSConnection is leaked which makes NSS very uncomfortable during second connection atempt (and nss_shutdown()). I managed to fix this issue with attached patch. ./make-testcert or "./make-test tests/test_xmlrpc/test_group_plugin.py" works fine now. But global "./make-test" still fails, I think there is some remaining NSSConnection leak, I suspect there is something wrong with how we use our context (threading.local object). It looses a connection or some other thread invoked in ldap2 module may be kicking in, here is my debug output: CONTEXT[xmlclient] = <ipalib.request.Connection object at 0x9a1f5ec> Test a simple LDAP bind using ldap2 ... SKIP: No directory manager password in /root/.ipa/.dmpw Test the `ipaserver.rpcserver.jsonserver.unmarshal` method. ... ok tests.test_ipaserver.test_rpcserver.test_session.test_mount ... CONTEXT 150714476: GET languages CONTEXT[xmlclient] = None The connection is in the context, but then something happens and it is gone. Then, unit tests try to connect again and NSS fails. I would be really glad if somebody with a knowledge of NSS or how threads in Python/IPA work could give me some advice... Thanks! Martin
diff --git a/ipalib/rpc.py b/ipalib/rpc.py index e97536d..f19d221 100644 --- a/ipalib/rpc.py +++ b/ipalib/rpc.py @@ -250,6 +250,9 @@ class SSLTransport(LanguageAwareTransport): return False def make_connection(self, host): + if self._connection and host == self._connection: + return self._connection + host, self._extra_headers, x509 = self.get_host_info(host) # Python 2.7 changed the internal class used in xmlrpclib from # HTTP to HTTPConnection. We need to use the proper subclass @@ -265,8 +268,10 @@ class SSLTransport(LanguageAwareTransport): else: conn = NSSConnection(host, 443, dbdir=dbdir, no_init=no_init) self.dbdir=dbdir + conn.connect() - return conn + self._connection = host, conn + return self._connection class KerbTransport(SSLTransport): @@ -493,7 +498,10 @@ class xmlclient(Connectible): return serverproxy def destroy_connection(self): - pass + conn = getattr(context, self.id, None) + if conn is not None: + conn = conn.conn._ServerProxy__transport + conn.close() def forward(self, name, *args, **kw): """
_______________________________________________ Freeipa-devel mailing list Freeipaemail@example.com https://www.redhat.com/mailman/listinfo/freeipa-devel