提交 6de905e8 authored 作者: Thomas Mueller's avatar Thomas Mueller

The feature LOG_SIZE_LIMIT that was introduced in version 1.3.165 did not always…

The feature LOG_SIZE_LIMIT that was introduced in version 1.3.165 did not always work correctly (specially with regards to multithreading) and has been removed. The message "Transaction log could not be truncated" is still written to the .trace.db file if required.
上级 c89ab9ef
...@@ -311,14 +311,6 @@ public class DbSettings extends SettingsBase { ...@@ -311,14 +311,6 @@ public class DbSettings extends SettingsBase {
*/ */
public final boolean shareLinkedConnections = get("SHARE_LINKED_CONNECTIONS", true); public final boolean shareLinkedConnections = get("SHARE_LINKED_CONNECTIONS", true);
/**
* Database setting <code>LOG_SIZE_LIMIT</code> (default: 0).<br />
* The maximum size of the transaction log (in MB). If the transaction log
* is bigger than this value the oldest session is rolled back. The value 0
* means the sessions are never rolled back.
*/
public long logSizeLimit = get("LOG_SIZE_LIMIT", 0);
private DbSettings(HashMap<String, String> s) { private DbSettings(HashMap<String, String> s) {
super(s); super(s);
} }
......
...@@ -1441,26 +1441,6 @@ public class PageStore implements CacheWriter { ...@@ -1441,26 +1441,6 @@ public class PageStore implements CacheWriter {
} }
ignoreBigLog = true; ignoreBigLog = true;
trace.error(null, "Transaction log could not be truncated; size: " + (newSize / 1024 / 1024) + " MB"); trace.error(null, "Transaction log could not be truncated; size: " + (newSize / 1024 / 1024) + " MB");
long logSizeLimit = database.getSettings().logSizeLimit;
if (logSizeLimit == 0 || newSize < logSizeLimit) {
return;
}
int firstUncommittedSection = log.getLogSectionId();
Session[] sessions = database.getSessions(true);
Session oldestSession = null;
for (Session s : sessions) {
int firstUncommitted = s.getFirstUncommittedLog();
if (firstUncommitted != Session.LOG_WRITTEN) {
if (firstUncommitted < firstUncommittedSection) {
firstUncommittedSection = firstUncommitted;
oldestSession = s;
}
}
}
trace.info("Rolling back session #" +oldestSession.getId() + " (the oldest uncommitted)");
synchronized (oldestSession) {
oldestSession.rollback();
}
logSizeBase = log.getSize(); logSizeBase = log.getSize();
} }
} }
......
...@@ -78,18 +78,10 @@ public class TestPageStore extends TestBase implements DatabaseEventListener { ...@@ -78,18 +78,10 @@ public class TestPageStore extends TestBase implements DatabaseEventListener {
} }
private void testLogLimit() throws Exception { private void testLogLimit() throws Exception {
testLogLimit(false);
testLogLimit(true);
}
private void testLogLimit(boolean autoRollback) throws Exception {
deleteDb("pageStore"); deleteDb("pageStore");
Connection conn, conn2; Connection conn, conn2;
Statement stat, stat2; Statement stat, stat2;
String url = "pageStore;TRACE_LEVEL_FILE=2"; String url = "pageStore;TRACE_LEVEL_FILE=2";
if (autoRollback) {
url += ";LOG_SIZE_LIMIT=1";
}
conn = getConnection(url); conn = getConnection(url);
stat = conn.createStatement(); stat = conn.createStatement();
stat.execute("create table test(id int primary key)"); stat.execute("create table test(id int primary key)");
...@@ -106,19 +98,9 @@ public class TestPageStore extends TestBase implements DatabaseEventListener { ...@@ -106,19 +98,9 @@ public class TestPageStore extends TestBase implements DatabaseEventListener {
InputStream in = FileUtils.newInputStream(getBaseDir() + "/pageStore.trace.db"); InputStream in = FileUtils.newInputStream(getBaseDir() + "/pageStore.trace.db");
String s = IOUtils.readStringAndClose(new InputStreamReader(in), -1); String s = IOUtils.readStringAndClose(new InputStreamReader(in), -1);
assertTrue(s.indexOf("Transaction log could not be truncated") > 0); assertTrue(s.indexOf("Transaction log could not be truncated") > 0);
if (autoRollback) {
assertTrue(s, s.indexOf("Rolling back session") > 0);
} else {
assertTrue(s, s.indexOf("Rolling back session") < 0);
}
conn.commit(); conn.commit();
ResultSet rs = stat2.executeQuery("select * from test"); ResultSet rs = stat2.executeQuery("select * from test");
if (autoRollback) {
assertFalse(rs.next());
} else {
assertTrue(rs.next()); assertTrue(rs.next());
}
conn2.close(); conn2.close();
conn.close(); conn.close();
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论