Hi Andrew,
Replication should not fail like this; it is definitely a bug. I filed a
new jira issue for it:
https://issues.apache.org/jira/browse/DERBY-3878
I think you'll have to shutdown the slave Derby instance before
restarting replication until this bug has been fixed.
Thanks for providing the necessary details.
--
Jørgen Løland
Andrew Lawrenson wrote:
dHi,
I'm using Derby replication successfully (with v 10.4.1.3, on Solaris x86,
Java 1.5, 32 bit), but what I'm now trying to do is to automate synchronisation
between two servers (both of which are running embedded with applications).
One scenario I'm trying to cope with is where the master database has been
restarted, to stop & re-synchronize the slave database.
After the master has stopped, I'm successfully stopping the replication on
the slave by passing the stopSlave=true attribute, and getting back a XRE42 SQL
State to indicate this success.
However, after this has stopped, it would appear that derby is still listening
on the slave port (verified using netstat), so if after re-copying the database
from the master, I try & restart the slave (using startSlave=true), I'm getting
an exception due to the port already being in use:
2008-09-15 16:54:56,842 ERROR MYAPP.DB - Cannot start slave synchronization on
'MYDB'
java.sql.SQLException: Failed to start database 'MYDB', see the next exception
for details.
at
org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.seeNextException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(Unknown
Source)
at org.apache.derby.impl.jdbc.EmbedConnection.<init>(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection30.<init>(Unknown Source)
at org.apache.derby.jdbc.Driver30.getNewEmbedConnection(Unknown Source)
at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source)
at org.apache.derby.jdbc.AutoloadedDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(DriverManager.java:525)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at
com.coppereye.myapp.derby.DerbyServer.getEmbeddedConnection(DerbyServer.java:912)
at com.coppereye.myapp.derby.DerbyServer.access$400(DerbyServer.java:55)
at com.coppereye.myapp.derby.DerbyServer$2.run(DerbyServer.java:1327)
Caused by: java.sql.SQLException: Could not establish a connection to the peer
of the replicated database 'MYDB' on address 'testbox:6959'.
at
org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown
Source)
... 11 more
Caused by: ERROR XRE04: Could not establish a connection to the peer of the
replicated database 'MYDB' on address 'testbox:6959'.
at org.apache.derby.iapi.error.StandardException.newException(Unknown
Source)
at
org.apache.derby.impl.store.replication.slave.SlaveController.setupConnection(Unknown
Source)
at
org.apache.derby.impl.store.replication.slave.SlaveController.startSlave(Unknown
Source)
at org.apache.derby.impl.store.raw.RawStore.boot(Unknown Source)
at org.apache.derby.impl.services.monitor.BaseMonitor.boot(Unknown
Source)
at org.apache.derby.impl.services.monitor.TopService.bootModule(Unknown
Source)
at
org.apache.derby.impl.services.monitor.BaseMonitor.startModule(Unknown Source)
at
org.apache.derby.iapi.services.monitor.Monitor.bootServiceModule(Unknown Source)
at org.apache.derby.impl.store.access.RAMAccessManager.boot(Unknown
Source)
at org.apache.derby.impl.services.monitor.BaseMonitor.boot(Unknown
Source)
at org.apache.derby.impl.services.monitor.TopService.bootModule(Unknown
Source)
at
org.apache.derby.impl.services.monitor.BaseMonitor.startModule(Unknown Source)
at
org.apache.derby.iapi.services.monitor.Monitor.bootServiceModule(Unknown Source)
at org.apache.derby.impl.db.BasicDatabase.bootStore(Unknown Source)
at org.apache.derby.impl.db.BasicDatabase.boot(Unknown Source)
at org.apache.derby.impl.db.SlaveDatabase.bootBasicDatabase(Unknown
Source)
at org.apache.derby.impl.db.SlaveDatabase.access$000(Unknown Source)
at
org.apache.derby.impl.db.SlaveDatabase$SlaveDatabaseBootThread.run(Unknown
Source)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.security.PrivilegedActionException: java.net.BindException:
Address already in use
at java.security.AccessController.doPrivileged(Native Method)
at
org.apache.derby.impl.store.replication.net.ReplicationMessageReceive.createServerSocket(Unknown
Source)
at
org.apache.derby.impl.store.replication.net.ReplicationMessageReceive.initConnection(Unknown
Source)
... 18 more
Caused by: java.net.BindException: Address already in use
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:359)
at java.net.ServerSocket.bind(ServerSocket.java:319)
at java.net.ServerSocket.<init>(ServerSocket.java:185)
at
javax.net.DefaultServerSocketFactory.createServerSocket(ServerSocketFactory.java:169)
at
org.apache.derby.impl.store.replication.net.ReplicationMessageReceive$2.run(Unknown
Source)
... 21 more
Is this something that ought to work? - or in this scenario would I need to
restart derby completely?
many thanks in advance for any advice.
Andrew Lawrenson