From c3b39e9d350d9d55e131677888f9a61c4f103a12 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Wed, 13 Nov 2019 20:19:11 +0400 Subject: [PATCH] Don't apply incomplete updates --- .../Sources/AccountIntermediateState.swift | 7 ++++--- .../Sources/AccountStateManagementUtils.swift | 4 ++-- .../Sources/AccountStateManager.swift | 18 +++++++++++------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/submodules/TelegramCore/Sources/AccountIntermediateState.swift b/submodules/TelegramCore/Sources/AccountIntermediateState.swift index 41a9f05278..208135a437 100644 --- a/submodules/TelegramCore/Sources/AccountIntermediateState.swift +++ b/submodules/TelegramCore/Sources/AccountIntermediateState.swift @@ -502,9 +502,10 @@ struct AccountMutableState { } struct AccountFinalState { - let state: AccountMutableState - let shouldPoll: Bool - let incomplete: Bool + var state: AccountMutableState + var shouldPoll: Bool + var incomplete: Bool + var discard: Bool } struct AccountReplayedFinalState { diff --git a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift index ce6e9e6b7d..5229060697 100644 --- a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift @@ -1364,7 +1364,7 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo |> mapToSignal { resultingState -> Signal in return resolveMissingPeerChatInfos(network: network, state: resultingState) |> map { resultingState, resolveError -> AccountFinalState in - return AccountFinalState(state: resultingState, shouldPoll: shouldPoll || hadError || resolveError, incomplete: missingUpdates) + return AccountFinalState(state: resultingState, shouldPoll: shouldPoll || hadError || resolveError, incomplete: missingUpdates, discard: resolveError) } } } @@ -1590,7 +1590,7 @@ func keepPollingChannel(postbox: Postbox, network: Network, peerId: PeerId, stat |> mapToSignal { resultingState -> Signal in return resolveMissingPeerChatInfos(network: network, state: resultingState) |> map { resultingState, _ -> AccountFinalState in - return AccountFinalState(state: resultingState, shouldPoll: false, incomplete: false) + return AccountFinalState(state: resultingState, shouldPoll: false, incomplete: false, discard: false) } } |> mapToSignal { finalState -> Signal in diff --git a/submodules/TelegramCore/Sources/AccountStateManager.swift b/submodules/TelegramCore/Sources/AccountStateManager.swift index 0b70467eb2..b627f2c5cf 100644 --- a/submodules/TelegramCore/Sources/AccountStateManager.swift +++ b/submodules/TelegramCore/Sources/AccountStateManager.swift @@ -533,20 +533,24 @@ public final class AccountStateManager { |> mapToSignal { state -> Signal<(AccountReplayedFinalState?, AccountFinalState), NoError> in return finalStateWithUpdateGroups(postbox: postbox, network: network, state: state, groups: groups) |> mapToSignal { finalState in - if !finalState.state.preCachedResources.isEmpty { + if !finalState.discard && !finalState.state.preCachedResources.isEmpty { for (resource, data) in finalState.state.preCachedResources { postbox.mediaBox.storeResourceData(resource.id, data: data) } } return postbox.transaction { transaction -> AccountReplayedFinalState? in - let startTime = CFAbsoluteTimeGetCurrent() - let result = replayFinalState(accountManager: accountManager, postbox: postbox, accountPeerId: accountPeerId, mediaBox: mediaBox, encryptionProvider: network.encryptionProvider, transaction: transaction, auxiliaryMethods: auxiliaryMethods, finalState: finalState) - let deltaTime = CFAbsoluteTimeGetCurrent() - startTime - if deltaTime > 1.0 { - Logger.shared.log("State", "replayFinalState took \(deltaTime)s") + if finalState.discard { + return nil + } else { + let startTime = CFAbsoluteTimeGetCurrent() + let result = replayFinalState(accountManager: accountManager, postbox: postbox, accountPeerId: accountPeerId, mediaBox: mediaBox, encryptionProvider: network.encryptionProvider, transaction: transaction, auxiliaryMethods: auxiliaryMethods, finalState: finalState) + let deltaTime = CFAbsoluteTimeGetCurrent() - startTime + if deltaTime > 1.0 { + Logger.shared.log("State", "replayFinalState took \(deltaTime)s") + } + return result } - return result } |> map({ ($0, finalState) }) |> deliverOn(queue)