You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by oy...@apache.org on 2008/01/03 11:22:36 UTC
svn commit: r608419 - in /db/derby/code/trunk/java/engine/org/apache/derby:
iapi/services/replication/slave/ impl/services/replication/net/
impl/services/replication/slave/ impl/store/raw/ impl/store/raw/log/ loc/
Author: oysteing
Date: Thu Jan 3 02:22:35 2008
New Revision: 608419
URL: http://svn.apache.org/viewvc?rev=608419&view=rev
Log:
Contributed by Jorgen Loland: I encountered a few bugs while working on a new implementation of the Database interface. The attached patch fixes these bugs, which are all part of the replication functionality and is not in use in non-replicated databases.
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/replication/slave/SlaveFactory.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/services/replication/net/ReplicationMessageReceive.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/services/replication/slave/SlaveController.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/RawStore.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/log/LogAccessFile.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/log/LogToFile.java
db/derby/code/trunk/java/engine/org/apache/derby/loc/messages.xml
Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/replication/slave/SlaveFactory.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/replication/slave/SlaveFactory.java?rev=608419&r1=608418&r2=608419&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/replication/slave/SlaveFactory.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/replication/slave/SlaveFactory.java Thu Jan 3 02:22:35 2008
@@ -49,14 +49,6 @@
/* Strings used as keys in the Properties objects*/
- /** Property key to specify which host to listen to */
- public static final String SLAVE_HOST =
- Property.PROPERTY_RUNTIME_PREFIX + "replication.slave.slavehost";
-
- /** Property key to specify which port to listen to */
- public static final String SLAVE_PORT =
- Property.PROPERTY_RUNTIME_PREFIX + "replication.slave.slaveport";
-
/** Property key to specify the name of the database */
public static final String SLAVE_DB =
Property.PROPERTY_RUNTIME_PREFIX + "replication.slave.dbname";
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/replication/net/ReplicationMessageReceive.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/services/replication/net/ReplicationMessageReceive.java?rev=608419&r1=608418&r2=608419&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/services/replication/net/ReplicationMessageReceive.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/services/replication/net/ReplicationMessageReceive.java Thu Jan 3 02:22:35 2008
@@ -45,6 +45,11 @@
private final SlaveAddress slaveAddress;
/**
+ * Contains the <code>ServerSocket</code> used to listen for
+ * connections from the replication master. */
+ private ServerSocket serverSocket;
+
+ /**
* Contains the methods used to read and write to the Object streams
* obtained from a <code>Socket</code> connection.
*/
@@ -101,9 +106,12 @@
StandardException,
ClassNotFoundException {
- //Contains the <code>ServerSocket</code> used to listen for
- //connections from the replication master.
- final ServerSocket serverSocket = createServerSocket();
+ // Create the ServerSocket object if this is the first
+ // initConnection attempt. Otherwise, we reuse the existing
+ // server socket
+ if (serverSocket == null) {
+ serverSocket = createServerSocket();
+ }
serverSocket.setSoTimeout(timeout);
//Start listening on the socket and accepting the connection
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/replication/slave/SlaveController.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/services/replication/slave/SlaveController.java?rev=608419&r1=608418&r2=608419&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/services/replication/slave/SlaveController.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/services/replication/slave/SlaveController.java Thu Jan 3 02:22:35 2008
@@ -23,6 +23,7 @@
package org.apache.derby.impl.services.replication.slave;
import org.apache.derby.iapi.error.StandardException;
+import org.apache.derby.iapi.reference.Attribute;
import org.apache.derby.iapi.reference.MessageId;
import org.apache.derby.iapi.reference.SQLState;
import org.apache.derby.iapi.services.monitor.ModuleControl;
@@ -112,9 +113,9 @@
public void boot(boolean create, Properties properties)
throws StandardException {
- slavehost = properties.getProperty(SlaveFactory.SLAVE_HOST);
+ slavehost = properties.getProperty(Attribute.REPLICATION_SLAVE_HOST);
- String port = properties.getProperty(SlaveFactory.SLAVE_PORT);
+ String port = properties.getProperty(Attribute.REPLICATION_SLAVE_PORT);
if (port != null) {
slaveport = new Integer(port).intValue();
}
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/RawStore.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/RawStore.java?rev=608419&r1=608418&r2=608419&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/RawStore.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/RawStore.java Thu Jan 3 02:22:35 2008
@@ -314,6 +314,20 @@
dataFactory.setDatabaseEncrypted();
}
+ // If SlaveFactory is to be booted, the boot has to happen
+ // before logFactory.recover since that method will be blocked
+ // when in replication slave mode.
+ if (inReplicationSlaveMode) {
+ // The LogFactory has already been booted in slave mode.
+ // Can now start slave replication by booting the
+ // SlaveFactory service
+ slaveFactory = (SlaveFactory)
+ Monitor.bootServiceModule(create, this,
+ getSlaveFactoryModule(),
+ properties);
+ slaveFactory.startSlave(this, logFactory);
+ }
+
// no need to tell log factory which raw store factory it belongs to
// since this is passed into the log factory for recovery
// after the factories are loaded, recover the database
@@ -324,17 +338,6 @@
if (encryptDatabase) {
configureDatabaseForEncryption(properties,
newCipherFactory);
- }
-
- if (inReplicationSlaveMode) {
- // The LogFactory has already been booted in slave mode.
- // Can now start slave replication by booting the
- // SlaveFactory service
- slaveFactory = (SlaveFactory)
- Monitor.bootServiceModule(create, this,
- getSlaveFactoryModule(),
- properties);
- slaveFactory.startSlave(this, logFactory);
}
}
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/log/LogAccessFile.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/log/LogAccessFile.java?rev=608419&r1=608418&r2=608419&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/log/LogAccessFile.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/log/LogAccessFile.java Thu Jan 3 02:22:35 2008
@@ -111,6 +111,7 @@
// the MasterFactory that will accept log when in replication master mode
MasterFactory masterFac;
boolean inReplicationMasterMode = false;
+ boolean inReplicationSlaveMode = false;
//streams used to generated check sume log record ; see if there is any simpler way
private ArrayOutputStream logOutputBuffer;
@@ -134,6 +135,10 @@
bufferSize = 10; // make it very tiny
}
+ // Puts this LogAccessFile object in replication slave or
+ // master mode if the database has such a role
+ logFactory.checkForReplication(this);
+
this.log = log;
logFileSemaphore = log;
this.logFactory = logFactory;
@@ -162,6 +167,9 @@
// soft upgrade mode.
writeChecksum = logFactory.checkVersion(RawStoreFactory.DERBY_STORE_MAJOR_VERSION_10,
RawStoreFactory.DERBY_STORE_MINOR_VERSION_1);
+
+ // Checksums are received from the master if in slave replication mode
+ if (inReplicationSlaveMode) writeChecksum = false;
if(writeChecksum)
{
/**
@@ -206,7 +214,6 @@
}
currentBuffer.init(checksumLogRecordSize);
- logFactory.checkForReplication(this);
}
@@ -729,6 +736,31 @@
protected void stopReplicationMasterRole() {
inReplicationMasterMode = false;
masterFac = null;
+ }
+
+ /**
+ * Method to put this LogAccessFile object in replication slave
+ * mode, effectively disabling checksum writes.
+ *
+ * Because checksums are received from the replication master, the
+ * slave can not be allowed to add it's own checksums - that would
+ * invalidate the checksums and would stop the database from
+ * recovering. Replication slave mode must therefore be set before
+ * LogAccessFile decides whether to write it's own checksums, and
+ * this method is therefore indirectly called from the constructor
+ * of this class by calling LogFactory.checkForReplication
+ *
+ * If replication slave mode for the database is stopped after
+ * this object has been created, checksums cannot be reenabled
+ * without creating a new instance of this class. That is
+ * conveniently handled as LogToFile.recover completes (which
+ * automatically happens once replication slave mode is no longer
+ * active)
+ *
+ * @see LogToFile#checkForReplication
+ */
+ protected void setReplicationSlaveRole() {
+ inReplicationSlaveMode = true;
}
/* write to the log file */
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/log/LogToFile.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/log/LogToFile.java?rev=608419&r1=608418&r2=608419&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/log/LogToFile.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/log/LogToFile.java Thu Jan 3 02:22:35 2008
@@ -5076,6 +5076,8 @@
protected void checkForReplication(LogAccessFile log) {
if (inReplicationMasterMode) {
log.setReplicationMasterRole(masterFactory);
+ } else if (inReplicationSlaveMode) {
+ log.setReplicationSlaveRole();
}
}
Modified: db/derby/code/trunk/java/engine/org/apache/derby/loc/messages.xml
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/loc/messages.xml?rev=608419&r1=608418&r2=608419&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/loc/messages.xml (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/loc/messages.xml Thu Jan 3 02:22:35 2008
@@ -4740,7 +4740,7 @@
<msg>
<name>XRE04</name>
- <text>Could not establish a connection to the master of the replicated database '{0}'.</text>
+ <text>Could not establish a connection to the peer of the replicated database '{0}'.</text>
<arg>dbname</arg>
</msg>