Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3afd75e

Browse files
committed
Remove dubious micro-optimization in ckpt_buforder_comparator().
It seems incorrect to assume that the list of CkptSortItems can nevercontain duplicate page numbers: concurrent activity could result in somepage getting dropped from a low-numbered buffer and later loaded into ahigh-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 worthpossibly getting the sort wrong.So far as I can tell, nothing would actually go wrong given our currentimplementation of qsort(). It might get a bit slower than expectedif there were a large number of duplicates of one value, but that'ssurely a probability-epsilon case. Still, the comment is wrong,and if we ever switched to another sort implementation it might beless forgiving.In passing, avoid casting away const-ness of the argument pointers;I've not seen any compiler complaints from that, but it seems likelythat some compilers would not like it.Back-patch to 9.6 where this code came in, just in case I've underestimatedthe possible consequences.Discussion:https://postgr.es/m/18437.1515607610@sss.pgh.pa.us
1 parent2fd5809 commit3afd75e

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
staticint
40654065
rnode_comparator(constvoid*p1,constvoid*p2)
40664066
{
4067-
RelFileNoden1=*(RelFileNode*)p1;
4068-
RelFileNoden2=*(RelFileNode*)p2;
4067+
RelFileNoden1=*(constRelFileNode*)p1;
4068+
RelFileNoden2=*(constRelFileNode*)p2;
40694069

40704070
if (n1.relNode<n2.relNode)
40714071
return-1;
@@ -4174,8 +4174,8 @@ buffertag_comparator(const void *a, const void *b)
41744174
staticint
41754175
ckpt_buforder_comparator(constvoid*pa,constvoid*pb)
41764176
{
4177-
constCkptSortItem*a= (CkptSortItem*)pa;
4178-
constCkptSortItem*b= (CkptSortItem*)pb;
4177+
constCkptSortItem*a= (constCkptSortItem*)pa;
4178+
constCkptSortItem*b= (constCkptSortItem*)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
elseif (a->blockNum<b->blockNum)
41974197
return-1;
4198-
else/* should not be the same block ... */
4198+
elseif (a->blockNum>b->blockNum)
41994199
return1;
4200+
/* equal page IDs are unlikely, but not impossible */
4201+
return0;
42004202
}
42014203

42024204
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp