From 64767e6c418e18a8d780d0d930046ae5c22cfd9f Mon Sep 17 00:00:00 2001 From: Mikhail Filimonov Date: Wed, 21 Feb 2024 10:02:14 +0000 Subject: [PATCH] handle slow transactions --- submodules/Postbox/Sources/Postbox.swift | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/submodules/Postbox/Sources/Postbox.swift b/submodules/Postbox/Sources/Postbox.swift index 5666aa37d8..04b04a1e7b 100644 --- a/submodules/Postbox/Sources/Postbox.swift +++ b/submodules/Postbox/Sources/Postbox.swift @@ -2994,9 +2994,11 @@ final class PostboxImpl { let isInTransaction: Atomic - private func internalTransaction(_ f: (Transaction) -> T) -> (result: T, updatedTransactionStateVersion: Int64?, updatedMasterClientId: Int64?) { + private func internalTransaction(_ f: (Transaction) -> T, file: String = #file, line: Int = #line) -> (result: T, updatedTransactionStateVersion: Int64?, updatedMasterClientId: Int64?) { let _ = self.isInTransaction.swap(true) + let startTime = CFAbsoluteTimeGetCurrent() + self.valueBox.begin() let transaction = Transaction(queue: self.queue, postbox: self) self.afterBegin(transaction: transaction) @@ -3005,6 +3007,12 @@ final class PostboxImpl { transaction.disposed = true self.valueBox.commit() + let endTime = CFAbsoluteTimeGetCurrent() + let transactionDuration = endTime - startTime + if transactionDuration > 0.1 { + postboxLog("Postbox transaction took \(transactionDuration * 1000.0) ms, from: \(file), on:\(line)") + } + let _ = self.isInTransaction.swap(false) if let currentUpdatedState = self.currentUpdatedState { @@ -3044,13 +3052,14 @@ final class PostboxImpl { } } - public func transaction(userInteractive: Bool = false, ignoreDisabled: Bool = false, _ f: @escaping(Transaction) -> T) -> Signal { + + public func transaction(userInteractive: Bool = false, ignoreDisabled: Bool = false, _ f: @escaping(Transaction) -> T, file: String = #file, line: Int = #line) -> Signal { return Signal { subscriber in let f: () -> Void = { self.beginInternalTransaction(ignoreDisabled: ignoreDisabled, { let (result, updatedTransactionState, updatedMasterClientId) = self.internalTransaction({ transaction in return f(transaction) - }) + }, file: file, line: line) if updatedTransactionState != nil || updatedMasterClientId != nil { //self.pipeNotifier.notify() @@ -4396,12 +4405,12 @@ public class Postbox { } } - public func transaction(userInteractive: Bool = false, ignoreDisabled: Bool = false, _ f: @escaping(Transaction) -> T) -> Signal { + public func transaction(userInteractive: Bool = false, ignoreDisabled: Bool = false, _ f: @escaping(Transaction) -> T, file: String = #file, line: Int = #line) -> Signal { return Signal { subscriber in let disposable = MetaDisposable() self.impl.with { impl in - disposable.set(impl.transaction(userInteractive: userInteractive, ignoreDisabled: ignoreDisabled, f).start(next: subscriber.putNext, error: subscriber.putError, completed: subscriber.putCompletion)) + disposable.set(impl.transaction(userInteractive: userInteractive, ignoreDisabled: ignoreDisabled, f, file: file, line: line).start(next: subscriber.putNext, error: subscriber.putError, completed: subscriber.putCompletion)) } return disposable