Fix message dependency ordering

This commit is contained in:
Ali 2020-01-02 01:32:14 +04:00
parent b60c8d25a6
commit 8f1dafed6e
8 changed files with 51 additions and 41 deletions

View File

@ -244,7 +244,7 @@ typedef enum {
[reqPqBuffer appendBytes:_nonce.bytes length:_nonce.length];
NSString *messageDescription = [NSString stringWithFormat:@"reqPq nonce:%@", _nonce];
MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:reqPqBuffer.data metadata:messageDescription shortMetadata:messageDescription messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo];
MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:reqPqBuffer.data metadata:messageDescription additionalDebugDescription:nil shortMetadata:messageDescription messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo];
return [[MTMessageTransaction alloc] initWithMessagePayload:@[message] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId)
{
if (_stage == MTDatacenterAuthStagePQ && messageInternalIdToTransactionId[message.internalId] != nil && messageInternalIdToPreparedMessage[message.internalId] != nil)
@ -268,7 +268,7 @@ typedef enum {
[reqDhBuffer appendTLBytes:_dhEncryptedData];
NSString *messageDescription = [NSString stringWithFormat:@"reqDh nonce:%@ serverNonce:%@ p:%@ q:%@ fingerprint:%llx", _nonce, _serverNonce, _dhP, _dhQ, _dhPublicKeyFingerprint];
MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:reqDhBuffer.data metadata:messageDescription shortMetadata:messageDescription messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo];
MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:reqDhBuffer.data metadata:messageDescription additionalDebugDescription:nil shortMetadata:messageDescription messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo];
return [[MTMessageTransaction alloc] initWithMessagePayload:@[message] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId)
{
if (_stage == MTDatacenterAuthStageReqDH && messageInternalIdToTransactionId[message.internalId] != nil && messageInternalIdToPreparedMessage[message.internalId] != nil)
@ -288,7 +288,7 @@ typedef enum {
[setDhParamsBuffer appendBytes:_serverNonce.bytes length:_serverNonce.length];
[setDhParamsBuffer appendTLBytes:_encryptedClientData];
MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:setDhParamsBuffer.data metadata:@"setDhParams" shortMetadata:@"setDhParams" messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo];
MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:setDhParamsBuffer.data metadata:@"setDhParams" additionalDebugDescription:nil shortMetadata:@"setDhParams" messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo];
return [[MTMessageTransaction alloc] initWithMessagePayload:@[message] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId)
{
if (_stage == MTDatacenterAuthStageKeyVerification && messageInternalIdToTransactionId[message.internalId] != nil && messageInternalIdToPreparedMessage[message.internalId] != nil)

View File

@ -7,6 +7,7 @@
@property (nonatomic, strong, readonly) id internalId;
@property (nonatomic, strong, readonly) NSData *data;
@property (nonatomic, strong, readonly) id metadata;
@property (nonatomic, strong, readonly) NSString *additionalDebugDescription;
@property (nonatomic, strong, readonly) id shortMetadata;
@property (nonatomic, readonly) int64_t messageId;
@property (nonatomic, readonly) int32_t messageSeqNo;
@ -15,9 +16,9 @@
@property (nonatomic) bool hasHighPriority;
@property (nonatomic) int64_t inResponseToMessageId;
@property (nonatomic, copy) id (^dynamicDecorator)(NSData *currentData, NSMutableDictionary *messageInternalIdToPreparedMessage);
@property (nonatomic, copy) id (^dynamicDecorator)(int64_t, NSData *currentData, NSMutableDictionary *messageInternalIdToPreparedMessage);
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata shortMetadata:(id)shortMetadata;
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata shortMetadata:(id)shortMetadata messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo;
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata additionalDebugDescription:(NSString *)additionalDebugDescription shortMetadata:(id)shortMetadata;
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata additionalDebugDescription:(NSString *)additionalDebugDescription shortMetadata:(id)shortMetadata messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo;
@end

View File

@ -46,12 +46,12 @@
@implementation MTOutgoingMessage
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata shortMetadata:(id)shortMetadata
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata additionalDebugDescription:(NSString *)additionalDebugDescription shortMetadata:(id)shortMetadata
{
return [self initWithData:data metadata:metadata shortMetadata:shortMetadata messageId:0 messageSeqNo:0];
return [self initWithData:data metadata:metadata additionalDebugDescription:additionalDebugDescription shortMetadata:shortMetadata messageId:0 messageSeqNo:0];
}
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata shortMetadata:(id)shortMetadata messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata additionalDebugDescription:(NSString *)additionalDebugDescription shortMetadata:(id)shortMetadata messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo
{
self = [super init];
if (self != nil)
@ -59,6 +59,7 @@
_internalId = [[MTOutgoingMessageInternalId alloc] init];
_data = data;
_metadata = metadata;
_additionalDebugDescription = additionalDebugDescription;
_shortMetadata = shortMetadata;
_messageId = messageId;
_messageSeqNo = messageSeqNo;

View File

@ -867,7 +867,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64;
- (NSString *)outgoingMessageDescription:(MTOutgoingMessage *)message messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo
{
return [[NSString alloc] initWithFormat:@"%@ (%" PRId64 "/%" PRId32 ")", message.metadata, message.messageId == 0 ? messageId : message.messageId, message.messageSeqNo == 0 ? message.messageSeqNo : messageSeqNo];
return [[NSString alloc] initWithFormat:@"%@%@ (%" PRId64 "/%" PRId32 ")", message.metadata, message.additionalDebugDescription != nil ? message.additionalDebugDescription : @"", message.messageId == 0 ? messageId : message.messageId, message.messageSeqNo == 0 ? message.messageSeqNo : messageSeqNo];
}
- (NSString *)outgoingShortMessageDescription:(MTOutgoingMessage *)message messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo
@ -956,7 +956,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64;
[msgsAckBuffer appendInt64:(int64_t)[nMessageId longLongValue]];
}
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:msgsAckBuffer.data metadata:@"msgsAck" shortMetadata:@"msgsAck"];
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:msgsAckBuffer.data metadata:@"msgsAck" additionalDebugDescription:nil shortMetadata:@"msgsAck"];
outgoingMessage.requiresConfirmation = false;
[messageTransactions addObject:[[MTMessageTransaction alloc] initWithMessagePayload:@[outgoingMessage] prepared:nil failed:nil completion:^(__unused NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId)
@ -993,17 +993,6 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64;
{
for (MTOutgoingMessage *outgoingMessage in messageTransaction.messagePayload)
{
NSData *messageData = outgoingMessage.data;
if (outgoingMessage.dynamicDecorator != nil)
{
id decoratedData = outgoingMessage.dynamicDecorator(messageData, messageInternalIdToPreparedMessage);
if (decoratedData != nil)
messageData = decoratedData;
}
NSData *data = messageData;
int64_t messageId = 0;
int32_t messageSeqNo = 0;
if (outgoingMessage.messageId == 0)
@ -1017,18 +1006,19 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64;
messageSeqNo = outgoingMessage.messageSeqNo;
}
NSData *messageData = outgoingMessage.data;
if (outgoingMessage.dynamicDecorator != nil)
{
id decoratedData = outgoingMessage.dynamicDecorator(messageId, messageData, messageInternalIdToPreparedMessage);
if (decoratedData != nil)
messageData = decoratedData;
}
NSData *data = messageData;
if (MTLogEnabled()) {
NSString *messageDescription = [self outgoingMessageDescription:outgoingMessage messageId:messageId messageSeqNo:messageSeqNo];
/*if ([messageDescription hasPrefix:@"updates.getDifference"]) {
static dispatch_once_t onceToken;
__block bool flag = false;
dispatch_once(&onceToken, ^{
flag = true;
});
if (flag) {
debugResetTransport = true;
}
}*/
MTLog(@"[MTProto#%p@%p preparing %@]", self, _context, messageDescription);
}
NSString *shortMessageDescription = [self outgoingShortMessageDescription:outgoingMessage messageId:messageId messageSeqNo:messageSeqNo];

View File

@ -285,10 +285,12 @@
}
}
- (NSData *)decorateRequestData:(MTRequest *)request initializeApi:(bool)initializeApi unresolvedDependencyOnRequestInternalId:(__autoreleasing id *)unresolvedDependencyOnRequestInternalId
- (NSData *)decorateRequestData:(MTRequest *)request initializeApi:(bool)initializeApi unresolvedDependencyOnRequestInternalId:(__autoreleasing id *)unresolvedDependencyOnRequestInternalId decoratedDebugDescription:(__autoreleasing NSString **)decoratedDebugDescription
{
NSData *currentData = request.payload;
NSString *debugDescription = @"";
if (initializeApi && _apiEnvironment != nil)
{
if (MTLogEnabled()) {
@ -345,6 +347,8 @@
[buffer appendBytes:currentData.bytes length:currentData.length];
currentData = buffer.data;
debugDescription = [debugDescription stringByAppendingString:@", disableUpdates"];
}
if (request.shouldDependOnRequest != nil)
@ -352,7 +356,7 @@
NSUInteger index = [_requests indexOfObject:request];
if (index != NSNotFound)
{
for (MTRequest *anotherRequest in _requests)
for (MTRequest *anotherRequest in _requests.reverseObjectEnumerator)
{
if (request == anotherRequest) {
continue;
@ -370,9 +374,13 @@
[buffer appendBytes:currentData.bytes length:currentData.length];
currentData = buffer.data;
debugDescription = [debugDescription stringByAppendingFormat:@", invokeAfter(%lld)", anotherRequest.requestContext.messageId];
}
else if (unresolvedDependencyOnRequestInternalId != nil)
else if (unresolvedDependencyOnRequestInternalId != nil) {
*unresolvedDependencyOnRequestInternalId = anotherRequest.internalId;
debugDescription = [debugDescription stringByAppendingString:@", unresolvedDependency"];
}
break;
}
@ -380,6 +388,10 @@
}
}
if (decoratedDebugDescription != nil) {
*decoratedDebugDescription = debugDescription;
}
return currentData;
}
@ -413,6 +425,7 @@
requestInternalIdToMessageInternalId = [[NSMutableDictionary alloc] init];
__autoreleasing id autoreleasingUnresolvedDependencyOnRequestInternalId = nil;
__autoreleasing NSString *decoratedDebugDescription = nil;
int64_t messageId = 0;
int32_t messageSeqNo = 0;
@ -422,14 +435,16 @@
messageSeqNo = request.requestContext.messageSeqNo;
}
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:[self decorateRequestData:request initializeApi:requestsWillInitializeApi unresolvedDependencyOnRequestInternalId:&autoreleasingUnresolvedDependencyOnRequestInternalId] metadata:request.metadata shortMetadata:request.shortMetadata messageId:messageId messageSeqNo:messageSeqNo];
NSData *decoratedRequestData = [self decorateRequestData:request initializeApi:requestsWillInitializeApi unresolvedDependencyOnRequestInternalId:&autoreleasingUnresolvedDependencyOnRequestInternalId decoratedDebugDescription:&decoratedDebugDescription];
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:decoratedRequestData metadata:request.metadata additionalDebugDescription:decoratedDebugDescription shortMetadata:request.shortMetadata messageId:messageId messageSeqNo:messageSeqNo];
outgoingMessage.needsQuickAck = request.acknowledgementReceived != nil;
outgoingMessage.hasHighPriority = request.hasHighPriority;
id unresolvedDependencyOnRequestInternalId = autoreleasingUnresolvedDependencyOnRequestInternalId;
if (unresolvedDependencyOnRequestInternalId != nil)
{
outgoingMessage.dynamicDecorator = ^id (NSData *currentData, NSDictionary *messageInternalIdToPreparedMessage)
outgoingMessage.dynamicDecorator = ^id (int64_t currentMessageId, NSData *currentData, NSDictionary *messageInternalIdToPreparedMessage)
{
id messageInternalId = requestInternalIdToMessageInternalId[unresolvedDependencyOnRequestInternalId];
if (messageInternalId != nil)
@ -441,6 +456,9 @@
[invokeAfterBuffer appendInt32:(int32_t)0xcb9f372d];
[invokeAfterBuffer appendInt64:preparedMessage.messageId];
[invokeAfterBuffer appendBytes:currentData.bytes length:currentData.length];
if (MTLogEnabled()) {
MTLog(@"[MTRequestMessageService] %lld dynamically added invokeAfter %lld", currentMessageId, preparedMessage.messageId);
}
return invokeAfterBuffer.data;
}
}
@ -467,7 +485,7 @@
[dropAnswerBuffer appendInt64:dropContext.dropMessageId];
NSString *messageDecription = [NSString stringWithFormat:@"dropAnswer for %" PRId64, dropContext.dropMessageId];
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:dropAnswerBuffer.data metadata:messageDecription shortMetadata:messageDecription messageId:dropContext.messageId messageSeqNo:dropContext.messageSeqNo];
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:dropAnswerBuffer.data metadata:messageDecription additionalDebugDescription:nil shortMetadata:messageDecription messageId:dropContext.messageId messageSeqNo:dropContext.messageSeqNo];
outgoingMessage.requiresConfirmation = false;
dropMessageIdToMessageInternalId[@(dropContext.dropMessageId)] = outgoingMessage.internalId;
[messages addObject:outgoingMessage];

