Reviewing freeze map code

Started by Andres Freundalmost 10 years ago256 messageshackers
Jump to latest
#1Andres Freund
andres@anarazel.de

Hi,

The freeze map changes, besides being very important, seem to be one of
the patches with a high risk profile in 9.6. Robert had asked whether
I'd take a look. I thought it'd be a good idea to review that while
running tests for
/messages/by-id/CAMkU=1w85Dqt766AUrCnyqCXfZ+rsk1witAc_=v5+Pce93Sftw@mail.gmail.com

For starters, I'm just going through the commits. It seems the relevant
pieces are:

a892234 Change the format of the VM fork to add a second bit per page.
77a1d1e Department of second thoughts: remove PD_ALL_FROZEN.
fd31cd2 Don't vacuum all-frozen pages.
7087166 pg_upgrade: Convert old visibility map format to new format.
ba0a198 Add pg_visibility contrib module.

did I miss anything important?

Greetings,

Andres Freund

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

#2Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
Re: Reviewing freeze map code

Hi,

some of the review items here are mere matters of style/preference. Feel
entirely free to discard them, but I thought if I'm going through the
change anyway...

On 2016-05-02 14:48:18 -0700, Andres Freund wrote:

a892234 Change the format of the VM fork to add a second bit per page.

TL;DR: fairly minor stuff.

+ * heap_tuple_needs_eventual_freeze
+ *
+ * Check to see whether any of the XID fields of a tuple (xmin, xmax, xvac)
+ * will eventually require freezing.  Similar to heap_tuple_needs_freeze,
+ * but there's no cutoff, since we're trying to figure out whether freezing
+ * will ever be needed, not whether it's needed now.
+ */
+bool
+heap_tuple_needs_eventual_freeze(HeapTupleHeader tuple)

Wouldn't redefining this to heap_tuple_is_frozen() and then inverting the
checks be easier to understand?

+	/*
+	 * If xmax is a valid xact or multixact, this tuple is also not frozen.
+	 */
+	if (tuple->t_infomask & HEAP_XMAX_IS_MULTI)
+	{
+		MultiXactId multi;
+
+		multi = HeapTupleHeaderGetRawXmax(tuple);
+		if (MultiXactIdIsValid(multi))
+			return true;
+	}

Hm. What's the test inside the if() for? There shouldn't be any case
where xmax is invalid if HEAP_XMAX_IS_MULTI is set. Now there's a
check like that outside of this commit, but it seems strange to me
(Alvaro, perhaps you could comment on this?).

+ *
+ * Clearing both visibility map bits is not separately WAL-logged.  The callers
  * must make sure that whenever a bit is cleared, the bit is cleared on WAL
  * replay of the updating operation as well.

I think including "both" here makes things less clear, because it
differentiates clearing one bit from clearing both. There's no practical
differentce atm, but still.

*
* VACUUM will normally skip pages for which the visibility map bit is set;
* such pages can't contain any dead tuples and therefore don't need vacuuming.
- * The visibility map is not used for anti-wraparound vacuums, because
- * an anti-wraparound vacuum needs to freeze tuples and observe the latest xid
- * present in the table, even on pages that don't have any dead tuples.
*

I think the remaining sentence isn't entirely accurate, there's now more
than one bit, and they're different with regard to scan_all/!scan_all
vacuums (or will be - maybe this updated further in a later commit? But
if so, that sentence shouldn't yet be removed...).

-
-/* Number of heap blocks we can represent in one byte. */
-#define HEAPBLOCKS_PER_BYTE 8
-

Hm, why was this moved to the header? Sounds like something the outside
shouldn't care about.

#define HEAPBLK_TO_MAPBIT(x) (((x) % HEAPBLOCKS_PER_BYTE) * BITS_PER_HEAPBLOCK)

Hm. This isn't really a mapping to an individual bit anymore - but I
don't really have a better name in mind. Maybe TO_OFFSET?

+static const uint8 number_of_ones_for_visible[256] = {
...
+};
+static const uint8 number_of_ones_for_frozen[256] = {
...
 };

Did somebody verify the new contents are correct?

/*
- *	visibilitymap_clear - clear a bit in visibility map
+ *	visibilitymap_clear - clear all bits in visibility map
  *

This seems rather easy to misunderstand, as this really only clears all
the bits for one page, not actually all the bits.

  * the bit for heapBlk, or InvalidBuffer. The caller is responsible for
- * releasing *buf after it's done testing and setting bits.
+ * releasing *buf after it's done testing and setting bits, and must pass flags
+ * for which it needs to check the value in visibility map.
  *
  * NOTE: This function is typically called without a lock on the heap page,
  * so somebody else could change the bit just after we look at it.  In fact,
@@ -327,17 +351,16 @@ visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf,

I'm not seing what flags the above comment change is referring to?

 	/*
-	 * A single-bit read is atomic.  There could be memory-ordering effects
+	 * A single byte read is atomic.  There could be memory-ordering effects
 	 * here, but for performance reasons we make it the caller's job to worry
 	 * about that.
 	 */
-	result = (map[mapByte] & (1 << mapBit)) ? true : false;
-
-	return result;
+	return ((map[mapByte] >> mapBit) & VISIBILITYMAP_VALID_BITS);
 }

Not a new issue, and *very* likely to be irrelevant in practice (given
the value is only referenced once): But there's really no guarantee
map[mapByte] is only read once here.

-BlockNumber
-visibilitymap_count(Relation rel)
+void
+visibilitymap_count(Relation rel, BlockNumber *all_visible, BlockNumber *all_frozen)

Not really a new issue again: The parameter types (previously return
type) to this function seem wrong to me.

@@ -1934,5 +1992,14 @@ heap_page_is_all_visible(Relation rel, Buffer buf, TransactionId *visibility_cut
 		} 
+	/*
+	 * We don't bother clearing *all_frozen when the page is discovered not
+	 * to be all-visible, so do that now if necessary.  The page might fail
+	 * to be all-frozen for other reasons anyway, but if it's not all-visible,
+	 * then it definitely isn't all-frozen.
+	 */
+	if (!all_visible)
+		*all_frozen = false;
+

Why don't we just set *all_frozen to false when appropriate? It'd be
just as many lines and probably easier to understand?

