From f62bf7d18ef479797789daa66fe4356fd09502e5 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 16 Aug 2018 15:15:27 -0400 Subject: [PATCH] Add logging around 'share from SAE to same conversation' crash. --- .../ConversationViewController.m | 24 ++++++++++++++++++- .../src/Storage/OWSPrimaryStorage.m | 5 ++++ SignalServiceKit/src/Storage/OWSStorage.h | 2 ++ SignalServiceKit/src/Storage/OWSStorage.m | 23 ++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index f0d3f8bb7..763cdb861 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -458,6 +458,7 @@ typedef enum : NSUInteger { [[OWSPrimaryStorage sharedManager] updateUIDatabaseConnectionToLatest]; [self createNewMessageMappings]; + DDLogInfo(@"%@ reload view items in configureForThread.", self.logTag); if (![self reloadViewItems]) { OWSFail(@"%@ failed to reload view items in configureForThread.", self.logTag); } @@ -798,6 +799,7 @@ typedef enum : NSUInteger { // Avoid layout corrupt issues and out-of-date message subtitles. self.lastReloadDate = [NSDate new]; self.collapseCutoffDate = [NSDate new]; + DDLogInfo(@"%@ reload view items in resetContentAndLayout.", self.logTag); if (![self reloadViewItems]) { OWSFail(@"%@ failed to reload view items in resetContentAndLayout.", self.logTag); } @@ -3227,7 +3229,10 @@ typedef enum : NSUInteger { OWSAssertIsOnMainThread(); // DDLogVerbose(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); - DDLogInfo(@"%@ uiDatabaseDidUpdateExternally: %zd", self.logTag, self.viewItems.count); + DDLogInfo(@"%@ uiDatabaseDidUpdateExternally: %zd, %d", + self.logTag, + self.viewItems.count, + self.shouldObserveDBModifications); if (self.shouldObserveDBModifications) { // External database modifications can't be converted into incremental updates, @@ -3260,6 +3265,11 @@ typedef enum : NSUInteger { { OWSAssertIsOnMainThread(); + DDLogInfo(@"%@ uiDatabaseDidUpdate, connection snapshot: %llu, mappings snapshot: %llu.", + self.logTag, + self.uiDatabaseConnection.snapshot, + self.messageMappings.snapshotOfLastUpdate); + if (!self.shouldObserveDBModifications) { DDLogInfo(@"%@ uiDatabaseDidUpdate (ignoring): %zd", self.logTag, self.viewItems.count); @@ -3376,6 +3386,7 @@ typedef enum : NSUInteger { } NSUInteger oldViewItemCount = self.viewItems.count; + DDLogInfo(@"%@ reload view items in uiDatabaseDidUpdate.", self.logTag); if (![self reloadViewItems]) { // These errors are rare. OWSFail(@"%@ could not reload view items; hard resetting message mappings.", self.logTag); @@ -4611,6 +4622,12 @@ typedef enum : NSUInteger { return; } + DDLogInfo(@"%@ in %s, %d -> %d", + self.logTag, + __PRETTY_FUNCTION__, + _shouldObserveDBModifications, + shouldObserveDBModifications); + _shouldObserveDBModifications = shouldObserveDBModifications; if (self.shouldObserveDBModifications) { @@ -4880,6 +4897,11 @@ typedef enum : NSUInteger { // Returns NO on error. - (BOOL)reloadViewItems { + DDLogInfo(@"%@ reloadViewItems, connection snapshot: %llu, mappings snapshot: %llu.", + self.logTag, + self.uiDatabaseConnection.snapshot, + self.messageMappings.snapshotOfLastUpdate); + NSMutableArray *viewItems = [NSMutableArray new]; NSMutableDictionary *viewItemCache = [NSMutableDictionary new]; diff --git a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m index 3e8c049b4..30adca844 100644 --- a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m +++ b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m @@ -90,6 +90,9 @@ void VerifyRegistrationsForPrimaryStorage(OWSStorage *storage) // Increase object cache limit. Default is 250. _uiDatabaseConnection.objectCacheLimit = 500; [_uiDatabaseConnection beginLongLivedReadTransaction]; + ((OWSDatabaseConnection *)_uiDatabaseConnection).isReadOnly = YES; + ((OWSDatabaseConnection *)_uiDatabaseConnection).shouldLogLongLived = YES; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yapDatabaseModified:) name:YapDatabaseModifiedNotification @@ -134,6 +137,8 @@ void VerifyRegistrationsForPrimaryStorage(OWSStorage *storage) { OWSAssertIsOnMainThread(); + DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); + // Notify observers we're about to update the database connection [[NSNotificationCenter defaultCenter] postNotificationName:OWSUIDatabaseConnectionWillUpdateNotification object:self.dbNotificationObject]; diff --git a/SignalServiceKit/src/Storage/OWSStorage.h b/SignalServiceKit/src/Storage/OWSStorage.h index 94d6f65cd..a19545c69 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.h +++ b/SignalServiceKit/src/Storage/OWSStorage.h @@ -21,6 +21,8 @@ extern NSString *const StorageIsReadyNotification; @interface OWSDatabaseConnection : YapDatabaseConnection @property (atomic, weak) id delegate; +@property (atomic) BOOL isReadOnly; +@property (atomic) BOOL shouldLogLongLived; - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithDatabase:(YapDatabase *)database diff --git a/SignalServiceKit/src/Storage/OWSStorage.m b/SignalServiceKit/src/Storage/OWSStorage.m index 0795e52b1..65c80f1c5 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.m +++ b/SignalServiceKit/src/Storage/OWSStorage.m @@ -81,6 +81,13 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ // Specifically, it causes YDB's "view version" checks to fail. - (void)readWriteWithBlock:(void (^)(YapDatabaseReadWriteTransaction *transaction))block { + if (self.isReadOnly) { + OWSFail(@"%@ write transaction on read-only connection.", self.logTag); + @throw [NSException exceptionWithName:NSGenericException + reason:@"write transaction on read-only connection." + userInfo:nil]; + } + id delegate = self.delegate; OWSAssert(delegate); OWSAssert(delegate.areAllRegistrationsComplete); @@ -112,6 +119,13 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ OWSAssert(delegate); OWSAssert(delegate.areAllRegistrationsComplete); + if (self.isReadOnly) { + OWSFail(@"%@ write transaction on read-only connection.", self.logTag); + @throw [NSException exceptionWithName:NSGenericException + reason:@"write transaction on read-only connection." + userInfo:nil]; + } + __block OWSBackgroundTask *_Nullable backgroundTask = nil; if (CurrentAppContext().isMainApp) { backgroundTask = [OWSBackgroundTask backgroundTaskWithLabelStr:__PRETTY_FUNCTION__]; @@ -124,6 +138,15 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ }]; } +- (NSArray *)beginLongLivedReadTransaction +{ + if (self.shouldLogLongLived) { + DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); + } + + return [super beginLongLivedReadTransaction]; +} + @end #pragma mark -