* or the remote server).
*/
void initialize(InitializeTargetMsg initTargetMsgReceived,
int requestorServerId)
{
InitializeTask initFromtask = null;
if (debugEnabled())
TRACER.debugInfo("[IE] Entering initialize - domain=" + this);
int source = initTargetMsgReceived.getSenderID();
try
{
// Log starting
Message msg = NOTE_FULL_UPDATE_ENGAGED_FROM_REMOTE_START.get(
Integer.toString(serverID),
serviceID,
Long.toString(initTargetMsgReceived.getSenderID()));
logError(msg);
// Go into full update status
setNewStatus(StatusMachineEvent.TO_FULL_UPDATE_STATUS_EVENT);
// Acquire an import context if no already done (and initialize).
if (initTargetMsgReceived.getInitiatorID() == this.serverID)
{
// The initTargetMsgReceived received is the answer to a request that
// we (this server) sent previously. In this case, so the IEContext
// has been already acquired when the request was published in order
// to store the task (to be updated with the status at the end).
}
else
{
// The initTargetMsgReceived is for an import initiated by the remote
// server.
// Test and set if no import already in progress
acquireIEContext(true);
}
// Initialize stuff
ieContext.importSource = source;
ieContext.initializeCounters(initTargetMsgReceived.getEntryCount());
ieContext.initWindow = initTargetMsgReceived.getInitWindow();
// Protocol version is -1 when not known.
ieContext.exporterProtocolVersion = getProtocolVersion(source);
initFromtask = (InitializeTask)ieContext.initializeTask;
// Lauch the import
importBackend(new ReplInputStream(this));
}
catch (DirectoryException e)
{
// Store the exception raised. It will be considered if no other exception
// has been previously stored in the context
if (ieContext.getException() == null)
ieContext.setException(e);
}
finally
{
if (debugEnabled())
TRACER.debugInfo("[IE] Domain=" + this
+ " ends import with exception=" + ieContext.getException()
+ " connected=" + broker.isConnected());
// It is necessary to restart (reconnect to RS) for different reasons
// - when everything went well, reconnect in order to exchange
// new state, new generation ID
// - when we have connection failure, reconnect to retry a new import
// right here, right now
// we never want retryOnFailure if we fails reconnecting in the restart.
broker.reStart(false);
if (ieContext.getException() != null)
{
if (broker.isConnected() && (initFromtask != null)
&& (++ieContext.attemptCnt<2))
{
// Worth a new attempt
// since initFromtask is in this server, connection is ok
try
{
// Wait for the exporter to stabilize - eventually reconnect as
// well if it was connected to the same RS than the one we lost ...
Thread.sleep(1000);
// Restart the whole import protocol exchange by sending again
// the request
logError(NOTE_RESENDING_INIT_FROM_REMOTE_REQUEST.get(
ieContext.getException().getLocalizedMessage()));
broker.publish(ieContext.initReqMsgSent);
ieContext.initializeCounters(0);
ieContext.exception = null;
ieContext.msgCnt = 0;
// Processing of the received initTargetMsgReceived is done
// let's wait for the next one
return;
}
catch(Exception e)
{
// An error occurs when sending a new request for a new import.
// This error is not stored, prefering to keep the initial one.
logError(ERR_SENDING_NEW_ATTEMPT_INIT_REQUEST.get(
e.getLocalizedMessage(),
ieContext.getException().getLocalizedMessage()));
}
}
}
// ===================
// No new attempt case
if (debugEnabled())
TRACER.debugInfo("[IE] Domain=" + this
+ " ends initialization with exception=" + ieContext.getException()
+ " connected=" + broker.isConnected()
+ " task=" + initFromtask
+ " attempt=" + ieContext.attemptCnt);
try
{
if (broker.isConnected() && (ieContext.getException() != null))
{
// Let's notify the exporter
ErrorMsg errorMsg = new ErrorMsg(requestorServerId,
ieContext.getException().getMessageObject());
broker.publish(errorMsg);
}
else // !broker.isConnected()
{
// Don't try to reconnect here.
// The current running thread is the listener thread and will loop on
// receive() that is expected to manage reconnects attempt.
}
// Update the task that initiated the import must be the last thing.
// Particularly, broker.restart() after import success must be done
// before some other operations/tasks to be launched,
// like resetting the generation ID.
if (initFromtask != null)
{
initFromtask.updateTaskCompletionState(ieContext.getException());
}
}
finally
{