提交 2adc8cff authored 作者: noelgrandin's avatar noelgrandin

Fix ABBA deadlock between adding a constraint and the H2-Log-Writer thread.

上级 484563de
......@@ -1708,7 +1708,20 @@ public class PageStore implements CacheWriter {
* @param index the index to add
* @param session the session
*/
public synchronized void addMeta(PageIndex index, Session session) {
public void addMeta(PageIndex index, Session session) {
Table table = index.getTable();
if (SysProperties.CHECK) {
if (!table.isTemporary()) {
/* To prevent ABBA locking problems, we need to always take the Database lock before we take the
* PageStore lock. */
synchronized (database) {
synchronized (this) {
database.verifyMetaLocked(session);
}
}
}
}
synchronized (this) {
int type = index instanceof PageDataIndex ? META_TYPE_DATA_INDEX : META_TYPE_BTREE_INDEX;
IndexColumn[] columns = index.getIndexColumns();
StatementBuilder buff = new StatementBuilder();
......@@ -1723,17 +1736,11 @@ public class PageStore implements CacheWriter {
}
}
String columnList = buff.toString();
Table table = index.getTable();
CompareMode mode = table.getCompareMode();
String options = mode.getName()+ "," + mode.getStrength() + ",";
if (table.isTemporary()) {
options += "temp";
}
if (SysProperties.CHECK) {
if (!table.isTemporary()) {
database.verifyMetaLocked(session);
}
}
options += ",";
if (index instanceof PageDelegateIndex) {
options += "d";
......@@ -1748,6 +1755,7 @@ public class PageStore implements CacheWriter {
row.setKey(index.getId() + 1);
metaIndex.add(session, row);
}
}
/**
* Remove the meta data of an index.
......@@ -1755,17 +1763,25 @@ public class PageStore implements CacheWriter {
* @param index the index to remove
* @param session the session
*/
public synchronized void removeMeta(Index index, Session session) {
public void removeMeta(Index index, Session session) {
if (SysProperties.CHECK) {
if (!index.getTable().isTemporary()) {
/* To prevent ABBA locking problems, we need to always take the Database lock before we take the
* PageStore lock. */
synchronized (database) {
synchronized (this) {
database.verifyMetaLocked(session);
}
}
}
}
synchronized (this) {
if (!recoveryRunning) {
removeMetaIndex(index, session);
metaObjects.remove(index.getId());
}
}
}
private void removeMetaIndex(Index index, Session session) {
int key = index.getId() + 1;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论