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();
if (self.isDrainingQueue) {
return;
}
self.isDrainingQueue = YES;
[self drainQueueWorkStep];
}
- (void)drainQueueWorkStep
{
AssertIsOnMainThread();
OWSMessageProcessingJob *_Nullable job = [self.finder nextJob]; OWSMessageProcessingJob *_Nullable job = [self.finder nextJob];
if (job == nil) { if (job == nil) {
self.isDrainingQueue = NO;
DDLogVerbose(@"%@ Queue is drained", self.tag); DDLogVerbose(@"%@ Queue is drained", self.tag);
return; return;
} }
[self processJob:job [self processJob:job
completion:^{ completion:^{
[self drainQueue]; DDLogVerbose(@"%@ completed job. %lu jobs left.",
self.tag,
(unsigned long)[OWSMessageProcessingJob numberOfKeysInCollection]);
[self drainQueueWorkStep];
}]; }];
});
} }
- (void)processJob:(OWSMessageProcessingJob *)job completion:(void (^)())completion - (void)processJob:(OWSMessageProcessingJob *)job completion:(void (^)())completion
{ {
dispatch_async(dispatch_get_main_queue(), ^{
[self.messagesManager processEnvelope:job.envelopeProto [self.messagesManager processEnvelope:job.envelopeProto
completion:^{ completion:^{
[self.finder removeJobWithId:job.uniqueId]; [self.finder removeJobWithId:job.uniqueId];
completion(); completion();
}]; }];
});
}
#pragma mark Helpers
+ (dispatch_queue_t)serialGCDQueue
{
static dispatch_once_t onceToken;
static dispatch_queue_t queue;
dispatch_once(&onceToken, ^{
queue = dispatch_queue_create("org.whispersystems.signal.messageProcessingQueue", NULL);
});
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