Re: [HACKERS] Missing pfree in logical_heap_rewrite_flush_mappings()

2014-04-23 Thread Andres Freund
On 2014-04-22 22:37:37 -0400, Tom Lane wrote:
> Bruce Momjian  writes:
> > I had to revert this patch.  It causes a failure in the
> > /contrib/test_decoding regression test.
> 
> On closer inspection, it was simply pfree'ing the wrong pointer.

Thanks for fixing.

> I fixed that and also undid the allocation in a different memory
> context, which didn't seem to be a particularly good idea, unless
> you've got a specific reason why CurrentMemoryContext would be the
> wrong place for a transient allocation.

That should be fine. I don't see any reason not to use palloc.
logical_rewrite_log_mapping() has to allocate longer living memory, I
guess it was copied from there.

Greetings,

Andres Freund

-- 
 Andres Freund http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] Missing pfree in logical_heap_rewrite_flush_mappings()

2014-04-22 Thread Tom Lane
Bruce Momjian  writes:
> I had to revert this patch.  It causes a failure in the
> /contrib/test_decoding regression test.

On closer inspection, it was simply pfree'ing the wrong pointer.

I fixed that and also undid the allocation in a different memory
context, which didn't seem to be a particularly good idea, unless
you've got a specific reason why CurrentMemoryContext would be the
wrong place for a transient allocation.

regards, tom lane


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] Missing pfree in logical_heap_rewrite_flush_mappings()

2014-04-22 Thread Bruce Momjian
On Tue, Apr 22, 2014 at 06:05:53PM -0400, Bruce Momjian wrote:
> On Wed, Mar 26, 2014 at 06:29:38PM +0200, Ants Aasma wrote:
> > It seems to me that when flushing logical mappings to disk, each
> > mapping file leaks the buffer used to pass the mappings to XLogInsert.
> > Also, it seems consistent to allocate that buffer in the RewriteState
> > memory context. Patch attached.
> 
> Patch applied.

I had to revert this patch.  It causes a failure in the
/contrib/test_decoding regression test.


-- 
  Bruce Momjian  http://momjian.us
  EnterpriseDB http://enterprisedb.com

  + Everyone has their own god. +


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] Missing pfree in logical_heap_rewrite_flush_mappings()

2014-04-22 Thread Bruce Momjian
On Wed, Mar 26, 2014 at 06:29:38PM +0200, Ants Aasma wrote:
> It seems to me that when flushing logical mappings to disk, each
> mapping file leaks the buffer used to pass the mappings to XLogInsert.
> Also, it seems consistent to allocate that buffer in the RewriteState
> memory context. Patch attached.

Patch applied.

-- 
  Bruce Momjian  http://momjian.us
  EnterpriseDB http://enterprisedb.com

  + Everyone has their own god. +


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] Missing pfree in logical_heap_rewrite_flush_mappings()

2014-03-27 Thread Stephen Frost
* Andres Freund (and...@2ndquadrant.com) wrote:
> On 2014-03-26 13:41:27 -0400, Stephen Frost wrote:
> > > Good catch. There's actually no need for explicitly using the context,
> > > we're in the appropriate one. The only other MemoryContextAlloc() caller
> > > in there should be converted to a palloc as well.
> > 
> > Hrm..?  I don't think that's right when it's called from
> > end_heap_rewrite().
> 
> You're right. Apprently I shouldn't look at patches while watching a
> keynote ;)

No problem- but that's also why I was thinking we should just wrap
end_heap_rewrite() in a context as well, otherwise the next person who
comes along to add a bit of code here may end up making the same
mistake.  Is there something you're concerned about there?

> > Perhaps we should be switching to state->rs_cxt
> > while in end_heap_rewrite() also though?
> 
> I think just applying Aant's patch is fine.

I have no problem *also* doing the pfree() to address the concern about
the transient memory usage being more than we'd like.

Thanks,

Stephen


signature.asc
Description: Digital signature


Re: [HACKERS] Missing pfree in logical_heap_rewrite_flush_mappings()

2014-03-26 Thread Andres Freund
On 2014-03-26 13:41:27 -0400, Stephen Frost wrote:
> * Andres Freund (and...@2ndquadrant.com) wrote:
> > On 2014-03-26 12:49:41 -0400, Stephen Frost wrote:
> > > * Ants Aasma (a...@cybertec.at) wrote:
> > > > It seems to me that when flushing logical mappings to disk, each
> > > > mapping file leaks the buffer used to pass the mappings to XLogInsert.
> > > > Also, it seems consistent to allocate that buffer in the RewriteState
> > > > memory context. Patch attached.
> > 
> > Good catch. There's actually no need for explicitly using the context,
> > we're in the appropriate one. The only other MemoryContextAlloc() caller
> > in there should be converted to a palloc as well.
> 
> Hrm..?  I don't think that's right when it's called from
> end_heap_rewrite().

You're right. Apprently I shouldn't look at patches while watching a
keynote ;)

