diff options
Diffstat (limited to 'src/bin/pg_rewind/rewind_source.h')
-rw-r--r-- | src/bin/pg_rewind/rewind_source.h | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/bin/pg_rewind/rewind_source.h b/src/bin/pg_rewind/rewind_source.h new file mode 100644 index 0000000..1310e86 --- /dev/null +++ b/src/bin/pg_rewind/rewind_source.h @@ -0,0 +1,86 @@ +/*------------------------------------------------------------------------- + * + * rewind_source.h + * Abstraction for fetching from source server. + * + * The source server can be either a libpq connection to a live system, + * or a local data directory. The 'rewind_source' struct abstracts the + * operations to fetch data from the source system, so that the rest of + * the code doesn't need to care what kind of a source its dealing with. + * + * Copyright (c) 2013-2022, PostgreSQL Global Development Group + * + *------------------------------------------------------------------------- + */ +#ifndef REWIND_SOURCE_H +#define REWIND_SOURCE_H + +#include "access/xlogdefs.h" +#include "file_ops.h" +#include "filemap.h" +#include "libpq-fe.h" + +typedef struct rewind_source +{ + /* + * Traverse all files in the source data directory, and call 'callback' on + * each file. + */ + void (*traverse_files) (struct rewind_source *, + process_file_callback_t callback); + + /* + * Fetch a single file into a malloc'd buffer. The file size is returned + * in *filesize. The returned buffer is always zero-terminated, which is + * handy for text files. + */ + char *(*fetch_file) (struct rewind_source *, const char *path, + size_t *filesize); + + /* + * Request to fetch (part of) a file in the source system, specified by an + * offset and length, and write it to the same offset in the corresponding + * target file. The source implementation may queue up the request and + * execute it later when convenient. Call finish_fetch() to flush the + * queue and execute all requests. + */ + void (*queue_fetch_range) (struct rewind_source *, const char *path, + off_t offset, size_t len); + + /* + * Like queue_fetch_range(), but requests replacing the whole local file + * from the source system. 'len' is the expected length of the file, + * although when the source is a live server, the file may change + * concurrently. The implementation is not obliged to copy more than 'len' + * bytes, even if the file is larger. However, to avoid copying a + * truncated version of the file, which can cause trouble if e.g. a + * configuration file is modified concurrently, the implementation should + * try to copy the whole file, even if it's larger than expected. + */ + void (*queue_fetch_file) (struct rewind_source *, const char *path, + size_t len); + + /* + * Execute all requests queued up with queue_fetch_range(). + */ + void (*finish_fetch) (struct rewind_source *); + + /* + * Get the current WAL insert position in the source system. + */ + XLogRecPtr (*get_current_wal_insert_lsn) (struct rewind_source *); + + /* + * Free this rewind_source object. + */ + void (*destroy) (struct rewind_source *); + +} rewind_source; + +/* in libpq_source.c */ +extern rewind_source *init_libpq_source(PGconn *conn); + +/* in local_source.c */ +extern rewind_source *init_local_source(const char *datadir); + +#endif /* FETCH_H */ |