mirror of
https://github.com/postgres/postgres.git
synced 2025-11-25 12:03:53 +03:00
Cache smgrnblocks() results in recovery.
Avoid repeatedly calling lseek(SEEK_END) during recovery by caching the size of each fork. For now, we can't use the same technique in other processes, because we lack a shared invalidation mechanism. Do this by generalizing the pre-existing caching used by FSM and VM to support all forks. Discussion: https://postgr.es/m/CAEepm%3D3SSw-Ty1DFcK%3D1rU-K6GSzYzfdD4d%2BZwapdN7dTa6%3DnQ%40mail.gmail.com
This commit is contained in:
@@ -45,15 +45,13 @@ typedef struct SMgrRelationData
|
||||
struct SMgrRelationData **smgr_owner;
|
||||
|
||||
/*
|
||||
* These next three fields are not actually used or manipulated by smgr,
|
||||
* except that they are reset to InvalidBlockNumber upon a cache flush
|
||||
* event (in particular, upon truncation of the relation). Higher levels
|
||||
* store cached state here so that it will be reset when truncation
|
||||
* happens. In all three cases, InvalidBlockNumber means "unknown".
|
||||
* The following fields are reset to InvalidBlockNumber upon a cache flush
|
||||
* event, and hold the last known size for each fork. This information is
|
||||
* currently only reliable during recovery, since there is no cache
|
||||
* invalidation for fork extension.
|
||||
*/
|
||||
BlockNumber smgr_targblock; /* current insertion target block */
|
||||
BlockNumber smgr_fsm_nblocks; /* last known size of fsm fork */
|
||||
BlockNumber smgr_vm_nblocks; /* last known size of vm fork */
|
||||
BlockNumber smgr_cached_nblocks[MAX_FORKNUM + 1]; /* last known size */
|
||||
|
||||
/* additional public fields may someday exist here */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user