提交 c4af37cd authored 作者: Thomas Mueller's avatar Thomas Mueller

Out of memory detection

上级 0b219336
...@@ -235,6 +235,15 @@ public abstract class Command implements CommandInterface { ...@@ -235,6 +235,15 @@ public abstract class Command implements CommandInterface {
return update(); return update();
} catch (DbException e) { } catch (DbException e) {
start = filterConcurrentUpdate(e, start); start = filterConcurrentUpdate(e, start);
} catch (OutOfMemoryError e) {
; // TODO avoid duplicate code, and do the same for queries
// there is a serious problem:
// the transaction may be applied partially
// in this case we need to panic:
// close the database
callStop = false;
database.shutdownImmediately();
throw DbException.convert(e);
} catch (Throwable e) { } catch (Throwable e) {
throw DbException.convert(e); throw DbException.convert(e);
} }
...@@ -243,10 +252,7 @@ public abstract class Command implements CommandInterface { ...@@ -243,10 +252,7 @@ public abstract class Command implements CommandInterface {
e = e.addSQL(sql); e = e.addSQL(sql);
SQLException s = e.getSQLException(); SQLException s = e.getSQLException();
database.exceptionThrown(s, sql); database.exceptionThrown(s, sql);
database.checkPowerOff(); if (s.getErrorCode() == ErrorCode.OUT_OF_MEMORY) {
if (s.getErrorCode() == ErrorCode.DEADLOCK_1) {
session.rollback();
} else if (s.getErrorCode() == ErrorCode.OUT_OF_MEMORY) {
// there is a serious problem: // there is a serious problem:
// the transaction may be applied partially // the transaction may be applied partially
// in this case we need to panic: // in this case we need to panic:
...@@ -254,6 +260,10 @@ public abstract class Command implements CommandInterface { ...@@ -254,6 +260,10 @@ public abstract class Command implements CommandInterface {
callStop = false; callStop = false;
database.shutdownImmediately(); database.shutdownImmediately();
throw e; throw e;
}
database.checkPowerOff();
if (s.getErrorCode() == ErrorCode.DEADLOCK_1) {
session.rollback();
} else { } else {
session.rollbackTo(rollback, false); session.rollbackTo(rollback, false);
} }
......
...@@ -62,12 +62,18 @@ public class TestOutOfMemory extends TestBase { ...@@ -62,12 +62,18 @@ public class TestOutOfMemory extends TestBase {
ResultSet rs = stat.executeQuery("select count(*) from stuff"); ResultSet rs = stat.executeQuery("select count(*) from stuff");
rs.next(); rs.next();
assertEquals(3000, rs.getInt(1)); assertEquals(3000, rs.getInt(1));
} catch (OutOfMemoryError e) {
freeMemory();
fail("Out of memory not detected");
} finally { } finally {
try { freeMemory();
conn.close(); if (conn != null) {
} catch (SQLException e) { try {
// out of memory will / may close the database conn.close();
assertKnownException(e); } catch (SQLException e) {
// out of memory will / may close the database
assertKnownException(e);
}
} }
} }
deleteDb("outOfMemory"); deleteDb("outOfMemory");
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论