View File

@ -57,7 +57,7 @@
NSData *resentMessagesRequestData = resendRequestBuffer.data;
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:resentMessagesRequestData metadata:@"resendMessages" shortMetadata:@"resendMessages"];
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:resentMessagesRequestData metadata:@"resendMessages" additionalDebugDescription:nil shortMetadata:@"resendMessages"];
outgoingMessage.requiresConfirmation = false;
return [[MTMessageTransaction alloc] initWithMessagePayload:@[outgoingMessage] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId)

View File

@ -620,7 +620,7 @@ static const NSTimeInterval MTTcpTransportSleepWatchdogTimeout = 60.0;
[pingBuffer appendInt32:(int32_t)0x7abe77ec];
[pingBuffer appendInt64:randomId];
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:pingBuffer.data metadata:@"ping" shortMetadata:@"ping"];
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:pingBuffer.data metadata:@"ping" additionalDebugDescription:nil shortMetadata:@"ping"];
outgoingMessage.requiresConfirmation = false;
__weak MTTcpTransport *weakSelf = self;

View File

@ -59,7 +59,7 @@
[getFutureSaltsBuffer appendInt32:(int32_t)0xb921bd04];
[getFutureSaltsBuffer appendInt32:_futureSalts.count != 0 ? 1 : 32];
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:getFutureSaltsBuffer.data metadata:@"getFutureSalts" shortMetadata:@"getFutureSalts"];
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:getFutureSaltsBuffer.data metadata:@"getFutureSalts" additionalDebugDescription:nil shortMetadata:@"getFutureSalts"];
return [[MTMessageTransaction alloc] initWithMessagePayload:@[outgoingMessage] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId)
{