Menu

#102 Problem with nextTargetMsgSeqNum incrementation

open
nobody
None
5
2015-01-19
2013-06-26
andrewm123
No

The following problem was encountered. When a Logout message is received as the response on Logon message, the next target sequence number is incremented independently of the actual sequence number of the Logout message.

Example:
Let nextTargetMsgSeqNum = N
1) The sender sends Logon message
2) The target replies with Logout message having msgSeqNum = M, where M > N
3) The sender increments the nextTargetMsgSeqNum though msgSeqNum of received Logout message is higher than nextTargetMsgSeqNum

I expected that the nextTargetMsgSeqNum wouldn't be incremented in this situation.

I suggest to increment nextTargetMsgSeqNum conditionally when processing Logout message.

Example code:

~~~~
private void nextLogout(Message logout) throws IOException, RejectLogon, FieldNotFound,
IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
if (!verify(logout, false, false)) {
return;
}

String msg;
if (!state.isLogoutSent()) {
    msg = "Received logout request";
    if (logout.isSetField(Text.FIELD)) {
        msg += ": " + logout.getString(Text.FIELD);
    }
    getLog().onEvent(msg);
    generateLogout(logout);
    getLog().onEvent("Sent logout response");
} else {
    msg = "Received logout response";
    getLog().onEvent(msg);
}

state.setLogoutReceived(true);

final int sequence = logout.getHeader().getInt(MsgSeqNum.FIELD);

if (!isTargetTooHigh(sequence)) {
    state.incrNextTargetMsgSeqNum();
}

if (resetOnLogout) {
    resetState();
}

disconnect(msg, false);

}

In the current code nextTargetMsgSeqNum is incremented independently of the actual sequence number of the Logout message:

private void nextLogout(Message logout) throws IOException, RejectLogon, FieldNotFound,
IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
if (!verify(logout, false, false)) {
return;
}

String msg;
if (!state.isLogoutSent()) {
    msg = "Received logout request";
    if (logout.isSetField(Text.FIELD)) {
        msg += ": " + logout.getString(Text.FIELD);
    }
    getLog().onEvent(msg);
    generateLogout(logout);
    getLog().onEvent("Sent logout response");
} else {
    msg = "Received logout response";
    getLog().onEvent(msg);
}

state.setLogoutReceived(true);

state.incrNextTargetMsgSeqNum();

if (resetOnLogout) {
    resetState();
}

disconnect(msg, false);

}
~~~~~~

Discussion


Log in to post a comment.