mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Rewrite the FSM. Instead of relying on a fixed-size shared memory segment, the
free space information is stored in a dedicated FSM relation fork, with each relation (except for hash indexes; they don't use FSM). This eliminates the max_fsm_relations and max_fsm_pages GUC options; remove any trace of them from the backend, initdb, and documentation. Rewrite contrib/pg_freespacemap to match the new FSM implementation. Also introduce a new variant of the get_raw_page(regclass, int4, int4) function in contrib/pageinspect that let's you to return pages from any relation fork, and a new fsm_page_contents() function to inspect the new FSM pages.
This commit is contained in:
61
contrib/pageinspect/fsmfuncs.c
Normal file
61
contrib/pageinspect/fsmfuncs.c
Normal file
@ -0,0 +1,61 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* fsmfuncs.c
|
||||
* Functions to investigate FSM pages
|
||||
*
|
||||
* These functions are restricted to superusers for the fear of introducing
|
||||
* security holes if the input checking isn't as water-tight as it should.
|
||||
* You'd need to be superuser to obtain a raw page image anyway, so
|
||||
* there's hardly any use case for using these without superuser-rights
|
||||
* anyway.
|
||||
*
|
||||
* Copyright (c) 2007-2008, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/contrib/pageinspect/fsmfuncs.c,v 1.1 2008/09/30 10:52:09 heikki Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
#include "lib/stringinfo.h"
|
||||
#include "storage/fsm_internals.h"
|
||||
#include "utils/builtins.h"
|
||||
#include "miscadmin.h"
|
||||
#include "funcapi.h"
|
||||
|
||||
Datum fsm_page_contents(PG_FUNCTION_ARGS);
|
||||
|
||||
/*
|
||||
* Dumps the contents of a FSM page.
|
||||
*/
|
||||
PG_FUNCTION_INFO_V1(fsm_page_contents);
|
||||
|
||||
Datum
|
||||
fsm_page_contents(PG_FUNCTION_ARGS)
|
||||
{
|
||||
bytea *raw_page = PG_GETARG_BYTEA_P(0);
|
||||
int raw_page_size;
|
||||
StringInfoData sinfo;
|
||||
FSMPage fsmpage;
|
||||
int i;
|
||||
|
||||
if (!superuser())
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
||||
(errmsg("must be superuser to use raw page functions"))));
|
||||
|
||||
raw_page_size = VARSIZE(raw_page) - VARHDRSZ;
|
||||
fsmpage = (FSMPage) PageGetContents(VARDATA(raw_page));
|
||||
|
||||
initStringInfo(&sinfo);
|
||||
|
||||
for(i=0; i < NodesPerPage; i++)
|
||||
{
|
||||
if (fsmpage->fp_nodes[i] != 0)
|
||||
appendStringInfo(&sinfo, "%d: %d\n", i, fsmpage->fp_nodes[i]);
|
||||
}
|
||||
appendStringInfo(&sinfo, "fp_next_slot: %d\n", fsmpage->fp_next_slot);
|
||||
|
||||
PG_RETURN_TEXT_P(cstring_to_text(sinfo.data));
|
||||
}
|
Reference in New Issue
Block a user