[
https://issues.apache.org/jira/browse/DERBY-3454?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12572196#action_12572196
]
V.Narayanan commented on DERBY-3454:
------------------------------------
tearDown is called in the startMaster method. The start failure and
consequently the tearDown
is caused by the failure to establish a socket connection. Hence in the
tearDown method
trying to send a STOP message through a socket that does not exist results in a
NullPointerException.
All the public methods of ReplicationMessageTransmit and
ReplicationMessageReceive should
ensure that the socket connection exists (is not null) before performing the
respective
operations. If the socket connection does not exist readMessage returns null
and the sendMessage
method returns quietly.
Methods in ReplicationMessageTransmit
-------------------------------------
* tearDown()
* sendMessage()
* readMessage()
Methods in ReplicationMessageReceive
------------------------------------
* sendMessage()
* readMessage()
The other methods in these classes must use the sendMessage and the readMessage
methods and not
call socketConn.writeMessage, socketConn.readMessage on their own. This would
ensure that
"socket connection connection exist" checks are restricted to the read and the
write methods only.
Note: The case of active=false on the master and the transmitter being called
to send a message
is a unique case. This happens only when the tearDown is called because
of a network(socket)
connection failure. Hence here it is safe to exit quietly from a send or
read attempt on a
non-existent socket.
> 'java.lang.NullPointerException' is thrown when starting a master db before a
> slave one
> ---------------------------------------------------------------------------------------
>
> Key: DERBY-3454
> URL: https://issues.apache.org/jira/browse/DERBY-3454
> Project: Derby
> Issue Type: Bug
> Components: Replication
> Affects Versions: 10.4.0.0
> Reporter: Serge Tsv
> Assignee: V.Narayanan
>
> The 'java.lang.NullPointerException' exception is thrown when a database is
> started in a master mode and is trying to establish a connection to an slave
> database socket, which is not available.
> The exception is by the MasterController#startMaster(). First, it tries to
> setup connection with a slave database using a transmitter:
> MasterController#setupConnection
> -> transmitter = new ReplicationMessageTransmit();
> transmitter.initConnection()
> -> new InetSocketAddress() -> createSocket() -> connect()
> The connect() method throws a ConnectException, and so fails to create a
> socketConn instance. The exception is then wrapped several times an
> propagated back to the MasterController#startMaster() method. It's caught
> there and then a MasterController#teardownNetwork() method is called, which
> tries to send a STOP message using the aforementioned transmitter, which
> hasn't been able to init a connection.
> A transmitter simply tries to call socketConn.writeMessage(message), which
> throws NPE because socketConn is null.
> Thanks!
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.