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

Out of memory detection

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