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

Auto-server: 'Connection is broken' instead of 'Error opening database: Lock…

Auto-server: 'Connection is broken' instead of 'Error opening database: Lock file modified in the future'.
上级 37b58591
......@@ -18,7 +18,8 @@ Change Log
<h1>Change Log</h1>
<h2>Next Version (unreleased)</h2>
<ul><li>-
<ul><li>When using the auto-server mode, and if the lock file was modified in the future,
the wrong exception was thrown ('Connection is broken' instead of 'Error opening database: Lock file modified in the future').
</li></ul>
<h2>Version 1.1.105 (2008-12-19)</h2>
......
This source diff could not be displayed because it is too large. You can view the blob instead.
.translator=Thomas Mueller
02000=No data is available
07001=Invalid parameter count for {0}, expected count\: {1}
08000=Error opening database
08000=Error opening database\: {0}
08004=Wrong user name or password
21S02=Column count does not match
22003=Numeric value out of range
......
......@@ -45,9 +45,9 @@ public class ErrorCode {
/**
* The error with code <code>8000</code> is thrown when
* there was a problem trying to create a database lock.
* See the cause for details.
* See the message and cause for details.
*/
public static final int ERROR_OPENING_DATABASE = 8000;
public static final int ERROR_OPENING_DATABASE_1 = 8000;
/**
* The error with code <code>8004</code> is thrown when
......@@ -1876,7 +1876,7 @@ public class ErrorCode {
case INVALID_PARAMETER_COUNT_2: return "07001";
// 08: connection exception
case ERROR_OPENING_DATABASE: return "08000";
case ERROR_OPENING_DATABASE_1: return "08000";
case WRONG_USER_OR_PASSWORD: return "08004";
// 21: cardinality violation
......
.translator=Thomas Mueller
02000=Keine Daten verf\u00FCgbar
07001=Ung\u00FCltige Anzahl Parameter f\u00FCr {0}, erwartet\: {1}
08000=Fehler beim \u00D6ffnen der Datenbank
08000=Fehler beim \u00D6ffnen der Datenbank\: {0}
08004=Falscher Benutzer Name oder Passwort
21S02=Anzahl der Felder stimmt nicht \u00FCberein
22003=Zahlenwert ausserhalb des Bereichs
......
.translator=Thomas Mueller
02000=No data is available
07001=Invalid parameter count for {0}, expected count\: {1}
08000=Error opening database
08000=Error opening database\: {0}
08004=Wrong user name or password
21S02=Column count does not match
22003=Numeric value out of range
......
.translator=Dario V. Fassi
02000=No hay datos disponibles.
07001=Cantidad de parametros invalidos para {0}, cantidad esperada\: {1}
08000=Error abriendo la base de datos
08000=Error abriendo la base de datos\: {0}
08004=Nombre de usuario \u00F3 password incorrecto
21S02=La cantidad de columnas no coincide
22003=Valor numerico fuera de rango
......
.translator=IKEMOTO, Masahiro
02000=\u6709\u52B9\u306A\u30C7\u30FC\u30BF\u304C\u3042\u308A\u307E\u305B\u3093
07001={0} \u306F\u7121\u52B9\u306A\u30D1\u30E9\u30E1\u30FC\u30BF\u756A\u53F7\u3067\u3059, \u671F\u5F85\u3055\u308C\u308B\u756A\u53F7\: {1}
08000=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30AA\u30FC\u30D7\u30F3\u30A8\u30E9\u30FC
08000=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30AA\u30FC\u30D7\u30F3\u30A8\u30E9\u30FC\: {0}
08004=\u30E6\u30FC\u30B6\u540D\u307E\u305F\u306F\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u4E0D\u6B63\u3067\u3059
21S02=\u5217\u756A\u53F7\u304C\u4E00\u81F4\u3057\u307E\u305B\u3093
22003=\u7BC4\u56F2\u5916\u306E\u6570\u5024\u3067\u3059
......
.translator=Tomek
02000=Dane nie sa dostepne
07001=Niewlasciwa liczba parametrow, oczekiwano ilosci\: {0}
08000=Blad otwarcia bazy danych
08000=Blad otwarcia bazy danych\: {0}
08004=Nieprawidlowy uzytkownik/haslo
21S02=Niezgodna ilosc kolumn
22003=Wartosc numeryczna poza zakresem
......
.translator=Eduardo Fonseca Velasques
02000=N\u00E3o h\u00E1 dados dispon\u00EDveis
07001=Quantidade de par\u00E2metros errados para {0}, experado\: {1}
08000=Erro ao abrir a base de dados
08000=Erro ao abrir a base de dados\: {0}
08004=Autentica\u00E7ao inv\u00E1lida, verifique o usu\u00E1rio ou a senha
21S02=A quantidade de colunas n\u00E3o corresponde
22003=Valor n\u00FAmerico n\u00E3o esta dentro do limite
......
......@@ -16,7 +16,6 @@ import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.SQLException;
import java.util.Properties;
import org.h2.constant.ErrorCode;
import org.h2.constant.SysProperties;
import org.h2.engine.Constants;
......@@ -198,9 +197,11 @@ public class FileLock {
out.close();
}
lastWrite = fs.getLastModified(fileName);
if (trace.isDebugEnabled()) {
trace.debug("save " + properties);
}
} catch (IOException e) {
throw getException(e);
throw getExceptionFatal("Could not save properties " + fileName, e);
}
}
......@@ -244,10 +245,12 @@ public class FileLock {
private Properties load() throws SQLException {
try {
Properties p2 = SortedProperties.loadProperties(fileName);
if (trace.isDebugEnabled()) {
trace.debug("load " + p2);
}
return p2;
} catch (IOException e) {
throw getException(e);
throw getExceptionFatal("Could not load properties " + fileName, e);
}
}
......@@ -256,7 +259,7 @@ public class FileLock {
long last = fs.getLastModified(fileName);
long dist = System.currentTimeMillis() - last;
if (dist < -TIME_GRANULARITY) {
throw error("Lock file modified in the future: dist=" + dist);
throw getExceptionFatal("Lock file modified in the future: dist=" + dist, null);
}
if (dist < SLEEP_GAP) {
try {
......@@ -268,7 +271,7 @@ public class FileLock {
return;
}
}
throw error("Lock file recently modified");
throw getExceptionFatal("Lock file recently modified", null);
}
private void setUniqueId() {
......@@ -286,23 +289,23 @@ public class FileLock {
waitUntilOld();
String m2 = load().getProperty("method", FILE);
if (!m2.equals(FILE)) {
throw error("Unsupported lock method " + m2);
throw getExceptionFatal("Unsupported lock method " + m2, null);
}
save();
sleep(2 * sleep);
if (!load().equals(properties)) {
throw error("Locked by another process");
throw getExceptionAlreadyInUse("Locked by another process");
}
fs.delete(fileName);
if (!fs.createNewFile(fileName)) {
throw error("Another process was faster");
throw getExceptionFatal("Another process was faster", null);
}
}
save();
sleep(SLEEP_GAP);
if (!load().equals(properties)) {
fileName = null;
throw error("Concurrent update");
throw getExceptionFatal("Concurrent update", null);
}
Thread watchdog = new Thread(new Runnable() {
public void run() {
......@@ -347,11 +350,11 @@ public class FileLock {
lockFile();
return;
} else if (!m2.equals(SOCKET)) {
throw error("Unsupported lock method " + m2);
throw getExceptionFatal("Unsupported lock method " + m2, null);
}
String ip = p2.getProperty("ipAddress", ipAddress);
if (!ipAddress.equals(ip)) {
throw error("Locked by another computer: " + ip);
throw getExceptionAlreadyInUse("Locked by another computer: " + ip);
}
String port = p2.getProperty("port", "0");
int portId = Integer.parseInt(port);
......@@ -359,27 +362,27 @@ public class FileLock {
try {
address = InetAddress.getByName(ip);
} catch (UnknownHostException e) {
throw getException(e);
throw getExceptionFatal("Unknown host " + ip, e);
}
for (int i = 0; i < 3; i++) {
try {
Socket s = new Socket(address, portId);
s.close();
throw error("Locked by another process");
throw getExceptionAlreadyInUse("Locked by another process");
} catch (BindException e) {
throw error("Bind Exception");
throw getExceptionFatal("Bind Exception", null);
} catch (ConnectException e) {
trace.debug("lockSocket not connected " + port, e);
} catch (IOException e) {
throw error("IOException");
throw getExceptionFatal("IOException", null);
}
}
if (read != fs.getLastModified(fileName)) {
throw error("Concurrent update");
throw getExceptionFatal("Concurrent update", null);
}
fs.delete(fileName);
if (!fs.createNewFile(fileName)) {
throw error("Another process was faster");
throw getExceptionFatal("Another process was faster", null);
}
}
try {
......@@ -418,15 +421,15 @@ public class FileLock {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
throw getException(e);
throw getExceptionFatal("Sleep interrupted", e);
}
}
private SQLException getException(Throwable t) {
return Message.getSQLException(ErrorCode.ERROR_OPENING_DATABASE, null, t);
private SQLException getExceptionFatal(String reason, Throwable t) {
return Message.getSQLException(ErrorCode.ERROR_OPENING_DATABASE_1, new String[]{reason}, t);
}
private SQLException error(String reason) {
private SQLException getExceptionAlreadyInUse(String reason) {
JdbcSQLException ex = Message.getSQLException(ErrorCode.DATABASE_ALREADY_OPEN_1, reason);
String payload = null;
if (fileName != null) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论