Don’t mark messages as failed until all retries are exhausted.

// FREEBIE
pull/1/head
Matthew Chen 9 years ago
parent 19d8a32022
commit 8258f26aec

@ -73,6 +73,8 @@ void AssertIsOnSendingQueue()
@end @end
#pragma mark -
typedef NS_ENUM(NSInteger, OWSSendMessageOperationState) { typedef NS_ENUM(NSInteger, OWSSendMessageOperationState) {
OWSSendMessageOperationStateNew, OWSSendMessageOperationStateNew,
OWSSendMessageOperationStateExecuting, OWSSendMessageOperationStateExecuting,
@ -85,8 +87,12 @@ typedef NS_ENUM(NSInteger, OWSSendMessageOperationState) {
success:(void (^)())successHandler success:(void (^)())successHandler
failure:(RetryableFailureHandler)failureHandler; failure:(RetryableFailureHandler)failureHandler;
- (void)saveMessage:(TSOutgoingMessage *)message withError:(NSError *)error;
@end @end
#pragma mark -
NSString *const OWSSendMessageOperationKeyIsExecuting = @"isExecuting"; NSString *const OWSSendMessageOperationKeyIsExecuting = @"isExecuting";
NSString *const OWSSendMessageOperationKeyIsFinished = @"isFinished"; NSString *const OWSSendMessageOperationKeyIsFinished = @"isFinished";
@ -103,6 +109,8 @@ NSUInteger const OWSSendMessageOperationMaxRetries = 4;
@end @end
#pragma mark -
@implementation OWSSendMessageOperation @implementation OWSSendMessageOperation
- (instancetype)initWithMessage:(TSOutgoingMessage *)message - (instancetype)initWithMessage:(TSOutgoingMessage *)message
@ -228,6 +236,9 @@ NSUInteger const OWSSendMessageOperationMaxRetries = 4;
[self tryWithRemainingRetries:remainingRetries - 1]; [self tryWithRemainingRetries:remainingRetries - 1];
} else { } else {
DDLogWarn(@"%@ Too many failures. Giving up sending.", self.tag); DDLogWarn(@"%@ Too many failures. Giving up sending.", self.tag);
[self.messageSender saveMessage:self.message withError:error];
self.failureHandler(error); self.failureHandler(error);
} }
}; };
@ -363,17 +374,20 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
failure:(RetryableFailureHandler)failureHandler failure:(RetryableFailureHandler)failureHandler
{ {
DDLogDebug(@"%@ sending message: %@", self.tag, message.debugDescription); DDLogDebug(@"%@ sending message: %@", self.tag, message.debugDescription);
RetryableFailureHandler markAndFailureHandler = ^(NSError *error, BOOL isRetryable) {
// TODO do we really want to mark this as failed if we're still retrying?
[self saveMessage:message withError:error];
failureHandler(error, isRetryable);
};
[self ensureAnyAttachmentsUploaded:message [self ensureAnyAttachmentsUploaded:message
success:^() { success:^() {
[self deliverMessage:message success:successHandler failure:markAndFailureHandler]; [self deliverMessage:message
} success:successHandler
failure:markAndFailureHandler]; failure:^(NSError *error, BOOL isRetryable) {
DDLogDebug(@"%@ Message send attempt failed: %@", self.tag, message.debugDescription);
failureHandler(error, isRetryable);
}];
}
failure:^(NSError *error, BOOL isRetryable) {
DDLogDebug(@"%@ Attachment upload attempt failed: %@", self.tag, message.debugDescription);
failureHandler(error, isRetryable);
}];
} }
- (void)ensureAnyAttachmentsUploaded:(TSOutgoingMessage *)message - (void)ensureAnyAttachmentsUploaded:(TSOutgoingMessage *)message

Loading…
Cancel
Save