Skip to content

Commit 3afd75e

Browse files
committed
Remove dubious micro-optimization in ckpt_buforder_comparator().
It seems incorrect to assume that the list of CkptSortItems can never contain duplicate page numbers: concurrent activity could result in some page getting dropped from a low-numbered buffer and later loaded into a high-numbered buffer while BufferSync is scanning the buffer pool. If that happened, the comparator would give self-inconsistent results, potentially confusing qsort(). Saving one comparison step is not worth possibly getting the sort wrong. So far as I can tell, nothing would actually go wrong given our current implementation of qsort(). It might get a bit slower than expected if there were a large number of duplicates of one value, but that's surely a probability-epsilon case. Still, the comment is wrong, and if we ever switched to another sort implementation it might be less forgiving. In passing, avoid casting away const-ness of the argument pointers; I've not seen any compiler complaints from that, but it seems likely that some compilers would not like it. Back-patch to 9.6 where this code came in, just in case I've underestimated the possible consequences. Discussion: https://postgr.es/m/18437.1515607610@sss.pgh.pa.us
1 parent 2fd5809 commit 3afd75e

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

src/backend/storage/buffer/bufmgr.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4064,8 +4064,8 @@ local_buffer_write_error_callback(void *arg)
40644064
static int
40654065
rnode_comparator(const void *p1, const void *p2)
40664066
{
4067-
RelFileNode n1 = *(RelFileNode *) p1;
4068-
RelFileNode n2 = *(RelFileNode *) p2;
4067+
RelFileNode n1 = *(const RelFileNode *) p1;
4068+
RelFileNode n2 = *(const RelFileNode *) p2;
40694069

40704070
if (n1.relNode < n2.relNode)
40714071
return -1;
@@ -4174,8 +4174,8 @@ buffertag_comparator(const void *a, const void *b)
41744174
static int
41754175
ckpt_buforder_comparator(const void *pa, const void *pb)
41764176
{
4177-
const CkptSortItem *a = (CkptSortItem *) pa;
4178-
const CkptSortItem *b = (CkptSortItem *) pb;
4177+
const CkptSortItem *a = (const CkptSortItem *) pa;
4178+
const CkptSortItem *b = (const CkptSortItem *) pb;
41794179

41804180
/* compare tablespace */
41814181
if (a->tsId < b->tsId)
@@ -4195,8 +4195,10 @@ ckpt_buforder_comparator(const void *pa, const void *pb)
41954195
/* compare block number */
41964196
else if (a->blockNum < b->blockNum)
41974197
return -1;
4198-
else /* should not be the same block ... */
4198+
else if (a->blockNum > b->blockNum)
41994199
return 1;
4200+
/* equal page IDs are unlikely, but not impossible */
4201+
return 0;
42004202
}
42014203

42024204
/*

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy