19.12.2024 15:10, Andrey M. Borodin wrote:
On 19 Dec 2024, at 15:37, Yura Sokolov <y.soko...@postgrespro.ru> wrote: So, there's no more than 8192 banks at the moment.OK, but still current type indicates bitwise usage, while struct member is used as a number.
Ok, I agree. Here's version with type change bits16 -> uint16.
From 4a16d64fe6eba042bfca7ff0b0d73ec8b749e6e0 Mon Sep 17 00:00:00 2001 From: Yura Sokolov <y.soko...@postgrespro.ru> Date: Tue, 10 Dec 2024 15:38:02 +0300 Subject: [PATCH v2] Fix SLRU bank selection. Due to code evolution, nbanks is not power of two any more. But still binary & were used to obtain bankno. --- src/backend/access/transam/slru.c | 6 +++--- src/include/access/slru.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c index e7f73bf4275..afedb5c039f 100644 --- a/src/backend/access/transam/slru.c +++ b/src/backend/access/transam/slru.c @@ -343,7 +343,7 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, ctl->shared = shared; ctl->sync_handler = sync_handler; ctl->long_segment_names = long_segment_names; - ctl->bank_mask = (nslots / SLRU_BANK_SIZE) - 1; + ctl->nbanks = nbanks; strlcpy(ctl->Dir, subdir, sizeof(ctl->Dir)); } @@ -606,7 +606,7 @@ SimpleLruReadPage_ReadOnly(SlruCtl ctl, int64 pageno, TransactionId xid) { SlruShared shared = ctl->shared; LWLock *banklock = SimpleLruGetBankLock(ctl, pageno); - int bankno = pageno & ctl->bank_mask; + int bankno = pageno % ctl->nbanks; int bankstart = bankno * SLRU_BANK_SIZE; int bankend = bankstart + SLRU_BANK_SIZE; @@ -1177,7 +1177,7 @@ SlruSelectLRUPage(SlruCtl ctl, int64 pageno) int bestinvalidslot = 0; /* keep compiler quiet */ int best_invalid_delta = -1; int64 best_invalid_page_number = 0; /* keep compiler quiet */ - int bankno = pageno & ctl->bank_mask; + int bankno = pageno % ctl->nbanks; int bankstart = bankno * SLRU_BANK_SIZE; int bankend = bankstart + SLRU_BANK_SIZE; diff --git a/src/include/access/slru.h b/src/include/access/slru.h index 97e612cd100..648e202ff54 100644 --- a/src/include/access/slru.h +++ b/src/include/access/slru.h @@ -129,9 +129,9 @@ typedef struct SlruCtlData SlruShared shared; /* - * Bitmask to determine bank number from page number. + * Number of banks to determine bank number from page number. */ - bits16 bank_mask; + uint16 nbanks; /* * If true, use long segment file names. Otherwise, use short file names. @@ -179,7 +179,7 @@ SimpleLruGetBankLock(SlruCtl ctl, int64 pageno) { int bankno; - bankno = pageno & ctl->bank_mask; + bankno = pageno % ctl->nbanks; return &(ctl->shared->bank_locks[bankno].lock); } -- 2.43.0