Hi, On 2014-10-25 18:09:36 -0400, Steve Singer wrote: > I sometimes get the error "snapshot too large" from my logical replication > walsender process when in response to a CREATE_REPLICATION_SLOT.
Yes. That's possible if 'too much' was going on until a consistent point was reached. I think we can just use a much larger size for the array if necessary. I've attached patch for this. Could you try whether that helps? I don't have a testcase handy that reproduces the problem. > This is in SnapBuildExportSnapshot in snapbuild.c > > newxcnt is 212 at that point > > I have max_connections = 200 > > procArray->maxProcs=212 > > Should we be testing > newxcnt > GetMaxSnapshotXidCount() > > instead of > newxcnt >= GetMaxSnapshotXidCount() It actually looks correct to me new - newxcnt is used as an offset into an array of size GetMaxSnapshotXidCount(). Greetings, Andres Freund -- Andres Freund http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
diff --git a/src/backend/replication/logical/snapbuild.c b/src/backend/replication/logical/snapbuild.c index 5e59c6b..2df1905 100644 --- a/src/backend/replication/logical/snapbuild.c +++ b/src/backend/replication/logical/snapbuild.c @@ -519,6 +519,7 @@ SnapBuildExportSnapshot(SnapBuild *builder) TransactionId xid; TransactionId *newxip; int newxcnt = 0; + int newxcnt_max; if (builder->state != SNAPBUILD_CONSISTENT) elog(ERROR, "cannot export a snapshot before reaching a consistent state"); @@ -557,8 +558,9 @@ SnapBuildExportSnapshot(SnapBuild *builder) MyPgXact->xmin = snap->xmin; /* allocate in transaction context */ + newxcnt_max = GetMaxSnapshotXidCount(); newxip = (TransactionId *) - palloc(sizeof(TransactionId) * GetMaxSnapshotXidCount()); + palloc(sizeof(TransactionId) * newxcnt_max); /* * snapbuild.c builds transactions in an "inverted" manner, which means it @@ -579,8 +581,11 @@ SnapBuildExportSnapshot(SnapBuild *builder) if (test == NULL) { - if (newxcnt >= GetMaxSnapshotXidCount()) - elog(ERROR, "snapshot too large"); + if (newxcnt >= newxcnt_max) + { + newxcnt_max *= 2; + newxip = repalloc(newxip, sizeof(TransactionId) * newxcnt_max); + } newxip[newxcnt++] = xid; }
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers