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

Consistent out-of-memory handling

上级 54d5672c
...@@ -180,6 +180,7 @@ public abstract class Command implements CommandInterface { ...@@ -180,6 +180,7 @@ public abstract class Command implements CommandInterface {
Database database = session.getDatabase(); Database database = session.getDatabase();
Object sync = database.isMultiThreaded() ? (Object) session : (Object) database; Object sync = database.isMultiThreaded() ? (Object) session : (Object) database;
session.waitIfExclusiveModeEnabled(); session.waitIfExclusiveModeEnabled();
boolean callStop = true;
boolean writing = !isReadOnly(); boolean writing = !isReadOnly();
if (writing) { if (writing) {
while (!database.beforeWriting()) { while (!database.beforeWriting()) {
...@@ -195,16 +196,33 @@ public abstract class Command implements CommandInterface { ...@@ -195,16 +196,33 @@ public abstract class Command implements CommandInterface {
return query(maxrows); return query(maxrows);
} catch (DbException e) { } catch (DbException e) {
start = filterConcurrentUpdate(e, start); start = filterConcurrentUpdate(e, start);
} catch (OutOfMemoryError e) {
callStop = false;
// there is a serious problem:
// the transaction may be applied partially
// in this case we need to panic:
// close the database
database.shutdownImmediately();
throw DbException.convert(e);
} catch (Throwable e) { } catch (Throwable e) {
throw DbException.convert(e); throw DbException.convert(e);
} }
} }
} catch (DbException e) { } catch (DbException e) {
e.addSQL(sql); e = e.addSQL(sql);
database.exceptionThrown(e.getSQLException(), sql); SQLException s = e.getSQLException();
database.exceptionThrown(s, sql);
if (s.getErrorCode() == ErrorCode.OUT_OF_MEMORY) {
callStop = false;
database.shutdownImmediately();
throw e;
}
database.checkPowerOff();
throw e; throw e;
} finally { } finally {
if (callStop) {
stop(); stop();
}
if (writing) { if (writing) {
database.afterWriting(); database.afterWriting();
} }
...@@ -236,11 +254,6 @@ public abstract class Command implements CommandInterface { ...@@ -236,11 +254,6 @@ public abstract class Command implements CommandInterface {
} catch (DbException e) { } catch (DbException e) {
start = filterConcurrentUpdate(e, start); start = filterConcurrentUpdate(e, start);
} catch (OutOfMemoryError e) { } 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; callStop = false;
database.shutdownImmediately(); database.shutdownImmediately();
throw DbException.convert(e); throw DbException.convert(e);
...@@ -253,10 +266,6 @@ public abstract class Command implements CommandInterface { ...@@ -253,10 +266,6 @@ public abstract class Command implements CommandInterface {
SQLException s = e.getSQLException(); SQLException s = e.getSQLException();
database.exceptionThrown(s, sql); database.exceptionThrown(s, sql);
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:
// close the database
callStop = false; callStop = false;
database.shutdownImmediately(); database.shutdownImmediately();
throw e; throw e;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论