Wait for final PostgreSQL listener before recovery import
Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a06ecb-456a-71c2-b41e-0755d336e883
This commit is contained in:
parent
121f11de6a
commit
3614985c5a
1 changed files with 8 additions and 6 deletions
|
|
@ -42,7 +42,9 @@ def run(archive, receipt):
|
||||||
for marker, category in [(b'out of memory', 'memory_limit'),
|
for marker, category in [(b'out of memory', 'memory_limit'),
|
||||||
(b'syntax error', 'sql_syntax'),
|
(b'syntax error', 'sql_syntax'),
|
||||||
(b'does not exist', 'missing_database_object'),
|
(b'does not exist', 'missing_database_object'),
|
||||||
(b'duplicate key', 'duplicate_database_key')]:
|
(b'duplicate key', 'duplicate_database_key'),
|
||||||
|
(b'server closed the connection', 'database_connection_closed'),
|
||||||
|
(b'connection to server', 'database_connection_failed')]:
|
||||||
if marker in r.stderr.lower():
|
if marker in r.stderr.lower():
|
||||||
receipt['failure_kind']=category
|
receipt['failure_kind']=category
|
||||||
break
|
break
|
||||||
|
|
@ -106,13 +108,13 @@ LEVEL = Error
|
||||||
'-e','POSTGRES_PASSWORD','-e','POSTGRES_USER=forgejo','-e','POSTGRES_DB=forgejo',POSTGRES,env=env)
|
'-e','POSTGRES_PASSWORD','-e','POSTGRES_USER=forgejo','-e','POSTGRES_DB=forgejo',POSTGRES,env=env)
|
||||||
resources.append(('container',db))
|
resources.append(('container',db))
|
||||||
for _ in range(30):
|
for _ in range(30):
|
||||||
if docker('exec',db,'pg_isready','-U','forgejo',check=False).returncode==0: break
|
if docker('exec',db,'pg_isready','-h','127.0.0.1','-U','forgejo',check=False).returncode==0: break
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
else: raise ValueError('database_not_ready')
|
else: raise ValueError('database_not_ready')
|
||||||
sql=(staging/'forgejo-db.sql').read_bytes()
|
sql=(staging/'forgejo-db.sql').read_bytes()
|
||||||
docker('exec','-i',db,'psql','-U','forgejo','-d','forgejo','--single-transaction','-v','ON_ERROR_STOP=1',payload=sql,timeout=900)
|
docker('exec','-i',db,'psql','-h','127.0.0.1','-U','forgejo','-d','forgejo','--single-transaction','-v','ON_ERROR_STOP=1',payload=sql,timeout=900)
|
||||||
receipt['database_import']=True
|
receipt['database_import']=True
|
||||||
counts=docker('exec',db,'psql','-U','forgejo','-d','forgejo','-Atqc',
|
counts=docker('exec',db,'psql','-h','127.0.0.1','-U','forgejo','-d','forgejo','-Atqc',
|
||||||
'SELECT (SELECT count(*) FROM repository),(SELECT count(*) FROM "user"),(SELECT count(*) FROM package_blob);').stdout.decode().strip()
|
'SELECT (SELECT count(*) FROM repository),(SELECT count(*) FROM "user"),(SELECT count(*) FROM package_blob);').stdout.decode().strip()
|
||||||
numbers=[int(n) for n in counts.split('|')]
|
numbers=[int(n) for n in counts.split('|')]
|
||||||
if min(numbers[:2]) <= 0: raise ValueError('empty_database')
|
if min(numbers[:2]) <= 0: raise ValueError('empty_database')
|
||||||
|
|
@ -134,7 +136,7 @@ LEVEL = Error
|
||||||
receipt['application_health']=True
|
receipt['application_health']=True
|
||||||
receipt['stage']='repository_recovery'
|
receipt['stage']='repository_recovery'
|
||||||
# Select restored public repositories only, keeping payloads out of evidence.
|
# Select restored public repositories only, keeping payloads out of evidence.
|
||||||
rows=docker('exec',db,'psql','-U','forgejo','-d','forgejo','-Atqc',
|
rows=docker('exec',db,'psql','-h','127.0.0.1','-U','forgejo','-d','forgejo','-Atqc',
|
||||||
'SELECT u.lower_name || \'/\' || r.lower_name FROM repository r JOIN "user" u ON u.id=r.owner_id WHERE NOT r.is_private AND NOT r.is_empty LIMIT 2;').stdout.decode().splitlines()
|
'SELECT u.lower_name || \'/\' || r.lower_name FROM repository r JOIN "user" u ON u.id=r.owner_id WHERE NOT r.is_private AND NOT r.is_empty LIMIT 2;').stdout.decode().splitlines()
|
||||||
if not rows: raise ValueError('public_repository_fixture_missing')
|
if not rows: raise ValueError('public_repository_fixture_missing')
|
||||||
receipt['repositories_verified']=[]
|
receipt['repositories_verified']=[]
|
||||||
|
|
@ -148,7 +150,7 @@ LEVEL = Error
|
||||||
receipt['repositories_verified'].append(repo)
|
receipt['repositories_verified'].append(repo)
|
||||||
receipt['stage']='package_blob_recovery'
|
receipt['stage']='package_blob_recovery'
|
||||||
# Each stored blob must survive extraction and match its database digest.
|
# Each stored blob must survive extraction and match its database digest.
|
||||||
rows=docker('exec',db,'psql','-U','forgejo','-d','forgejo','-Atqc','SELECT hash_sha256 FROM package_blob;').stdout.decode().splitlines()
|
rows=docker('exec',db,'psql','-h','127.0.0.1','-U','forgejo','-d','forgejo','-Atqc','SELECT hash_sha256 FROM package_blob;').stdout.decode().splitlines()
|
||||||
files=list((staging/'data'/'packages').rglob('*')) if (staging/'data'/'packages').exists() else []
|
files=list((staging/'data'/'packages').rglob('*')) if (staging/'data'/'packages').exists() else []
|
||||||
available={p.name:p for p in files if p.is_file()}
|
available={p.name:p for p in files if p.is_file()}
|
||||||
verified=0
|
verified=0
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue