(ctx context.Context, t *testing.T, db *sql.DB)
| 1241 | } |
| 1242 | |
| 1243 | func holdResourceWriteLock(ctx context.Context, t *testing.T, db *sql.DB) { |
| 1244 | t.Helper() |
| 1245 | |
| 1246 | lockConn, err := db.Conn(ctx) |
| 1247 | if err != nil { |
| 1248 | t.Fatalf("db.Conn() error = %v", err) |
| 1249 | } |
| 1250 | t.Cleanup(func() { |
| 1251 | if closeErr := lockConn.Close(); closeErr != nil { |
| 1252 | t.Fatalf("lockConn.Close() error = %v", closeErr) |
| 1253 | } |
| 1254 | }) |
| 1255 | |
| 1256 | if _, err := lockConn.ExecContext(ctx, "BEGIN IMMEDIATE"); err != nil { |
| 1257 | t.Fatalf("BEGIN IMMEDIATE lock error = %v", err) |
| 1258 | } |
| 1259 | |
| 1260 | releaseDone := make(chan error, 1) |
| 1261 | timer := time.AfterFunc(10*time.Millisecond, func() { |
| 1262 | _, commitErr := lockConn.ExecContext(ctx, "COMMIT") |
| 1263 | releaseDone <- commitErr |
| 1264 | }) |
| 1265 | t.Cleanup(func() { |
| 1266 | if timer.Stop() { |
| 1267 | if _, err := lockConn.ExecContext(ctx, "COMMIT"); err != nil { |
| 1268 | t.Fatalf("manual lock release error = %v", err) |
| 1269 | } |
| 1270 | return |
| 1271 | } |
| 1272 | if err := <-releaseDone; err != nil { |
| 1273 | t.Fatalf("timed lock release error = %v", err) |
| 1274 | } |
| 1275 | }) |
| 1276 | } |
| 1277 | |
| 1278 | func testDaemonActor() MutationActor { |
| 1279 | return MutationActor{ |
no test coverage detected