> Perhaps we should be switching to state->rs_cxt
> while in end_heap_rewrite() also though?

I think just applying Aant's patch is fine.

Greetings,

Andres Freund

-- 
 Andres Freund http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] Missing pfree in logical_heap_rewrite_flush_mappings()

2014-03-26 Thread Stephen Frost
* Andres Freund (and...@2ndquadrant.com) wrote:
> On 2014-03-26 12:49:41 -0400, Stephen Frost wrote:
> > * Ants Aasma (a...@cybertec.at) wrote:
> > > It seems to me that when flushing logical mappings to disk, each
> > > mapping file leaks the buffer used to pass the mappings to XLogInsert.
> > > Also, it seems consistent to allocate that buffer in the RewriteState
> > > memory context. Patch attached.
> 
> Good catch. There's actually no need for explicitly using the context,
> we're in the appropriate one. The only other MemoryContextAlloc() caller
> in there should be converted to a palloc as well.

Hrm..?  I don't think that's right when it's called from
end_heap_rewrite().  Perhaps we should be switching to state->rs_cxt
while in end_heap_rewrite() also though?

> > Hmm, yeah, it does look that way.  Why bother pfree'ing it here though
> > instead of letting it be cleaned up with state->rs_cxt in
> > end_heap_rewrite()?
> 
> For a somewhat large relation (say a pg_attribute in a db with lots of
> tables), this can actually get to be a somewhat significant amount of
> memory. It *will* currently already get cleaned up with the context, but
> we can easily do better.

Ok, so perhaps we should go ahead and pfree() this as we go.

Thanks,

Stephen


signature.asc
Description: Digital signature


Re: [HACKERS] Missing pfree in logical_heap_rewrite_flush_mappings()

2014-03-26 Thread Andres Freund
On 2014-03-26 12:49:41 -0400, Stephen Frost wrote:
> * Ants Aasma (a...@cybertec.at) wrote:
> > It seems to me that when flushing logical mappings to disk, each
> > mapping file leaks the buffer used to pass the mappings to XLogInsert.
> > Also, it seems consistent to allocate that buffer in the RewriteState
> > memory context. Patch attached.

Good catch. There's actually no need for explicitly using the context,
we're in the appropriate one. The only other MemoryContextAlloc() caller
in there should be converted to a palloc as well.

> Hmm, yeah, it does look that way.  Why bother pfree'ing it here though
> instead of letting it be cleaned up with state->rs_cxt in
> end_heap_rewrite()?

For a somewhat large relation (say a pg_attribute in a db with lots of
tables), this can actually get to be a somewhat significant amount of
memory. It *will* currently already get cleaned up with the context, but
we can easily do better.

Greetings,

Andres Freund

-- 
 Andres Freund http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] Missing pfree in logical_heap_rewrite_flush_mappings()

2014-03-26 Thread Stephen Frost
* Ants Aasma (a...@cybertec.at) wrote:
> It seems to me that when flushing logical mappings to disk, each
> mapping file leaks the buffer used to pass the mappings to XLogInsert.
> Also, it seems consistent to allocate that buffer in the RewriteState
> memory context. Patch attached.

Hmm, yeah, it does look that way.  Why bother pfree'ing it here though
instead of letting it be cleaned up with state->rs_cxt in
end_heap_rewrite()?

Thanks,

Stephen


signature.asc
Description: Digital signature


[HACKERS] Missing pfree in logical_heap_rewrite_flush_mappings()

2014-03-26 Thread Ants Aasma
It seems to me that when flushing logical mappings to disk, each
mapping file leaks the buffer used to pass the mappings to XLogInsert.
Also, it seems consistent to allocate that buffer in the RewriteState
memory context. Patch attached.

Regards,
Ants Aasma
-- 
Cybertec Schönig & Schönig GmbH
Gröhrmühlgasse 26
A-2700 Wiener Neustadt
Web: http://www.postgresql-support.de
diff --git a/src/backend/access/heap/rewriteheap.c b/src/backend/access/heap/rewriteheap.c
index 4cf07ea..ae439e8 100644
--- a/src/backend/access/heap/rewriteheap.c
+++ b/src/backend/access/heap/rewriteheap.c
@@ -897,7 +897,7 @@ logical_heap_rewrite_flush_mappings(RewriteState state)
 
 		/* write all mappings consecutively */
 		len = src->num_mappings * sizeof(LogicalRewriteMappingData);
-		waldata = palloc(len);
+		waldata = MemoryContextAlloc(state->rs_cxt, len);
 		waldata_start = waldata;
 
 		/*
@@ -943,6 +943,7 @@ logical_heap_rewrite_flush_mappings(RewriteState state)
 		/* write xlog record */
 		XLogInsert(RM_HEAP2_ID, XLOG_HEAP2_REWRITE, rdata);
 
+		pfree(waldata);
 	}
 	Assert(state->rs_num_rewrite_mappings == 0);
 }

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers