@@ -40,6 +40,9 @@ actor DatabasePool {
4040 var availableDatabases : Set < Database > = . init( )
4141
4242 func setUp( ) async throws {
43+ let start = Date ( )
44+ print ( " ℹ️ \( #function) start " )
45+ defer { print ( " ℹ️ \( #function) end " , Date ( ) . timeIntervalSince ( start) ) }
4346 // Call DotEnvFile.load once to ensure env variables are set
4447 await DotEnvFile . load ( for: . testing, fileio: . init( threadPool: . singleton) )
4548
@@ -88,6 +91,9 @@ actor DatabasePool {
8891 }
8992
9093 func withDatabase( _ operation: @Sendable ( Database) async throws -> Void ) async throws {
94+ let start = Date ( )
95+ print ( " ℹ️ \( #function) start " )
96+ defer { print ( " ℹ️ \( #function) end " , Date ( ) . timeIntervalSince ( start) ) }
9197 let db = try await retainDatabase ( )
9298 do {
9399 try await operation ( db)
@@ -116,8 +122,19 @@ actor DatabasePool {
116122 }
117123
118124 private func retainDatabase( ) async throws -> Database {
125+ let start = Date ( )
126+ print ( " ℹ️ \( #function) start " )
127+ defer { print ( " ℹ️ \( #function) end " , Date ( ) . timeIntervalSince ( start) ) }
119128 var database = availableDatabases. randomElement ( )
129+ var retry = 0
120130 while database == nil {
131+ defer { retry += 1 }
132+ if retry > 0 && retry % 50 == 0 {
133+ print ( " ℹ️ \( #function) available databases: \( availableDatabases. count) retry \( retry) " )
134+ }
135+ if retry >= 1000 {
136+ throw " Retry count exceeded "
137+ }
121138 try await Task . sleep ( for: . milliseconds( 100 ) )
122139 database = availableDatabases. randomElement ( )
123140 }
@@ -268,3 +285,7 @@ extension Environment {
268285 Environment . get ( " DATABASEPOOL_TEARDOWN " ) . flatMap ( \. asBool) ?? true
269286 }
270287}
288+
289+
290+ #warning("remove later")
291+ extension String : Swift . Error { }
0 commit comments