+		/*
+		 * If the page is marked as all-visible but not all-frozen, we should
+		 * so mark it.  Note that all_frozen is only valid if all_visible is
+		 * true, so we must check both.
+		 */

This kinda seems to imply that all-visible implies all_frozen. Also, why
has that block been added to the end of the if/else if chain? Seems like
it belongs below the (all_visible && !all_visible_according_to_vm) block.

Greetings,

Andres Freund

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

#3Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andres Freund (#1)
Re: Reviewing freeze map code

On Tue, May 3, 2016 at 6:48 AM, Andres Freund <andres@anarazel.de> wrote:

Hi,

The freeze map changes, besides being very important, seem to be one of
the patches with a high risk profile in 9.6. Robert had asked whether
I'd take a look. I thought it'd be a good idea to review that while
running tests for
/messages/by-id/CAMkU=1w85Dqt766AUrCnyqCXfZ+rsk1witAc_=v5+Pce93Sftw@mail.gmail.com

Thank you for reviewing.

For starters, I'm just going through the commits. It seems the relevant
pieces are:

a892234 Change the format of the VM fork to add a second bit per page.
77a1d1e Department of second thoughts: remove PD_ALL_FROZEN.
fd31cd2 Don't vacuum all-frozen pages.
7087166 pg_upgrade: Convert old visibility map format to new format.
ba0a198 Add pg_visibility contrib module.

did I miss anything important?

That's all.

Regards,

--
Masahiko Sawada

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

#4Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
Re: Reviewing freeze map code

On 2016-05-02 14:48:18 -0700, Andres Freund wrote:

77a1d1e Department of second thoughts: remove PD_ALL_FROZEN.

Nothing to say here.

fd31cd2 Don't vacuum all-frozen pages.

Hm. I do wonder if it's going to bite us that we don't have a way to
actually force vacuuming of the whole table (besides manually rm'ing the
VM). I've more than once seen VACUUM used to try to do some integrity
checking of the database. How are we actually going to test that the
feature works correctly? They'd have to write checks ontop of
pg_visibility to see whether things are borked.

/*
* Compute whether we actually scanned the whole relation. If we did, we
* can adjust relfrozenxid and relminmxid.
*
* NB: We need to check this before truncating the relation, because that
* will change ->rel_pages.
*/

Comment is out-of-date now.

