修改bufferdesc大小,提升性能

This commit is contained in:
cc_db_dev
2023-02-20 16:40:35 +08:00
parent f427d6a2ee
commit e88cef70c1
23 changed files with 182 additions and 163 deletions

View File

@ -322,7 +322,7 @@ inline bool dw_buf_valid_aio_finished(BufferDesc *buf_desc, uint32 buf_state)
return true;
}
return ((buf_state & BM_VALID) && ((buf_state & BM_DIRTY) || buf_desc->aio_in_progress));
return ((buf_state & BM_VALID) && ((buf_state & BM_DIRTY) || buf_desc->extra->aio_in_progress));
}
extern bool free_space_enough(int buf_id);

View File

@ -1846,7 +1846,7 @@ typedef struct knl_u_storage_context {
/* Pointers to shared state */
// struct BufferStrategyControl* StrategyControl;
int NLocBuffer; /* until buffers are initialized */
struct BufferDesc* LocalBufferDescriptors;
union BufferDescPadded* LocalBufferDescriptors;
Block* LocalBufferBlockPointers;
int32* LocalRefCount;
int nextFreeLocalBuf;

View File

@ -191,30 +191,35 @@ typedef struct {
* We use this same struct for local buffer headers, but the lock fields
* are not used and not all of the flag bits are useful either.
*/
typedef struct BufferDesc {
BufferTag tag; /* ID of page contained in buffer */
/* state of the tag, containing flags, refcount and usagecount */
pg_atomic_uint32 state;
typedef struct BufferDescExtra {
/* Cached physical location for segment-page storage, used for xlog */
uint8 seg_fileno;
BlockNumber seg_blockno;
/* below fields are used for incremental checkpoint */
pg_atomic_uint64 rec_lsn; /* recovery LSN */
volatile uint64 dirty_queue_loc; /* actual loc of dirty page queue */
bool encrypt; /* enable table's level data encryption */
volatile uint64 lsn_on_disk;
volatile bool aio_in_progress; /* indicate aio is in progress */
} BufferDescExtra;
typedef struct BufferDesc {
BufferTag tag; /* ID of page contained in buffer */
int buf_id; /* buffer's index number (from 0) */
/* state of the tag, containing flags, refcount and usagecount */
pg_atomic_uint32 state;
ThreadId wait_backend_pid; /* backend PID of pin-count waiter */
LWLock* io_in_progress_lock; /* to wait for I/O to complete */
LWLock* content_lock; /* to lock access to buffer contents */
/* below fields are used for incremental checkpoint */
pg_atomic_uint64 rec_lsn; /* recovery LSN */
volatile uint64 dirty_queue_loc; /* actual loc of dirty page queue */
bool encrypt; /* enable table's level data encryption */
volatile uint64 lsn_on_disk;
BufferDescExtra *extra;
volatile bool aio_in_progress; /* indicate aio is in progress */
#ifdef USE_ASSERT_CHECKING
volatile uint64 lsn_dirty;
#endif
@ -240,7 +245,8 @@ typedef struct BufferDesc {
* platform with either 32 or 128 byte line sizes, it's good to align to
* boundaries and avoid false sharing.
*/
#define BUFFERDESC_PAD_TO_SIZE (SIZEOF_VOID_P == 8 ? 128 : 1)
//#define BUFFERDESC_PAD_TO_SIZE (SIZEOF_VOID_P == 8 ? 128 : 1)
#define BUFFERDESC_PAD_TO_SIZE (SIZEOF_VOID_P == 8 ? 64 : 1)
typedef union BufferDescPadded {
BufferDesc bufferdesc;
@ -248,12 +254,12 @@ typedef union BufferDescPadded {
} BufferDescPadded;
#define GetBufferDescriptor(id) (&t_thrd.storage_cxt.BufferDescriptors[(id)].bufferdesc)
#define GetLocalBufferDescriptor(id) (&t_thrd.storage_cxt.LocalBufferDescriptors[(id)])
#define GetLocalBufferDescriptor(id) ((BufferDesc *)&u_sess->storage_cxt.LocalBufferDescriptors[(id)].bufferdesc)
#define BufferDescriptorGetBuffer(bdesc) ((bdesc)->buf_id + 1)
#define BufferGetBufferDescriptor(buffer) \
(AssertMacro(BufferIsValid(buffer)), BufferIsLocal(buffer) ? \
&u_sess->storage_cxt.LocalBufferDescriptors[-(buffer)-1] : \
(BufferDesc *)&u_sess->storage_cxt.LocalBufferDescriptors[-(buffer)-1].bufferdesc : \
&t_thrd.storage_cxt.BufferDescriptors[(buffer)-1].bufferdesc)
#define BufferDescriptorGetContentLock(bdesc) (((bdesc)->content_lock))