Merge branch 'mkirk/drain-queue-perf'

pull/1/head
Michael Kirk 8 years ago
commit 2a6df19e0e

@ -793,6 +793,9 @@ static NSString *const kURLHostVerifyPrefix = @"verify";
[AppVersion.instance appLaunchDidComplete]; [AppVersion.instance appLaunchDidComplete];
[self ensureRootViewController]; [self ensureRootViewController];
// If there were any messages in our local queue which we hadn't yet processed.
[[OWSMessageReceiver sharedInstance] handleAnyUnprocessedEnvelopesAsync];
} }
- (void)ensureRootViewController - (void)ensureRootViewController

@ -13,6 +13,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (void)syncRegisterDatabaseExtension:(YapDatabase *)database; + (void)syncRegisterDatabaseExtension:(YapDatabase *)database;
- (void)handleReceivedEnvelope:(OWSSignalServiceProtosEnvelope *)envelope; - (void)handleReceivedEnvelope:(OWSSignalServiceProtosEnvelope *)envelope;
- (void)handleAnyUnprocessedEnvelopesAsync;
@end @end

@ -186,6 +186,7 @@ NSString *const OWSMessageProcessingJobFinderExtensionGroup = @"OWSMessageProces
@property (nonatomic, readonly) TSMessagesManager *messagesManager; @property (nonatomic, readonly) TSMessagesManager *messagesManager;
@property (nonatomic, readonly) OWSMessageProcessingJobFinder *finder; @property (nonatomic, readonly) OWSMessageProcessingJobFinder *finder;
@property (nonatomic) BOOL isDrainingQueue;
- (instancetype)initWithMessagesManager:(TSMessagesManager *)messagesManager - (instancetype)initWithMessagesManager:(TSMessagesManager *)messagesManager
finder:(OWSMessageProcessingJobFinder *)finder NS_DESIGNATED_INITIALIZER; finder:(OWSMessageProcessingJobFinder *)finder NS_DESIGNATED_INITIALIZER;
@ -207,6 +208,7 @@ NSString *const OWSMessageProcessingJobFinderExtensionGroup = @"OWSMessageProces
_messagesManager = messagesManager; _messagesManager = messagesManager;
_finder = finder; _finder = finder;
_isDrainingQueue = NO;
return self; return self;
} }
@ -220,41 +222,43 @@ NSString *const OWSMessageProcessingJobFinderExtensionGroup = @"OWSMessageProces
- (void)drainQueue - (void)drainQueue
{ {
dispatch_async(self.class.serialGCDQueue, ^{ AssertIsOnMainThread();
OWSMessageProcessingJob *_Nullable job = [self.finder nextJob];
if (job == nil) { if (self.isDrainingQueue) {
DDLogVerbose(@"%@ Queue is drained", self.tag); return;
return; }
} self.isDrainingQueue = YES;
[self processJob:job [self drainQueueWorkStep];
completion:^{
[self drainQueue];
}];
});
} }
- (void)processJob:(OWSMessageProcessingJob *)job completion:(void (^)())completion - (void)drainQueueWorkStep
{ {
dispatch_async(dispatch_get_main_queue(), ^{ AssertIsOnMainThread();
[self.messagesManager processEnvelope:job.envelopeProto
completion:^{ OWSMessageProcessingJob *_Nullable job = [self.finder nextJob];
[self.finder removeJobWithId:job.uniqueId]; if (job == nil) {
completion(); self.isDrainingQueue = NO;
}]; DDLogVerbose(@"%@ Queue is drained", self.tag);
}); return;
} }
#pragma mark Helpers [self processJob:job
completion:^{
DDLogVerbose(@"%@ completed job. %lu jobs left.",
self.tag,
(unsigned long)[OWSMessageProcessingJob numberOfKeysInCollection]);
[self drainQueueWorkStep];
}];
}
+ (dispatch_queue_t)serialGCDQueue - (void)processJob:(OWSMessageProcessingJob *)job completion:(void (^)())completion
{ {
static dispatch_once_t onceToken; [self.messagesManager processEnvelope:job.envelopeProto
static dispatch_queue_t queue; completion:^{
dispatch_once(&onceToken, ^{ [self.finder removeJobWithId:job.uniqueId];
queue = dispatch_queue_create("org.whispersystems.signal.messageProcessingQueue", NULL); completion();
}); }];
return queue;
} }
#pragma mark Logging #pragma mark Logging
@ -331,6 +335,13 @@ NSString *const OWSMessageProcessingJobFinderExtensionGroup = @"OWSMessageProces
#pragma mark - instance methods #pragma mark - instance methods
- (void)handleAnyUnprocessedEnvelopesAsync
{
dispatch_async(dispatch_get_main_queue(), ^{
[self.processingQueue drainQueue];
});
}
- (void)handleReceivedEnvelope:(OWSSignalServiceProtosEnvelope *)envelope - (void)handleReceivedEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
{ {
// Drop any too-large messages on the floor. Well behaving clients should never send them. // Drop any too-large messages on the floor. Well behaving clients should never send them.

Loading…
Cancel
Save