mirror of
https://github.com/postgres/postgres.git
synced 2025-10-25 13:17:41 +03:00
Refactor the fsync queue for wider use.
Previously, md.c and checkpointer.c were tightly integrated so that fsync calls could be handed off and processed in the background. Introduce a system of callbacks and file tags, so that other modules can hand off fsync work in the same way. For now only md.c uses the new interface, but other users are being proposed. Since there may be use cases that are not strictly SMGR implementations, use a new function table for sync handlers rather than extending the traditional SMGR one. Instead of using a bitmapset of segment numbers for each RelFileNode in the checkpointer's hash table, make the segment number part of the key. This requires sending explicit "forget" requests for every segment individually when relations are dropped, but suits the file layout schemes of proposed future users better (ie sparse or high segment numbers). Author: Shawn Debnath and Thomas Munro Reviewed-by: Thomas Munro, Andres Freund Discussion: https://postgr.es/m/CAEepm=2gTANm=e3ARnJT=n0h8hf88wqmaZxk0JYkxw+b21fNrw@mail.gmail.com
This commit is contained in:
62
src/include/storage/sync.h
Normal file
62
src/include/storage/sync.h
Normal file
@@ -0,0 +1,62 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* sync.h
|
||||
* File synchronization management code.
|
||||
*
|
||||
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/storage/sync.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef SYNC_H
|
||||
#define SYNC_H
|
||||
|
||||
#include "storage/relfilenode.h"
|
||||
|
||||
/*
|
||||
* Type of sync request. These are used to manage the set of pending
|
||||
* requests to call a sync handler's sync or unlink functions at the next
|
||||
* checkpoint.
|
||||
*/
|
||||
typedef enum SyncRequestType
|
||||
{
|
||||
SYNC_REQUEST, /* schedule a call of sync function */
|
||||
SYNC_UNLINK_REQUEST, /* schedule a call of unlink function */
|
||||
SYNC_FORGET_REQUEST, /* forget all calls for a tag */
|
||||
SYNC_FILTER_REQUEST /* forget all calls satisfying match fn */
|
||||
} SyncRequestType;
|
||||
|
||||
/*
|
||||
* Which set of functions to use to handle a given request. See the function
|
||||
* table in sync.c.
|
||||
*/
|
||||
typedef enum SyncRequestHandler
|
||||
{
|
||||
SYNC_HANDLER_MD = 0 /* md smgr */
|
||||
} SyncRequestHandler;
|
||||
|
||||
/*
|
||||
* A tag identifying a file. Currently it has the members required for md.c's
|
||||
* usage, but sync.c has no knowledge of the internal structure, and it is
|
||||
* liable to change as required by future handlers.
|
||||
*/
|
||||
typedef struct FileTag
|
||||
{
|
||||
int16 handler; /* SyncRequstHandler value, saving space */
|
||||
int16 forknum; /* ForkNumber, saving space */
|
||||
RelFileNode rnode;
|
||||
uint32 segno;
|
||||
} FileTag;
|
||||
|
||||
extern void InitSync(void);
|
||||
extern void SyncPreCheckpoint(void);
|
||||
extern void SyncPostCheckpoint(void);
|
||||
extern void ProcessSyncRequests(void);
|
||||
extern void RememberSyncRequest(const FileTag *ftag, SyncRequestType type);
|
||||
extern void EnableSyncRequestForwarding(void);
|
||||
extern bool RegisterSyncRequest(const FileTag *ftag, SyncRequestType type,
|
||||
bool retryOnError);
|
||||
|
||||
#endif /* SYNC_H */
|
||||
Reference in New Issue
Block a user