Fix for the deadlock appeared in the last daily build.
The root cause is a concurrent access to the db resource of the
changelog server when the shutdown() method is called.
[testng] Java stack information for the threads listed above:
[testng] ===================================================
[testng] "Changelog Server 11 zone35.gridzones.com:43150 dc=example,dc=com reader":
[testng] at com.sleepycat.je.Database.removeCursor(Database.java:1055)
[testng] - waiting to lock <0xf4f36310> (a com.sleepycat.je.Database)
[testng] at com.sleepycat.je.Cursor.close(Cursor.java:254)
[testng] - locked <0xf4f36430> (a com.sleepycat.je.Cursor)
[testng] at org.opends.server.synchronization.changelog.ChangelogDB.readFirstChange(ChangelogDB.java:212)
[testng] at org.opends.server.synchronization.changelog.DbHandler.<init>(DbHandler.java:103)
[testng] at org.opends.server.synchronization.changelog.Changelog.newDbHandler(Changelog.java:600)
[testng] at org.opends.server.synchronization.changelog.ChangelogCache.put(ChangelogCache.java:167)
[testng] - locked <0xf4f57688> (a java.util.concurrent.ConcurrentHashMap)
[testng] at org.opends.server.synchronization.changelog.ServerReader.run(ServerReader.java:111)
[testng] "main":
[testng] at com.sleepycat.je.Cursor.close(Cursor.java:251)
[testng] - waiting to lock <0xf4f36430> (a com.sleepycat.je.Cursor)
[testng] at com.sleepycat.je.Database.closeInternal(Database.java:273)
[testng] at com.sleepycat.je.Database.close(Database.java:238)
[testng] - locked <0xf4f36310> (a com.sleepycat.je.Database)
[testng] at com.sleepycat.je.Environment.close(Environment.java:273)
[testng] - locked <0xf4f124a8> (a com.sleepycat.je.Environment)
[testng] at org.opends.server.synchronization.changelog.ChangelogDbEnv.shutdown(ChangelogDbEnv.java:234)
[testng] at org.opends.server.synchronization.changelog.Changelog.shutdown(Changelog.java:583)
[testng] at org.opends.server.synchronization.changelog.ChangelogTest.changelogChaining(ChangelogTest.java:724)
| | |
| | | * CDDL HEADER END |
| | | * |
| | | * |
| | | * Portions Copyright 2006 Sun Microsystems, Inc. |
| | | * Portions Copyright 2006-2007 Sun Microsystems, Inc. |
| | | */ |
| | | package org.opends.server.synchronization.changelog; |
| | | |
| | |
| | | } |
| | | |
| | | // Shutdown the dbHandlers |
| | | for (DbHandler dbHandler : sourceDbHandlers.values()) |
| | | synchronized (sourceDbHandlers) |
| | | { |
| | | dbHandler.shutdown(); |
| | | for (DbHandler dbHandler : sourceDbHandlers.values()) |
| | | { |
| | | dbHandler.shutdown(); |
| | | } |
| | | sourceDbHandlers.clear(); |
| | | } |
| | | } |
| | | |