3.3.5.5.1 Receiving a TXUSER_DTCLURECOVERYINITIATEDBYLU_MTAG_THEIR_XLN Message
When the Transaction Manager Communicating with an LU 6.2 Implementation Facet receives a TXUSER_DTCLURECOVERYINITIATEDBYLU_MTAG_THEIR_XLN message, it MUST perform the following actions:
If the connection state is Idle:
Set the connection state to Processing XLN Request.
Attempt to find the LU Pair object keyed by the first cbLength bytes of the rgbBlob field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the LuNamePair field) of the message in the LU Pair Table.
If the LU Pair object is not found:
Send a TXUSER_DTCLURECOVERYINITIATEDBYLU_MTAG_THEIR_XLN_NOT_FOUND message using the connection.
Signal the Remote LU Initiated Recovery Ended event with the following arguments:
The LU Pair object referenced by this connection
The connection object
Set the connection state to Ended (section 3.3.1.6.10).
Otherwise, if the LU Pair object is found:
Set the LU Pair field of the connection object to the found LU Pair object.
Signal the Received New Recovery Sequence Number event with the following arguments:
The LU Pair object referenced by this connection
The value of the RecoverySeqNum field of the message
Add the connection object to the Remote LU Initiated Recovery List.
Signal the Begin Remote LU Initiated Synchronization event with the following argument:
The LU Pair object referenced by this connection
Signal the Received New Remote Log Name event with the following arguments:
The LU Pair object referenced by this connection
The first cbLength bytes of the rgbBlob field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the RemoteLogName field) of the message
If both the following conditions are TRUE:
The LU Pair Recovery State field of the found LU Pair object is not set to Synchronizing No Remote Name.
The Remote Log Name field of the found LU Pair object is not set to the first cbLength bytes of the rgbBlob field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the RemoteLogName field) of the message.
Or if both the following conditions are TRUE:
The cbLength field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the LocalLogName field) of the message is not set.
The Local Log Name field of the found LU Pair object is not set to the value of cbLength field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the LocalLogName field) of the message.
Then perform the following actions:
Send a TXUSER_DTCLURECOVERYINITATEDBYLU_MTAG_RESPONSE_FOR_THEIR_XLN message using the connection.
The XlnResponse field MUST be set to DTCLUXLNRESPONSE_LOGNAMEMISMATCH.
If the Is Warm flag of the found LU Pair object is set to FALSE, the Xln field MUST be set to DTCLUXLN_COLD.
Otherwise if the Is Warm flag is set to TRUE, the Xln field MUST be set to DTCLUXLN_WARM.
The dwProtocol field MUST be set to 0.
The first cbLength bytes of the rgbBlob field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the OurLogName field) MUST be set to the Local Log Name field of the found LU Pair object. The cbLength field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the OurLogName field) MUST be set to the number of bytes in the Local Log Name field of the found LU Pair object.
Signal the Remote LU Initiated Recovery (section 3.3.1.6.10) event with the following arguments:
The LU Pair object referenced by this connection
The connection object
Set the connection state to Ended (section 3.3.1.6.10).
Signal the Synchronization Inconsistent event with the following argument:
LU Pair object referenced by this connection
Otherwise:
If the following conditions are all TRUE:
The Is Warm flag of the found LU Pair object is set to TRUE.
The LUW List of the found LU Pair object is not empty.
The Xln field of the message is set to DTCLUXLN_COLD.
Then perform the following actions:
Signal the Synchronization Inconsistent event with the following argument:
LU Pair object referenced by this connection
Send a TXUSER_DTCLURECOVERYINITATEDBYLU_MTAG_RESPONSE_FOR_THEIR_XLN message using the connection.
The XlnResponse field MUST be set to DTCLUXLNRESPONSE_COLDWARMMISMATCH.
If the Is Warm flag of the found LU Pair object is set to FALSE, the Xln field MUST be set to DTCLUXLN_COLD.
Otherwise, if the Is Warm flag is set to TRUE, the Xln field MUST be set to DTCLUXLN_WARM.
The dwProtocol field MUST be set to 0.
The first cbLength bytes of the rgbBlob field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the OurLogName field) MUST be set to the Local Log Name field of the found LU Pair object. The cbLength field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the OurLogName field) MUST be set to the number of bytes in the Local Log Name field of the found LU Pair object.
Signal the Remote LU Initiated Recovery (section 3.3.7.22) event with the following arguments:
The LU Pair object referenced by this connection
The connection object
Set the connection state to Ended (section 3.3.1.6.10).
Otherwise, the transaction manager that communicates with an LU 6.2 implementation (section 3.2) SHOULD perform the following actions:
If the following conditions are all TRUE:
The Xln field of the message is set to DTCLUXLN_WARM.
The Is Warm flag of the found LU Pair object is set to TRUE.
The cbLength field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the LocalLogName field) of the message is not set to 0.
Then perform the following actions.
Signal the Received New Remote Log Name event with the following arguments:
LU Pair object referenced by this connection
The first cbLength bytes of the rgbBlob field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the RemoteLogName field) of the message
Signal the Synchronization Successful event with the following argument:
The LU Pair object referenced by this connection
Send a TXUSER_DTCLURECOVERYINITATEDBYLU_MTAG_RESPONSE_FOR_THEIR_XLN message using the connection.
The XlnResponse field MUST be set to DTCLUXLNRESPONSE_OK_SENDCONFIRMATION.
If the Is Warm flag of the found LU Pair object is set to FALSE, the Xln field MUST be set to DTCLUXLN_COLD.
Otherwise, if the Is Warm flag is set to TRUE, the Xln field MUST be set to DTCLUXLN_WARM.
The dwProtocol field MUST be set to 0.
The first cbLength bytes of the rgbBlob field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the OurLogName field) MUST be set to the Local Log Name field of the found LU Pair object. The cbLength field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the OurLogName field) MUST be set to the number of bytes in the Local Log Name field of the found LU Pair object.
Set the connection state to Awaiting Compare States Request.
Otherwise:
Send a TXUSER_DTCLURECOVERYINITATEDBYLU_MTAG_RESPONSE_FOR_THEIR_XLN message using the connection.
The XlnResponse field MUST be set to DTCLUXLNRESPONSE_OK_SENDOURXLNBACK.
If the Is Warm flag of the found LU Pair object is set to FALSE, the Xln field MUST be set to DTCLUXLN_COLD; otherwise, if the Is Warm flag is set to TRUE, the Xln field MUST be set to DTCLUXLN_WARM.
The dwProtocol field is set to 0.
The first cbLength bytes of the rgbBlob field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the OurLogName field) MUST be set to the Local Log Name field of the found LU Pair object. The cbLength field of the DTCLU_VARLEN_BYTEARRAY structure (contained in the OurLogName field) MUST be set to the number of bytes in the Local Log Name field of the found LU Pair object.
Set the connection state to Awaiting XLN Confirmation.
Otherwise, if the connection state is 3.3.1.6.103.3.1.6.10:
Ignore the message.
Otherwise, the message MUST be processed as an invalid message, as specified in [MS-DTCO], section 3.1.6.