-		if (blkno == next_not_all_visible_block)
+		if (blkno == next_unskippable_block)
 		{
-			/* Time to advance next_not_all_visible_block */
-			for (next_not_all_visible_block++;
-				 next_not_all_visible_block < nblocks;
-				 next_not_all_visible_block++)
+			/* Time to advance next_unskippable_block */
+			for (next_unskippable_block++;
+				 next_unskippable_block < nblocks;
+				 next_unskippable_block++)

Hm. So we continue with the course of re-processing pages, even if
they're marked all-frozen. For all-visible there at least can be a
benefit by freezing earlier, but for all-frozen pages there's really no
point. I don't really buy the arguments for the skipping logic. But
even disregarding that, maybe we should skip processing a block if it's
all-frozen (without preventing the page from being read?); as there's no
possible benefit? Acquring the exclusive/content lock and stuff is far
from free.

Not really related to this patch, but the FORCE_CHECK_PAGE is rather
ugly.

+			/*
+			 * The current block is potentially skippable; if we've seen a
+			 * long enough run of skippable blocks to justify skipping it, and
+			 * we're not forced to check it, then go ahead and skip.
+			 * Otherwise, the page must be at least all-visible if not
+			 * all-frozen, so we can set all_visible_according_to_vm = true.
+			 */
+			if (skipping_blocks && !FORCE_CHECK_PAGE())
+			{
+				/*
+				 * Tricky, tricky.  If this is in aggressive vacuum, the page
+				 * must have been all-frozen at the time we checked whether it
+				 * was skippable, but it might not be any more.  We must be
+				 * careful to count it as a skipped all-frozen page in that
+				 * case, or else we'll think we can't update relfrozenxid and
+				 * relminmxid.  If it's not an aggressive vacuum, we don't
+				 * know whether it was all-frozen, so we have to recheck; but
+				 * in this case an approximate answer is OK.
+				 */
+				if (aggressive || VM_ALL_FROZEN(onerel, blkno, &vmbuffer))
+					vacrelstats->frozenskipped_pages++;
 				continue;
+			}

Hm. This indeed seems a bit tricky. Not sure how to make it easier
though without just ripping out the SKIP_PAGES_THRESHOLD stuff.

Hm. This also doubles the number of VM accesses. While I guess that's
not noticeable most of the time, it's still not nice; especially when a
large relation is entirely frozen, because it'll mean we'll sequentially
go through the visibilityma twice.

I wondered for a minute whether #14057 could cause really bad issues
here
/messages/by-id/20160331103739.8956.94469@wrigleys.postgresql.org
but I don't see it being more relevant here.

Andres

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

#5Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
Re: Reviewing freeze map code

Hi,

On 2016-05-02 14:48:18 -0700, Andres Freund wrote:

7087166 pg_upgrade: Convert old visibility map format to new format.

+const char *
+rewriteVisibilityMap(const char *fromfile, const char *tofile, bool force)
...
+	while ((bytesRead = read(src_fd, buffer, BLCKSZ)) == BLCKSZ)
+	{
..

Uh, shouldn't we actually fail if we read incompletely? Rather than
silently ignoring the problem? Ok, this causes no corruption, but it
indicates that something went significantly wrong.

+			char		new_vmbuf[BLCKSZ];
+			char	   *new_cur = new_vmbuf;
+			bool		empty = true;
+			bool		old_lastpart;
+
+			/* Copy page header in advance */
+			memcpy(new_vmbuf, &pageheader, SizeOfPageHeaderData);

Shouldn't we zero out new_vmbuf? Afaics we're not necessarily zeroing it
with old_lastpart && !empty, right?

+	if ((dst_fd = open(tofile, O_RDWR | O_CREAT | (force ? 0 : O_EXCL), S_IRUSR | S_IWUSR)) < 0)
+	{
+		close(src_fd);
+		return getErrorText();
+	}

I know you guys copied this, but what's the force thing about?
Expecially as it's always set to true by the callers (i.e. what is the
parameter even about?)? Wouldn't we at least have to specify O_TRUNC in
the force case?

+ old_cur += BITS_PER_HEAPBLOCK_OLD;
+ new_cur += BITS_PER_HEAPBLOCK;

I'm not sure I'm understanding the point of the BITS_PER_HEAPBLOCK_OLD
stuff - as long as it's hardcoded into rewriteVisibilityMap() we'll not
be able to have differing ones anyway, should we decide to add a third
bit?

- Andres

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

#6Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#2)
Re: Reviewing freeze map code

On Mon, May 2, 2016 at 8:25 PM, Andres Freund <andres@anarazel.de> wrote:

+ * heap_tuple_needs_eventual_freeze
+ *
+ * Check to see whether any of the XID fields of a tuple (xmin, xmax, xvac)
+ * will eventually require freezing.  Similar to heap_tuple_needs_freeze,
+ * but there's no cutoff, since we're trying to figure out whether freezing
+ * will ever be needed, not whether it's needed now.
+ */
+bool
+heap_tuple_needs_eventual_freeze(HeapTupleHeader tuple)

Wouldn't redefining this to heap_tuple_is_frozen() and then inverting the
checks be easier to understand?

I thought it much safer to keep this as close to a copy of
heap_tuple_needs_freeze() as possible. Copying a function and
inverting all of the return values is much more likely to introduce
bugs, IME.

+       /*
+        * If xmax is a valid xact or multixact, this tuple is also not frozen.
+        */
+       if (tuple->t_infomask & HEAP_XMAX_IS_MULTI)
+       {
+               MultiXactId multi;
+
+               multi = HeapTupleHeaderGetRawXmax(tuple);
+               if (MultiXactIdIsValid(multi))
+                       return true;
+       }

Hm. What's the test inside the if() for? There shouldn't be any case
where xmax is invalid if HEAP_XMAX_IS_MULTI is set. Now there's a
check like that outside of this commit, but it seems strange to me
(Alvaro, perhaps you could comment on this?).

Here again I was copying existing code, with appropriate simplifications.

+ *
+ * Clearing both visibility map bits is not separately WAL-logged.  The callers
* must make sure that whenever a bit is cleared, the bit is cleared on WAL
* replay of the updating operation as well.

I think including "both" here makes things less clear, because it
differentiates clearing one bit from clearing both. There's no practical
differentce atm, but still.

I agree.

*
* VACUUM will normally skip pages for which the visibility map bit is set;
* such pages can't contain any dead tuples and therefore don't need vacuuming.
- * The visibility map is not used for anti-wraparound vacuums, because
- * an anti-wraparound vacuum needs to freeze tuples and observe the latest xid
- * present in the table, even on pages that don't have any dead tuples.
*

I think the remaining sentence isn't entirely accurate, there's now more
than one bit, and they're different with regard to scan_all/!scan_all
vacuums (or will be - maybe this updated further in a later commit? But
if so, that sentence shouldn't yet be removed...).

We can adjust the language, but I don't really see a big problem here.

-/* Number of heap blocks we can represent in one byte. */
-#define HEAPBLOCKS_PER_BYTE 8
-
Hm, why was this moved to the header? Sounds like something the outside
shouldn't care about.

Oh... yeah. Let's undo that.

#define HEAPBLK_TO_MAPBIT(x) (((x) % HEAPBLOCKS_PER_BYTE) * BITS_PER_HEAPBLOCK)

Hm. This isn't really a mapping to an individual bit anymore - but I
don't really have a better name in mind. Maybe TO_OFFSET?

Well, it sorta is... but we could change it, I suppose.

+static const uint8 number_of_ones_for_visible[256] = {
...
+};
+static const uint8 number_of_ones_for_frozen[256] = {
...
};

Did somebody verify the new contents are correct?

I admit that I didn't. It seemed like an unlikely place for a goof,
but I guess we should verify.

/*
- *     visibilitymap_clear - clear a bit in visibility map
+ *     visibilitymap_clear - clear all bits in visibility map
*

This seems rather easy to misunderstand, as this really only clears all
the bits for one page, not actually all the bits.

We could change "in" to "for one page in the".

* the bit for heapBlk, or InvalidBuffer. The caller is responsible for
- * releasing *buf after it's done testing and setting bits.
+ * releasing *buf after it's done testing and setting bits, and must pass flags
+ * for which it needs to check the value in visibility map.
*
* NOTE: This function is typically called without a lock on the heap page,
* so somebody else could change the bit just after we look at it.  In fact,
@@ -327,17 +351,16 @@ visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf,

I'm not seing what flags the above comment change is referring to?

Ugh. I think that's leftover cruft from an earlier patch version that
should have been excised from what got committed.

/*
-        * A single-bit read is atomic.  There could be memory-ordering effects
+        * A single byte read is atomic.  There could be memory-ordering effects
* here, but for performance reasons we make it the caller's job to worry
* about that.
*/
-       result = (map[mapByte] & (1 << mapBit)) ? true : false;
-
-       return result;
+       return ((map[mapByte] >> mapBit) & VISIBILITYMAP_VALID_BITS);
}

Not a new issue, and *very* likely to be irrelevant in practice (given
the value is only referenced once): But there's really no guarantee
map[mapByte] is only read once here.

Meh. But we can fix if you want to.

-BlockNumber
-visibilitymap_count(Relation rel)
+void
+visibilitymap_count(Relation rel, BlockNumber *all_visible, BlockNumber *all_frozen)

Not really a new issue again: The parameter types (previously return
type) to this function seem wrong to me.

Not this patch's job to tinker.

@@ -1934,5 +1992,14 @@ heap_page_is_all_visible(Relation rel, Buffer buf, TransactionId *visibility_cut
}
+       /*
+        * We don't bother clearing *all_frozen when the page is discovered not
+        * to be all-visible, so do that now if necessary.  The page might fail
+        * to be all-frozen for other reasons anyway, but if it's not all-visible,
+        * then it definitely isn't all-frozen.
+        */
+       if (!all_visible)
+               *all_frozen = false;
+

Why don't we just set *all_frozen to false when appropriate? It'd be
just as many lines and probably easier to understand?

I thought that looked really easy to mess up, either now or down the
road. This way seemed more solid to me. That's a judgement call, of
course.

+               /*
+                * If the page is marked as all-visible but not all-frozen, we should
+                * so mark it.  Note that all_frozen is only valid if all_visible is
+                * true, so we must check both.
+                */

This kinda seems to imply that all-visible implies all_frozen. Also, why
has that block been added to the end of the if/else if chain? Seems like
it belongs below the (all_visible && !all_visible_according_to_vm) block.

We can adjust the comment a bit to make it more clear, if you like,
but I doubt it's going to cause serious misunderstanding. As for the
placement, the reason I put it at the end is because I figured that we
did not want to mark it all-frozen if any of the "oh crap, emit a
warning" cases applied.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

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

#7Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#4)
Re: Reviewing freeze map code

On Wed, May 4, 2016 at 8:08 PM, Andres Freund <andres@anarazel.de> wrote:

On 2016-05-02 14:48:18 -0700, Andres Freund wrote:

77a1d1e Department of second thoughts: remove PD_ALL_FROZEN.

Nothing to say here.

fd31cd2 Don't vacuum all-frozen pages.

Hm. I do wonder if it's going to bite us that we don't have a way to
actually force vacuuming of the whole table (besides manually rm'ing the
VM). I've more than once seen VACUUM used to try to do some integrity
checking of the database. How are we actually going to test that the
feature works correctly? They'd have to write checks ontop of
pg_visibility to see whether things are borked.

Let's add VACUUM (FORCE) or something like that.

/*
* Compute whether we actually scanned the whole relation. If we did, we
* can adjust relfrozenxid and relminmxid.
*
* NB: We need to check this before truncating the relation, because that
* will change ->rel_pages.
*/

Comment is out-of-date now.

OK.

-               if (blkno == next_not_all_visible_block)
+               if (blkno == next_unskippable_block)
{
-                       /* Time to advance next_not_all_visible_block */
-                       for (next_not_all_visible_block++;
-                                next_not_all_visible_block < nblocks;
-                                next_not_all_visible_block++)
+                       /* Time to advance next_unskippable_block */
+                       for (next_unskippable_block++;
+                                next_unskippable_block < nblocks;
+                                next_unskippable_block++)

Hm. So we continue with the course of re-processing pages, even if
they're marked all-frozen. For all-visible there at least can be a
benefit by freezing earlier, but for all-frozen pages there's really no
point. I don't really buy the arguments for the skipping logic. But
even disregarding that, maybe we should skip processing a block if it's
all-frozen (without preventing the page from being read?); as there's no
possible benefit? Acquring the exclusive/content lock and stuff is far
from free.

I wanted to tinker with this logic as little as possible in the
interest of ending up with something that worked. I would not have
written it this way.

Not really related to this patch, but the FORCE_CHECK_PAGE is rather
ugly.

+1.

+                       /*
+                        * The current block is potentially skippable; if we've seen a
+                        * long enough run of skippable blocks to justify skipping it, and
+                        * we're not forced to check it, then go ahead and skip.
+                        * Otherwise, the page must be at least all-visible if not
+                        * all-frozen, so we can set all_visible_according_to_vm = true.
+                        */
+                       if (skipping_blocks && !FORCE_CHECK_PAGE())
+                       {
+                               /*
+                                * Tricky, tricky.  If this is in aggressive vacuum, the page
+                                * must have been all-frozen at the time we checked whether it
+                                * was skippable, but it might not be any more.  We must be
+                                * careful to count it as a skipped all-frozen page in that
+                                * case, or else we'll think we can't update relfrozenxid and
+                                * relminmxid.  If it's not an aggressive vacuum, we don't
+                                * know whether it was all-frozen, so we have to recheck; but
+                                * in this case an approximate answer is OK.
+                                */
+                               if (aggressive || VM_ALL_FROZEN(onerel, blkno, &vmbuffer))
+                                       vacrelstats->frozenskipped_pages++;
continue;
+                       }

Hm. This indeed seems a bit tricky. Not sure how to make it easier
though without just ripping out the SKIP_PAGES_THRESHOLD stuff.

Yep, I had the same problem.

Hm. This also doubles the number of VM accesses. While I guess that's
not noticeable most of the time, it's still not nice; especially when a
large relation is entirely frozen, because it'll mean we'll sequentially
go through the visibilityma twice.

Compared to what we're saving, that's obviously a trivial cost.
That's not to say that we might not want to improve it, but it's
hardly a disaster.

In short: wah, wah, wah.

I wondered for a minute whether #14057 could cause really bad issues
here
/messages/by-id/20160331103739.8956.94469@wrigleys.postgresql.org
but I don't see it being more relevant here.

I don't really understand what the concern is here, but if it's not a
problem, let's not spend time trying to clarify.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

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

#8Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#5)
Re: Reviewing freeze map code

On Thu, May 5, 2016 at 2:20 PM, Andres Freund <andres@anarazel.de> wrote:

On 2016-05-02 14:48:18 -0700, Andres Freund wrote:

7087166 pg_upgrade: Convert old visibility map format to new format.

+const char *
+rewriteVisibilityMap(const char *fromfile, const char *tofile, bool force)
...
+       while ((bytesRead = read(src_fd, buffer, BLCKSZ)) == BLCKSZ)
+       {
..

Uh, shouldn't we actually fail if we read incompletely? Rather than
silently ignoring the problem? Ok, this causes no corruption, but it
indicates that something went significantly wrong.

Sure, that's reasonable.

+                       char            new_vmbuf[BLCKSZ];
+                       char       *new_cur = new_vmbuf;
+                       bool            empty = true;
+                       bool            old_lastpart;
+
+                       /* Copy page header in advance */
+                       memcpy(new_vmbuf, &pageheader, SizeOfPageHeaderData);

Shouldn't we zero out new_vmbuf? Afaics we're not necessarily zeroing it
with old_lastpart && !empty, right?

Oh, dear. That seems like a possible data corruption bug. Maybe we'd
better fix that right away (although I don't actually have time before
the wrap).

+       if ((dst_fd = open(tofile, O_RDWR | O_CREAT | (force ? 0 : O_EXCL), S_IRUSR | S_IWUSR)) < 0)
+       {
+               close(src_fd);
+               return getErrorText();
+       }

I know you guys copied this, but what's the force thing about?
Expecially as it's always set to true by the callers (i.e. what is the
parameter even about?)? Wouldn't we at least have to specify O_TRUNC in
the force case?

I just work here.

+                               old_cur += BITS_PER_HEAPBLOCK_OLD;
+                               new_cur += BITS_PER_HEAPBLOCK;

I'm not sure I'm understanding the point of the BITS_PER_HEAPBLOCK_OLD
stuff - as long as it's hardcoded into rewriteVisibilityMap() we'll not
be able to have differing ones anyway, should we decide to add a third
bit?

I think that's just a matter of style.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

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

#9Joshua D. Drake
jd@commandprompt.com
In reply to: Robert Haas (#7)
Re: Reviewing freeze map code

On 05/06/2016 01:40 PM, Robert Haas wrote:

On Wed, May 4, 2016 at 8:08 PM, Andres Freund <andres@anarazel.de> wrote:

On 2016-05-02 14:48:18 -0700, Andres Freund wrote:

77a1d1e Department of second thoughts: remove PD_ALL_FROZEN.

Nothing to say here.

fd31cd2 Don't vacuum all-frozen pages.

Hm. I do wonder if it's going to bite us that we don't have a way to
actually force vacuuming of the whole table (besides manually rm'ing the
VM). I've more than once seen VACUUM used to try to do some integrity
checking of the database. How are we actually going to test that the
feature works correctly? They'd have to write checks ontop of
pg_visibility to see whether things are borked.

Let's add VACUUM (FORCE) or something like that.

This is actually inverted. Vacuum by default should vacuum the entire
relation, however if we are going to keep the existing behavior of this
patch, VACUUM (FROZEN) seems to be better than (FORCE)?

Sincerely,

JD

--
Command Prompt, Inc. http://the.postgres.company/
+1-503-667-4564
PostgreSQL Centered full stack support, consulting and development.
Everyone appreciates your honesty, until you are honest with them.

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

#10Andres Freund
andres@anarazel.de
In reply to: Joshua D. Drake (#9)
Re: Reviewing freeze map code

On 2016-05-06 13:48:09 -0700, Joshua D. Drake wrote:

On 05/06/2016 01:40 PM, Robert Haas wrote:

On Wed, May 4, 2016 at 8:08 PM, Andres Freund <andres@anarazel.de> wrote:

On 2016-05-02 14:48:18 -0700, Andres Freund wrote:

77a1d1e Department of second thoughts: remove PD_ALL_FROZEN.

Nothing to say here.

fd31cd2 Don't vacuum all-frozen pages.

Hm. I do wonder if it's going to bite us that we don't have a way to
actually force vacuuming of the whole table (besides manually rm'ing the
VM). I've more than once seen VACUUM used to try to do some integrity
checking of the database. How are we actually going to test that the
feature works correctly? They'd have to write checks ontop of
pg_visibility to see whether things are borked.

Let's add VACUUM (FORCE) or something like that.

Yes, that makes sense.

This is actually inverted. Vacuum by default should vacuum the entire
relation

What? Why on earth would that be a good idea? Not to speak of hte fact
that that's not been the case since ~8.4?

,however if we are going to keep the existing behavior of this
patch, VACUUM (FROZEN) seems to be better than (FORCE)?

There already is FREEZE - meaning something different - so I doubt it.

Andres

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

#11Joshua D. Drake
jd@commandprompt.com
In reply to: Andres Freund (#10)
Re: Reviewing freeze map code

On 05/06/2016 01:50 PM, Andres Freund wrote:

Let's add VACUUM (FORCE) or something like that.

Yes, that makes sense.

This is actually inverted. Vacuum by default should vacuum the entire
relation

What? Why on earth would that be a good idea? Not to speak of hte fact
that that's not been the case since ~8.4?

Sorry, I just meant the default behavior shouldn't change but I do agree
that we need the ability to keep the same behavior.

,however if we are going to keep the existing behavior of this
patch, VACUUM (FROZEN) seems to be better than (FORCE)?

There already is FREEZE - meaning something different - so I doubt it.

Yeah I thought about that, it is the word "FORCE" that bothers me. When
you use FORCE there is an assumption that no matter what, it plows
through (think rm -f). So if we don't use FROZEN, that's cool but FORCE
doesn't work either.

Sincerely,

JD

--
Command Prompt, Inc. http://the.postgres.company/
+1-503-667-4564
PostgreSQL Centered full stack support, consulting and development.
Everyone appreciates your honesty, until you are honest with them.

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

#12Stephen Frost
sfrost@snowman.net
In reply to: Joshua D. Drake (#11)
Re: Reviewing freeze map code

* Joshua D. Drake (jd@commandprompt.com) wrote:

Yeah I thought about that, it is the word "FORCE" that bothers me.
When you use FORCE there is an assumption that no matter what, it
plows through (think rm -f). So if we don't use FROZEN, that's cool
but FORCE doesn't work either.

Isn't that exactly what this FORCE option being contemplated would do
though? Plow through the entire relation, regardless of what the VM
says is all frozen or not?

Seems like FORCE is a good word for that to me.

Thanks!

Stephen

#13Andres Freund
andres@anarazel.de
In reply to: Joshua D. Drake (#11)
Re: Reviewing freeze map code

On 2016-05-06 13:54:09 -0700, Joshua D. Drake wrote:

On 05/06/2016 01:50 PM, Andres Freund wrote:

Let's add VACUUM (FORCE) or something like that.

Yes, that makes sense.

This is actually inverted. Vacuum by default should vacuum the entire
relation

What? Why on earth would that be a good idea? Not to speak of hte fact
that that's not been the case since ~8.4?

Sorry, I just meant the default behavior shouldn't change but I do agree
that we need the ability to keep the same behavior.

Which default behaviour shouldn't change? The one in master where we
skip known frozen pages? Or the released branches where can't skip those?

,however if we are going to keep the existing behavior of this
patch, VACUUM (FROZEN) seems to be better than (FORCE)?

There already is FREEZE - meaning something different - so I doubt it.

Yeah I thought about that, it is the word "FORCE" that bothers me. When you
use FORCE there is an assumption that no matter what, it plows through
(think rm -f). So if we don't use FROZEN, that's cool but FORCE doesn't work
either.

SCANALL?

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

#14Joshua D. Drake
jd@commandprompt.com
In reply to: Stephen Frost (#12)
Re: Reviewing freeze map code

On 05/06/2016 01:58 PM, Stephen Frost wrote:

* Joshua D. Drake (jd@commandprompt.com) wrote:

Yeah I thought about that, it is the word "FORCE" that bothers me.
When you use FORCE there is an assumption that no matter what, it
plows through (think rm -f). So if we don't use FROZEN, that's cool
but FORCE doesn't work either.

Isn't that exactly what this FORCE option being contemplated would do
though? Plow through the entire relation, regardless of what the VM
says is all frozen or not?

Seems like FORCE is a good word for that to me.

Except that we aren't FORCING a vacuum. That is the part I have
contention with. To me, FORCE means:

No matter what else is happening, we are vacuuming this relation (think
locks).

But I am also not going to dig in my heals. If that is truly what
-hackers come up with, thank you at least considering what I said.

Sincerely,

JD

Thanks!

Stephen

--
Command Prompt, Inc. http://the.postgres.company/
+1-503-667-4564
PostgreSQL Centered full stack support, consulting and development.
Everyone appreciates your honesty, until you are honest with them.

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

#15Josh Berkus
josh@agliodbs.com
In reply to: Andres Freund (#1)
Re: Reviewing freeze map code

On 05/06/2016 01:58 PM, Andres Freund wrote:

On 2016-05-06 13:54:09 -0700, Joshua D. Drake wrote:

On 05/06/2016 01:50 PM, Andres Freund wrote:

There already is FREEZE - meaning something different - so I doubt it.

Yeah I thought about that, it is the word "FORCE" that bothers me. When you
use FORCE there is an assumption that no matter what, it plows through
(think rm -f). So if we don't use FROZEN, that's cool but FORCE doesn't work
either.

SCANALL?

VACUUM THEWHOLEDAMNTHING

--
--
Josh Berkus
Red Hat OSAS
(any opinions are my own)

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

#16Joshua D. Drake
jd@commandprompt.com
In reply to: Josh Berkus (#15)
Re: Reviewing freeze map code

On 05/06/2016 02:01 PM, Josh berkus wrote:

On 05/06/2016 01:58 PM, Andres Freund wrote:

On 2016-05-06 13:54:09 -0700, Joshua D. Drake wrote:

On 05/06/2016 01:50 PM, Andres Freund wrote:

There already is FREEZE - meaning something different - so I doubt it.

Yeah I thought about that, it is the word "FORCE" that bothers me. When you
use FORCE there is an assumption that no matter what, it plows through
(think rm -f). So if we don't use FROZEN, that's cool but FORCE doesn't work
either.

SCANALL?

VACUUM THEWHOLEDAMNTHING

I know that would never fly but damn if that wouldn't be an awesome
keyword for VACUUM.

JD

--
Command Prompt, Inc. http://the.postgres.company/
+1-503-667-4564
PostgreSQL Centered full stack support, consulting and development.
Everyone appreciates your honesty, until you are honest with them.

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

#17Stephen Frost
sfrost@snowman.net
In reply to: Josh Berkus (#15)
Re: Reviewing freeze map code

* Josh berkus (josh@agliodbs.com) wrote:

On 05/06/2016 01:58 PM, Andres Freund wrote:

On 2016-05-06 13:54:09 -0700, Joshua D. Drake wrote:

On 05/06/2016 01:50 PM, Andres Freund wrote:

There already is FREEZE - meaning something different - so I doubt it.

Yeah I thought about that, it is the word "FORCE" that bothers me. When you
use FORCE there is an assumption that no matter what, it plows through
(think rm -f). So if we don't use FROZEN, that's cool but FORCE doesn't work
either.

SCANALL?

VACUUM THEWHOLEDAMNTHING

+100

(hahahaha)

Thanks!

Stephen

#18Andres Freund
andres@anarazel.de
In reply to: Joshua D. Drake (#16)
Re: Reviewing freeze map code

On 2016-05-06 14:03:11 -0700, Joshua D. Drake wrote:

On 05/06/2016 02:01 PM, Josh berkus wrote:

On 05/06/2016 01:58 PM, Andres Freund wrote:

On 2016-05-06 13:54:09 -0700, Joshua D. Drake wrote:

On 05/06/2016 01:50 PM, Andres Freund wrote:

There already is FREEZE - meaning something different - so I doubt it.

Yeah I thought about that, it is the word "FORCE" that bothers me. When you
use FORCE there is an assumption that no matter what, it plows through
(think rm -f). So if we don't use FROZEN, that's cool but FORCE doesn't work
either.

SCANALL?

VACUUM THEWHOLEDAMNTHING

I know that would never fly but damn if that wouldn't be an awesome keyword
for VACUUM.

It bothers me more than it probably should: Nobdy tests, reviews,
whatever a complex patch with significant data-loss potential. But as
soon somebody dares to mention an option name...

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

#19Joshua D. Drake
jd@commandprompt.com
In reply to: Stephen Frost (#17)
Re: Reviewing freeze map code

On 05/06/2016 02:03 PM, Stephen Frost wrote:

VACUUM THEWHOLEDAMNTHING

+100

(hahahaha)

You know what? Why not? Seriously? We aren't product. This is supposed
to be a bit fun. Let's have some fun with it? It would be so easy to
turn that into a positive advocacy opportunity.

JD

--
Command Prompt, Inc. http://the.postgres.company/
+1-503-667-4564
PostgreSQL Centered full stack support, consulting and development.
Everyone appreciates your honesty, until you are honest with them.

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

#20Josh Berkus
josh@agliodbs.com
In reply to: Andres Freund (#1)
Re: Reviewing freeze map code

On 05/06/2016 02:08 PM, Andres Freund wrote:

It bothers me more than it probably should: Nobdy tests, reviews,
whatever a complex patch with significant data-loss potential. But as
soon somebody dares to mention an option name...

Definitely more than it should, because it's gonna happen *every* time.

https://en.wikipedia.org/wiki/Law_of_triviality

--
--
Josh Berkus
Red Hat OSAS
(any opinions are my own)

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

#21Andres Freund
andres@anarazel.de
In reply to: Josh Berkus (#20)
#22Josh Berkus
josh@agliodbs.com
In reply to: Joshua D. Drake (#9)
#23Joshua D. Drake
jd@commandprompt.com
In reply to: Andres Freund (#18)
#24Andres Freund
andres@anarazel.de
In reply to: Josh Berkus (#22)
#25Andres Freund
andres@anarazel.de
In reply to: Joshua D. Drake (#23)
#26Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Joshua D. Drake (#9)
#27Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Andres Freund (#25)
#28Joshua D. Drake
jd@commandprompt.com
In reply to: Andres Freund (#25)
#29Andres Freund
andres@anarazel.de
In reply to: Joshua D. Drake (#28)
#30Andres Freund
andres@anarazel.de
In reply to: Alvaro Herrera (#27)
#31Joshua D. Drake
jd@commandprompt.com
In reply to: Andres Freund (#29)
#32Andres Freund
andres@anarazel.de
In reply to: Alvaro Herrera (#26)
In reply to: Andres Freund (#30)
#34Thomas Munro
thomas.munro@gmail.com
In reply to: Robert Haas (#6)
#35Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#34)
#36Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alvaro Herrera (#27)
#37Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Joshua D. Drake (#14)
#38Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#37)
#39Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#38)
#40Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andres Freund (#1)
#41Robert Haas
robertmhaas@gmail.com
In reply to: Masahiko Sawada (#39)
#42Ants Aasma
ants.aasma@cybertec.at
In reply to: Andres Freund (#1)
#43Robert Haas
robertmhaas@gmail.com
In reply to: Ants Aasma (#42)
#44Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#43)
#45Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Andres Freund (#24)
#46Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Peter Geoghegan (#33)
#47Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Joshua D. Drake (#19)
#48Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Jim Nasby (#46)
#49Robert Haas
robertmhaas@gmail.com
In reply to: Masahiko Sawada (#44)
#50Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#49)
#51Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Masahiko Sawada (#50)
#52Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Alvaro Herrera (#51)
#53Joshua D. Drake
jd@commandprompt.com
In reply to: Alvaro Herrera (#51)
#54Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Joshua D. Drake (#53)
#55Vik Fearing
vik@postgresfriends.org
In reply to: Alvaro Herrera (#51)
#56Gavin Flower
GavinFlower@archidevsys.co.nz
In reply to: Vik Fearing (#55)
#57Robert Haas
robertmhaas@gmail.com
In reply to: Gavin Flower (#56)
#58David Steele
david@pgmasters.net
In reply to: Robert Haas (#57)
#59Robert Haas
robertmhaas@gmail.com
In reply to: David Steele (#58)
#60Joshua D. Drake
jd@commandprompt.com
In reply to: Robert Haas (#59)
#61Robert Haas
robertmhaas@gmail.com
In reply to: Joshua D. Drake (#60)
#62Victor Yegorov
vyegorov@gmail.com
In reply to: Robert Haas (#61)
#63Joe Conway
mail@joeconway.com
In reply to: Victor Yegorov (#62)
#64Jeff Janes
jeff.janes@gmail.com
In reply to: Joe Conway (#63)
In reply to: Jeff Janes (#64)
#66Josh Berkus
josh@agliodbs.com
In reply to: Alvaro Herrera (#51)
#67Tom Lane
tgl@sss.pgh.pa.us
In reply to: Josh Berkus (#66)
#68Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#67)
#69Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#68)
#70Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#69)
#71Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Andres Freund (#68)
In reply to: Alvaro Herrera (#71)
#73Noah Misch
noah@leadboat.com
In reply to: Robert Haas (#8)
#74Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Noah Misch (#73)
#75Jeff Janes
jeff.janes@gmail.com
In reply to: Alvaro Herrera (#71)
#76Michael Paquier
michael@paquier.xyz
In reply to: Jeff Janes (#75)
#77Robert Haas
robertmhaas@gmail.com
In reply to: Noah Misch (#73)
#78Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#6)
#79Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#7)
#80Robert Haas
robertmhaas@gmail.com
In reply to: Masahiko Sawada (#78)
#81Robert Haas
robertmhaas@gmail.com
In reply to: Masahiko Sawada (#79)
#82Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#81)
#83Robert Haas
robertmhaas@gmail.com
In reply to: Masahiko Sawada (#82)
#84Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#83)
#85Robert Haas
robertmhaas@gmail.com
In reply to: Masahiko Sawada (#84)
#86Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#8)
#87Robert Haas
robertmhaas@gmail.com
In reply to: Masahiko Sawada (#86)
#88Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#87)
#89Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#85)
#90Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#89)
#91Michael Paquier
michael@paquier.xyz
In reply to: Masahiko Sawada (#90)
#92Robert Haas
robertmhaas@gmail.com
In reply to: Michael Paquier (#91)
#93Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#92)
#94Robert Haas
robertmhaas@gmail.com
In reply to: Masahiko Sawada (#88)
#95Tom Lane
tgl@sss.pgh.pa.us
In reply to: Masahiko Sawada (#90)
#96Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#94)
#97Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#95)
#98Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#97)
#99Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#87)
#100Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#97)
#101Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#100)
#102Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#101)
#103Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#92)
#104Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#103)
#105Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#104)
#106Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#104)
#107Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#105)
#108Stephen Frost
sfrost@snowman.net
In reply to: Robert Haas (#107)
#109Andres Freund
andres@anarazel.de
In reply to: Stephen Frost (#108)
#110Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#109)
#111Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#110)
#112Stephen Frost
sfrost@snowman.net
In reply to: Andres Freund (#111)
#113Andres Freund
andres@anarazel.de
In reply to: Stephen Frost (#112)
#114Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#111)
#115Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#109)
In reply to: Andres Freund (#109)
#117Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#113)
#118Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#114)
#119Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#118)
#120Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#117)
#121Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#119)
#122Amit Kapila
amit.kapila16@gmail.com
In reply to: Robert Haas (#119)
#123Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#122)
#124Andres Freund
andres@anarazel.de
In reply to: Amit Kapila (#122)
#125Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Peter Geoghegan (#116)
#126Robert Haas
robertmhaas@gmail.com
In reply to: Amit Kapila (#122)
#127Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#123)
#128Amit Kapila
amit.kapila16@gmail.com
In reply to: Robert Haas (#126)
#129Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#124)
#130Andres Freund
andres@anarazel.de
In reply to: Amit Kapila (#129)
#131Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#127)
#132Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#130)
#133Robert Haas
robertmhaas@gmail.com
In reply to: Amit Kapila (#132)
#134Amit Kapila
amit.kapila16@gmail.com
In reply to: Robert Haas (#133)
#135Amit Kapila
amit.kapila16@gmail.com
In reply to: Robert Haas (#133)
#136Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#135)
#137Robert Haas
robertmhaas@gmail.com
In reply to: Amit Kapila (#136)
#138Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#137)
#139Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#137)
#140Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#139)
#141Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#140)
#142Andres Freund
andres@anarazel.de
In reply to: Amit Kapila (#141)
#143Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#142)
#144Andres Freund
andres@anarazel.de
In reply to: Amit Kapila (#143)
#145Amit Kapila
amit.kapila16@gmail.com
In reply to: Robert Haas (#137)
#146Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#137)
#147Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#144)
#148Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#144)
#149Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#148)
#150Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#149)
#151Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#150)
#152Amit Kapila
amit.kapila16@gmail.com
In reply to: Robert Haas (#149)
#153Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#151)
#154Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#153)
#155Thomas Munro
thomas.munro@gmail.com
In reply to: Robert Haas (#153)
#156Robert Haas
robertmhaas@gmail.com
In reply to: Thomas Munro (#155)
#157Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#156)
#158Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#157)
#159Thomas Munro
thomas.munro@gmail.com
In reply to: Robert Haas (#158)
#160Thomas Munro
thomas.munro@gmail.com
In reply to: Thomas Munro (#159)
#161Robert Haas
robertmhaas@gmail.com
In reply to: Thomas Munro (#160)
#162Amit Kapila
amit.kapila16@gmail.com
In reply to: Robert Haas (#161)
#163Robert Haas
robertmhaas@gmail.com
In reply to: Amit Kapila (#162)
#164Amit Kapila
amit.kapila16@gmail.com
In reply to: Robert Haas (#163)
#165Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#161)
#166Robert Haas
robertmhaas@gmail.com
In reply to: Masahiko Sawada (#165)
#167Robert Haas
robertmhaas@gmail.com
In reply to: Amit Kapila (#164)
#168Noah Misch
noah@leadboat.com
In reply to: Robert Haas (#161)
#169Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#161)
#170Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#169)
#171Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#170)
#172Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#171)
#173Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#172)
#174Thomas Munro
thomas.munro@gmail.com
In reply to: Noah Misch (#168)
#175Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#169)
#176Thomas Munro
thomas.munro@gmail.com
In reply to: Amit Kapila (#175)
#177Thomas Munro
thomas.munro@gmail.com
In reply to: Amit Kapila (#175)
#178Andres Freund
andres@anarazel.de
In reply to: Amit Kapila (#175)
#179Amit Kapila
amit.kapila16@gmail.com
In reply to: Thomas Munro (#176)
#180Amit Kapila
amit.kapila16@gmail.com
In reply to: Thomas Munro (#177)
#181Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#178)
#182Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#173)
#183Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#182)
#184Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#178)
#185Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#183)
#186Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#184)
#187Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#186)
#188Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#187)
#189Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#188)
#190Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#189)
#191Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#190)
#192Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#191)
#193Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Andres Freund (#192)
#194Andres Freund
andres@anarazel.de
In reply to: Alvaro Herrera (#193)
#195Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#194)
#196Noah Misch
noah@leadboat.com
In reply to: Thomas Munro (#174)
#197Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andres Freund (#173)
#198Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#197)
#199Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#195)
#200Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#199)
#201Andres Freund
andres@anarazel.de
In reply to: Amit Kapila (#200)
#202Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#201)
#203Andres Freund
andres@anarazel.de
In reply to: Amit Kapila (#202)
#204Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#203)
#205Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#204)
#206Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#205)
#207Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#206)
#208Robert Haas
robertmhaas@gmail.com
In reply to: Masahiko Sawada (#207)
#209Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#208)
#210Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Andres Freund (#209)
#211Andres Freund
andres@anarazel.de
In reply to: Jim Nasby (#210)
#212Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Andres Freund (#211)
#213Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#209)
#214Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#207)
#215Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#214)
#216Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#213)
#217Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#216)
#218Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#215)
#219Andres Freund
andres@anarazel.de
In reply to: Masahiko Sawada (#218)
#220Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#219)
#221Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andres Freund (#219)
#222Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#219)
#223Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#222)
#224Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#223)
#225Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#222)
#226Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#225)
#227Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#226)
#228Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#227)
#229Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#221)
#230Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#229)
#231Andres Freund
andres@anarazel.de
In reply to: Masahiko Sawada (#230)
#232Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#231)
#233Andres Freund
andres@anarazel.de
In reply to: Amit Kapila (#232)
#234Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#231)
#235Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#234)
#236Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#231)
#237Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#236)
#238Tom Lane
tgl@sss.pgh.pa.us
In reply to: Amit Kapila (#237)
#239Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#238)
#240Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#239)
#241Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#240)
#242Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#240)
#243Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#241)
#244Andres Freund
andres@anarazel.de
In reply to: Amit Kapila (#242)
#245Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#244)
#246Andres Freund
andres@anarazel.de
In reply to: Amit Kapila (#245)
#247Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#246)
#248Michael Paquier
michael@paquier.xyz
In reply to: Andres Freund (#235)
#249Amit Kapila
amit.kapila16@gmail.com
In reply to: Andres Freund (#246)
#250Robert Haas
robertmhaas@gmail.com
In reply to: Amit Kapila (#249)
#251Amit Kapila
amit.kapila16@gmail.com
In reply to: Robert Haas (#250)
#252Noah Misch
noah@leadboat.com
In reply to: Amit Kapila (#249)
#253Amit Kapila
amit.kapila16@gmail.com
In reply to: Noah Misch (#252)
#254Noah Misch
noah@leadboat.com
In reply to: Amit Kapila (#253)
#255Andres Freund
andres@anarazel.de
In reply to: Noah Misch (#254)
#256Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#255)