Use shell redirection rather than the --file flag to sidestep synchronization issues when pg_dump/pg_dumpall tries to write to a named pipe.

This commit is contained in:
Dan Helfman 2020-05-08 19:11:26 -07:00
parent f36082938e
commit 6a61070d85
2 changed files with 23 additions and 27 deletions

View File

@ -42,15 +42,16 @@ def dump_databases(databases, log_prefix, location_config, dry_run):
'--no-password',
'--clean',
'--if-exists',
'--no-sync',
)
+ ('--file', dump_filename)
+ (('--host', database['hostname']) if 'hostname' in database else ())
+ (('--port', str(database['port'])) if 'port' in database else ())
+ (('--username', database['username']) if 'username' in database else ())
+ (() if all_databases else ('--format', database.get('format', 'custom')))
+ (tuple(database['options'].split(' ')) if 'options' in database else ())
+ (() if all_databases else (name,))
# Use shell redirection rather than the --file flag to sidestep synchronization issues
# when pg_dump/pg_dumpall tries to write to a named pipe.
+ ('>', dump_filename)
)
extra_environment = {'PGPASSWORD': database['password']} if 'password' in database else None
@ -65,7 +66,9 @@ def dump_databases(databases, log_prefix, location_config, dry_run):
dump.create_named_pipe_for_dump(dump_filename)
processes.append(
execute_command(command, extra_environment=extra_environment, run_to_completion=False)
execute_command(
command, shell=True, extra_environment=extra_environment, run_to_completion=False
)
)
return processes

View File

@ -20,13 +20,13 @@ def test_dump_databases_runs_pg_dump_for_each_database():
'--no-password',
'--clean',
'--if-exists',
'--no-sync',
'--file',
'databases/localhost/{}'.format(name),
'--format',
'custom',
name,
'>',
'databases/localhost/{}'.format(name),
),
shell=True,
extra_environment=None,
run_to_completion=False,
).and_return(process).once()
@ -61,9 +61,6 @@ def test_dump_databases_runs_pg_dump_with_hostname_and_port():
'--no-password',
'--clean',
'--if-exists',
'--no-sync',
'--file',
'databases/database.example.org/foo',
'--host',
'database.example.org',
'--port',
@ -71,7 +68,10 @@ def test_dump_databases_runs_pg_dump_with_hostname_and_port():
'--format',
'custom',
'foo',
'>',
'databases/database.example.org/foo',
),
shell=True,
extra_environment=None,
run_to_completion=False,
).and_return(process).once()
@ -94,15 +94,15 @@ def test_dump_databases_runs_pg_dump_with_username_and_password():
'--no-password',
'--clean',
'--if-exists',
'--no-sync',
'--file',
'databases/localhost/foo',
'--username',
'postgres',
'--format',
'custom',
'foo',
'>',
'databases/localhost/foo',
),
shell=True,
extra_environment={'PGPASSWORD': 'trustsome1'},
run_to_completion=False,
).and_return(process).once()
@ -125,13 +125,13 @@ def test_dump_databases_runs_pg_dump_with_format():
'--no-password',
'--clean',
'--if-exists',
'--no-sync',
'--file',
'databases/localhost/foo',
'--format',
'tar',
'foo',
'>',
'databases/localhost/foo',
),
shell=True,
extra_environment=None,
run_to_completion=False,
).and_return(process).once()
@ -154,14 +154,14 @@ def test_dump_databases_runs_pg_dump_with_options():
'--no-password',
'--clean',
'--if-exists',
'--no-sync',
'--file',
'databases/localhost/foo',
'--format',
'custom',
'--stuff=such',
'foo',
'>',
'databases/localhost/foo',
),
shell=True,
extra_environment=None,
run_to_completion=False,
).and_return(process).once()
@ -179,15 +179,8 @@ def test_dump_databases_runs_pg_dumpall_for_all_databases():
flexmock(module.dump).should_receive('create_named_pipe_for_dump')
flexmock(module).should_receive('execute_command').with_args(
(
'pg_dumpall',
'--no-password',
'--clean',
'--if-exists',
'--no-sync',
'--file',
'databases/localhost/all',
),
('pg_dumpall', '--no-password', '--clean', '--if-exists', '>', 'databases/localhost/all'),
shell=True,
extra_environment=None,
run_to_completion=False,
).and_return(process).once()