Skip to content

Commit 8cc9ed4

Browse files
committed
backu prestore race condition fix
1 parent f8d2fbe commit 8cc9ed4

1 file changed

Lines changed: 20 additions & 16 deletions

File tree

windows/db_backend.py

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737

3838
_NO_WINDOW = getattr(subprocess, "CREATE_NO_WINDOW", 0)
3939
_patch_lock = threading.Lock()
40+
_embedded_lock = threading.Lock()
4041

4142

4243
def _check_pgserver():
@@ -216,16 +217,17 @@ def start_embedded(data_dir):
216217
if fresh:
217218
_clear_stale_data_dir(data_dir)
218219
_preinit_scram(data_dir, pw)
219-
try:
220-
uri = database.start_embedded(data_dir)
221-
except Exception:
222-
if not fresh:
223-
raise
224-
logger.warning("Fresh PostgreSQL cluster failed to start — clearing and retrying once")
225-
import shutil
226-
shutil.rmtree(data_dir, ignore_errors=True)
227-
_preinit_scram(data_dir, pw)
228-
uri = database.start_embedded(data_dir)
220+
with _embedded_lock:
221+
try:
222+
uri = database.start_embedded(data_dir)
223+
except Exception:
224+
if not fresh:
225+
raise
226+
logger.warning("Fresh PostgreSQL cluster failed to start — clearing and retrying once")
227+
import shutil
228+
shutil.rmtree(data_dir, ignore_errors=True)
229+
_preinit_scram(data_dir, pw)
230+
uri = database.start_embedded(data_dir)
229231
if not fresh:
230232
_harden_existing(data_dir, pw, uri)
231233
return _conn_from_uri(uri, pw)
@@ -238,14 +240,16 @@ def ensure_embedded_running(data_dir):
238240
if _check_pgserver():
239241
_patch_pgserver_pg_ctl()
240242
import database
241-
return _conn_from_uri(database.ensure_embedded_running(data_dir), pw)
243+
with _embedded_lock:
244+
return _conn_from_uri(database.ensure_embedded_running(data_dir), pw)
242245
from windows import embedded_pg
243246
return embedded_pg.ensure_running(data_dir, pw)
244247

245248

246249
def stop_embedded():
247-
if _check_pgserver():
248-
import database
249-
return database.stop_embedded()
250-
from windows import embedded_pg
251-
return embedded_pg.stop()
250+
with _embedded_lock:
251+
if _check_pgserver():
252+
import database
253+
return database.stop_embedded()
254+
from windows import embedded_pg
255+
return embedded_pg.stop()

0 commit comments

Comments
 (0)