]> granicus.if.org Git - postgresql/commitdiff
Revert unintentional change in increasing usage count during pin of buffers,
authorTeodor Sigaev <teodor@sigaev.ru>
Mon, 20 Mar 2017 15:48:46 +0000 (18:48 +0300)
committerTeodor Sigaev <teodor@sigaev.ru>
Mon, 20 Mar 2017 15:48:46 +0000 (18:48 +0300)
this makes buffer access strategy have no effect.
Change was a part of commit 48354581a49c30f5757c203415aa8412d85b0f70 during 9.6
release cycle, so backpath to 9.6

Reported-by: Jim Nasby
Author: Alexander Korotkov
Reviewed-by: Jim Nasby, Andres Freund
https://commitfest.postgresql.org/13/1029/

src/backend/storage/buffer/bufmgr.c

index 2ca2ab9753c2613c47ffdac50d215f07956dcfd2..2109cbf8587fe68256b7f76bd23a02b0a6e5280d 100644 (file)
@@ -1595,9 +1595,21 @@ PinBuffer(BufferDesc *buf, BufferAccessStrategy strategy)
                        /* increase refcount */
                        buf_state += BUF_REFCOUNT_ONE;
 
-                       /* increase usagecount unless already max */
-                       if (BUF_STATE_GET_USAGECOUNT(buf_state) != BM_MAX_USAGE_COUNT)
-                               buf_state += BUF_USAGECOUNT_ONE;
+                       if (strategy == NULL)
+                       {
+                               /* Default case: increase usagecount unless already max. */
+                               if (BUF_STATE_GET_USAGECOUNT(buf_state) < BM_MAX_USAGE_COUNT)
+                                       buf_state += BUF_USAGECOUNT_ONE;
+                       }
+                       else
+                       {
+                               /*
+                                * Ring buffers shouldn't evict others from pool.  Thus we
+                                * don't make usagecount more than 1.
+                                */
+                               if (BUF_STATE_GET_USAGECOUNT(buf_state) == 0)
+                                       buf_state += BUF_USAGECOUNT_ONE;
+                       }
 
                        if (pg_atomic_compare_exchange_u32(&buf->state, &old_buf_state,
                                                                                           buf_state))