diff --git a/contrib/test_decoding/t/002_rb_memory.pl b/contrib/test_decoding/t/002_rb_memory.pl new file mode 100644 index 0000000000..f20c6fb181 --- /dev/null +++ b/contrib/test_decoding/t/002_rb_memory.pl @@ -0,0 +1,45 @@ +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('test'); +$node->init(allows_streaming => 'logical'); +$node->start; + +$node->safe_psql('postgres', 'create table test (a int, b text)'); +$node->safe_psql('postgres', + q[select pg_create_logical_replication_slot('s', 'test_decoding')]); +my $psql1 = $node->background_psql('postgres', on_error_stop => 0); +my $psql2 = $node->background_psql('postgres', on_error_stop => 0); + +$psql2->query_safe(q[begin]); +for my $i (1 .. 300) +{ + $psql1->query_safe(q[ +begin; +insert into test select c, repeat(md5(c::text), 10) from generate_series(1, 20000) c; +commit; +]); + + $psql2->query_safe(q[insert into test select c, repeat(md5(c::text), 10) from generate_series(1, 150) c;]); +} + +$psql2->query_safe(q[commit]); + +$psql1->quit; +$psql2->quit; + +my $ret = $node->safe_psql('postgres', + q[ +set logical_decoding_work_mem to '256MB'; +select count(*) from pg_logical_slot_peek_changes('s', null, null); +]); + +is($ret, 6045602, "test"); + +$node->stop; + +done_testing(); + diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 22bcf171ff..26d03e58da 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -3632,6 +3632,18 @@ static void ReorderBufferCheckMemoryLimit(ReorderBuffer *rb) { ReorderBufferTXN *txn; + static bool report_1gb_mem = true; + + if (report_1gb_mem && MemoryContextMemAllocated(rb->tup_context, true) > (1024L * 1024L * 1024L)) + { + elog(LOG, "reorderbuffer memory: logical_decoding_work_mem=%lu rb->size=%lu rb->tup_context=%lu rb->context=%lu", + logical_decoding_work_mem * 1024L, + rb->size, + MemoryContextMemAllocated(rb->tup_context, true), + MemoryContextMemAllocated(rb->context, true)); + + report_1gb_mem = false; /* report only once */ + } /* * Bail out if debug_logical_replication_streaming is buffered and we