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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers