@@ -92,38 +92,8 @@ private extension Identifier where ObjectType == Server {
9292
9393private struct ServerCache {
9494 var restrictCaching : Bool = false
95- var deletedServers : Set < Identifier < Server > > {
96- get {
97- let identifiers = Current . settingsStore. prefs. array ( forKey: " deletedServers " ) as? [ String ] ?? [ ]
98- return Set ( identifiers. map { Identifier < Server > ( rawValue: $0) } )
99- }
100- set {
101- Current . settingsStore. prefs. set ( newValue. map ( \. rawValue) , forKey: " deletedServers " )
102- }
103- }
104-
105- var info : [ Identifier < Server > : ServerInfo ] = [ : ] {
106- didSet {
107- if !deletedServers. isDisjoint ( with: info. keys) {
108- Current . Log
109- . error (
110- " Stale server(s) in info cache overlapping with deleted servers, info keys: \( info. keys) , deleted servers: \( deletedServers) "
111- )
112- }
113- }
114- }
115-
116- var server : [ Identifier < Server > : Server ] = [ : ] {
117- didSet {
118- if !deletedServers. isDisjoint ( with: server. keys) {
119- Current . Log
120- . error (
121- " There are server(s) in cache that are deleted also in deleted servers set, servers: \( server. keys) , deleted servers: \( deletedServers) "
122- )
123- }
124- }
125- }
126-
95+ var info : [ Identifier < Server > : ServerInfo ] = [ : ]
96+ var server : [ Identifier < Server > : Server ] = [ : ]
12797 var all : [ Server ] ?
12898
12999 mutating func remove( identifier: Identifier < Server > ) {
@@ -164,6 +134,16 @@ final class ServerManagerImpl: ServerManager {
164134
165135 private let cache = HAProtected < ServerCache > ( value: . init( ) )
166136
137+ private var deletedServers : Set < Identifier < Server > > {
138+ get {
139+ let identifiers = Current . settingsStore. prefs. array ( forKey: " deletedServers " ) as? [ String ] ?? [ ]
140+ return Set ( identifiers. map { Identifier < Server > ( rawValue: $0) } )
141+ }
142+ set {
143+ Current . settingsStore. prefs. set ( newValue. map ( \. rawValue) , forKey: " deletedServers " )
144+ }
145+ }
146+
167147 // MARK: Lifecycle
168148
169149 init (
@@ -202,10 +182,10 @@ final class ServerManagerImpl: ServerManager {
202182 }
203183
204184 public var all : [ Server ] {
185+ let deletedServers = deletedServers
205186 let snapshot = cache. read { cache in
206187 (
207188 restrictCaching: cache. restrictCaching,
208- deletedServers: cache. deletedServers,
209189 cachedServers: cache. all
210190 )
211191 }
@@ -216,17 +196,18 @@ final class ServerManagerImpl: ServerManager {
216196
217197 // Read from Keychain and GRDB outside the cache lock so persistence I/O
218198 // does not block unrelated server-manager operations.
219- let persistedServers = mergedServerInfo ( deletedServers: snapshot . deletedServers)
199+ let persistedServers = mergedServerInfo ( deletedServers: deletedServers)
220200 . sorted ( by: { lhs, rhs -> Bool in
221201 lhs. 1 . sortOrder < rhs. 1 . sortOrder
222202 } )
223203
204+ let deletedServersUnchanged = self . deletedServers == deletedServers
224205 if let cachedOrFreshServers = cache. mutate ( using: { cache -> [ Server ] ? in
225206 if !cache. restrictCaching, let cachedServers = cache. all {
226207 return cachedServers
227208 }
228209
229- guard cache . deletedServers == snapshot . deletedServers else {
210+ guard deletedServersUnchanged else {
230211 return nil
231212 }
232213
@@ -241,7 +222,7 @@ final class ServerManagerImpl: ServerManager {
241222
242223 // Avoid retrying forever when another thread keeps mutating the server set.
243224 // In that case we return a best-effort fresh view and let a later access cache it.
244- let latestDeletedServers = cache . read ( \ . deletedServers)
225+ let latestDeletedServers = self . deletedServers
245226 let latestPersistedServers = mergedServerInfo ( deletedServers: latestDeletedServers)
246227 . sorted ( by: { lhs, rhs -> Bool in
247228 lhs. 1 . sortOrder < rhs. 1 . sortOrder
@@ -272,8 +253,12 @@ final class ServerManagerImpl: ServerManager {
272253 }
273254 }
274255
256+ var deletedServers = deletedServers
257+ if deletedServers. remove ( identifier) != nil {
258+ self . deletedServers = deletedServers
259+ }
260+
275261 let result = cache. mutate { cache -> Server in
276- cache. deletedServers. remove ( identifier)
277262 keychain. set ( serverInfo: setValue, key: identifier. keychainKey, encoder: encoder)
278263 cache. info [ identifier] = setValue
279264 cache. all = nil
@@ -293,8 +278,11 @@ final class ServerManagerImpl: ServerManager {
293278 }
294279
295280 public func remove( identifier: Identifier < Server > ) {
281+ var deletedServers = deletedServers
282+ deletedServers. insert ( identifier)
283+ self . deletedServers = deletedServers
284+
296285 cache. mutate { cache in
297- cache. deletedServers. insert ( identifier)
298286 keychain. deleteServerInfo ( key: identifier. keychainKey)
299287 cache. remove ( identifier: identifier)
300288 }
@@ -310,8 +298,11 @@ final class ServerManagerImpl: ServerManager {
310298
311299 public func removeAll( ) {
312300 let allKeys = Set ( keychain. allKeys ( ) + mirrorStore. allKeys ( ) )
301+ var deletedServers = deletedServers
302+ deletedServers. formUnion ( Set ( allKeys. map { Identifier < Server > ( keychainKey: $0) } ) )
303+ self . deletedServers = deletedServers
304+
313305 cache. mutate { cache in
314- cache. deletedServers. formUnion ( Set ( allKeys. map { Identifier < Server > ( keychainKey: $0) } ) )
315306 cache. reset ( )
316307 _ = try ? keychain. removeAll ( )
317308 }
@@ -344,7 +335,14 @@ final class ServerManagerImpl: ServerManager {
344335 fallback: ServerInfo
345336 ) -> ( ) -> ServerInfo {
346337 {
347- cache. mutate { cache -> ServerInfo in
338+ if let cached = cache. read ( { cache -> ServerInfo ? in
339+ cache. restrictCaching ? nil : cache. info [ identifier]
340+ } ) {
341+ return cached
342+ }
343+
344+ let deletedServers = self . deletedServers
345+ return cache. mutate { cache -> ServerInfo in
348346 if !cache. restrictCaching, let info = cache. info [ identifier] {
349347 return info
350348 } else {
@@ -357,7 +355,7 @@ final class ServerManagerImpl: ServerManager {
357355 let info = keychainInfo
358356 ?? ( shouldUseMirrorFallback ? mirroredInfo : nil )
359357 ?? fallback
360- if !cache . deletedServers. contains ( identifier) {
358+ if !deletedServers. contains ( identifier) {
361359 cache. info [ identifier] = info
362360 }
363361 return info
@@ -373,15 +371,16 @@ final class ServerManagerImpl: ServerManager {
373371 encoder: JSONEncoder ,
374372 notify: @escaping ( ) -> Void
375373 ) -> ( ServerInfo ) -> Bool {
376- { baseServerInfo in
374+ { [ weak self ] baseServerInfo in
377375 var serverInfo = baseServerInfo
378376
379377 // update active URL so we can update just once if it's different than the save is doing
380378 // intentionally not in the lock
381379 _ = serverInfo. connection. evaluateActiveURL ( )
382380
381+ let deletedServers = self ? . deletedServers ?? [ ]
383382 return cache. mutate { cache in
384- guard !cache . deletedServers. contains ( identifier) else {
383+ guard !deletedServers. contains ( identifier) else {
385384 Current . Log. verbose ( " ignoring update to deleted server \( identifier) " )
386385 return false
387386 }
@@ -491,7 +490,7 @@ final class ServerManagerImpl: ServerManager {
491490 }
492491
493492 private func pruneDeletedMirroredServers( ) {
494- let deletedKeys = Set ( cache . read ( \ . deletedServers) . map ( \. keychainKey) )
493+ let deletedKeys = Set ( deletedServers. map ( \. keychainKey) )
495494 guard !deletedKeys. isEmpty else { return }
496495
497496 let mirrorKeys = Set ( mirrorStore. allKeys ( ) )
@@ -506,7 +505,7 @@ final class ServerManagerImpl: ServerManager {
506505 }
507506
508507 private func restorableMirroredServers( excludingPreviouslyRestored: Bool = false ) -> [ ( String , ServerInfo ) ] {
509- let deletedServers = cache . read ( \ . deletedServers)
508+ let deletedServers = deletedServers
510509 let restoredMirroredServers = excludingPreviouslyRestored ? restoredMirroredServers : [ ]
511510 return mirrorStore. allServerInfo ( ) . filter { key, _ in
512511 !deletedServers. contains ( . init( keychainKey: key) ) && !restoredMirroredServers. contains ( key)
@@ -578,7 +577,7 @@ final class ServerManagerImpl: ServerManager {
578577 public func restorableState( ) -> Data {
579578 var state = [ String: ServerInfo] ( )
580579
581- for (id, info) in mergedServerInfo ( deletedServers: cache . read ( { $0 . deletedServers } ) ) {
580+ for (id, info) in mergedServerInfo ( deletedServers: deletedServers) {
582581 state [ id] = info
583582 }
584583
0 commit comments