# # 1. Check initial data is the same #
ok( send_query_and_wait(
\%psql_standby,
q/SELECT * FROM test_visibility ORDER BY data;/,
qr/^\(0 rows\)$/m), 'data not visible');
# # 2. Check if an INSERT is replayed and visible #
$node_primary->psql('postgres', "INSERT INTO test_visibility VALUES ('first insert')");
$node_primary->wait_for_catchup($node_standby);
ok( send_query_and_wait(
\%psql_standby,
q[SELECT * FROM test_visibility ORDER BY data;],
qr/first insert.*\n\(1 row\)/m), 'insert visible');
# # 3. Verify that uncommitted changes aren't visible. #
ok( send_query_and_wait(
\%psql_primary,
q[
BEGIN;
UPDATE test_visibility SET data = 'first update' RETURNING data;
],
qr/^UPDATE 1$/m), 'UPDATE');
ok( send_query_and_wait(
\%psql_standby,
q[SELECT * FROM test_visibility ORDER BY data;],
qr/first insert.*\n\(1 row\)/m), 'uncommitted update invisible');
# # 4. That a commit turns 3. visible #
ok(send_query_and_wait(\%psql_primary, q[COMMIT;], qr/^COMMIT$/m), 'COMMIT');
$node_primary->wait_for_catchup($node_standby);
ok( send_query_and_wait(
\%psql_standby,
q[SELECT * FROM test_visibility ORDER BY data;],
qr/first update\n\(1 row\)$/m), 'committed update visible');
# # 5. Check that changes in prepared xacts is invisible #
ok( send_query_and_wait(
\%psql_primary, q[
DELETE from test_visibility; -- delete old data, so we start with clean slate
BEGIN;
INSERT INTO test_visibility VALUES('inserted in prepared will_commit');
PREPARE TRANSACTION 'will_commit';],
qr/^PREPARE TRANSACTION$/m), 'prepared will_commit');
ok( send_query_and_wait(
\%psql_primary, q[
BEGIN;
INSERT INTO test_visibility VALUES('inserted in prepared will_abort');
PREPARE TRANSACTION 'will_abort';
],
qr/^PREPARE TRANSACTION$/m), 'prepared will_abort');
$node_primary->wait_for_catchup($node_standby);
ok( send_query_and_wait(
\%psql_standby,
q[SELECT * FROM test_visibility ORDER BY data;],
qr/^\(0 rows\)$/m), 'uncommitted prepared invisible');
# For some variation, finish prepared xacts via separate connections
$node_primary->safe_psql('postgres', "COMMIT PREPARED 'will_commit';");
$node_primary->safe_psql('postgres', "ROLLBACK PREPARED 'will_abort';");
$node_primary->wait_for_catchup($node_standby);
ok( send_query_and_wait(
\%psql_standby,
q[SELECT * FROM test_visibility ORDER BY data;],
qr/will_commit.*\n\(1 row\)$/m), 'finished prepared visible');
# explicitly shut down psql instances gracefully - to avoid hangs # or worse on windows
$psql_primary{stdin} .= "\\q\n";
$psql_primary{run}->finish;
$psql_standby{stdin} .= "\\q\n";
$psql_standby{run}->finish;
$node_primary->stop;
$node_standby->stop;
# Send query, wait until string matches
sub send_query_and_wait
{
my ($psql, $query, $untl) = @_;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.