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

Commitc24a908

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 parent0126838 commitc24a908

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
@@ -4020,8 +4020,8 @@ local_buffer_write_error_callback(void *arg)
40204020
staticint
40214021
rnode_comparator(constvoid*p1,constvoid*p2)
40224022
{
4023-
RelFileNoden1=*(RelFileNode*)p1;
4024-
RelFileNoden2=*(RelFileNode*)p2;
4023+
RelFileNoden1=*(constRelFileNode*)p1;
4024+
RelFileNoden2=*(constRelFileNode*)p2;
40254025

40264026
if (n1.relNode<n2.relNode)
40274027
return-1;
@@ -4130,8 +4130,8 @@ buffertag_comparator(const void *a, const void *b)
41304130
staticint
41314131
ckpt_buforder_comparator(constvoid*pa,constvoid*pb)
41324132
{
4133-
constCkptSortItem*a= (CkptSortItem*)pa;
4134-
constCkptSortItem*b= (CkptSortItem*)pb;
4133+
constCkptSortItem*a= (constCkptSortItem*)pa;
4134+
constCkptSortItem*b= (constCkptSortItem*)pb;
41354135

41364136
/* compare tablespace */
41374137
if (a->tsId<b->tsId)
@@ -4151,8 +4151,10 @@ ckpt_buforder_comparator(const void *pa, const void *pb)
41514151
/* compare block number */
41524152
elseif (a->blockNum<b->blockNum)
41534153
return-1;
4154-
else/* should not be the same block ... */
4154+
elseif (a->blockNum>b->blockNum)
41554155
return1;
4156+
/* equal page IDs are unlikely, but not impossible */
4157+
return0;
41564158
}
41574159

41584160
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp