-
Notifications
You must be signed in to change notification settings - Fork 4.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rewrite the FSM. Instead of relying on a fixed-size shared memory seg…
…ment, 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.
- Loading branch information
Showing
53 changed files
with
1,755 additions
and
2,631 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,44 +1,26 @@ | ||
/* $PostgreSQL: pgsql/contrib/pg_freespacemap/pg_freespacemap.sql.in,v 1.8 2007/11/13 04:24:28 momjian Exp $ */ | ||
/* $PostgreSQL: pgsql/contrib/pg_freespacemap/pg_freespacemap.sql.in,v 1.9 2008/09/30 10:52:09 heikki Exp $ */ | ||
|
||
-- Adjust this setting to control where the objects get created. | ||
SET search_path = public; | ||
|
||
|
||
-- Register the functions. | ||
CREATE OR REPLACE FUNCTION pg_freespacemap_pages() | ||
RETURNS SETOF RECORD | ||
AS 'MODULE_PATHNAME', 'pg_freespacemap_pages' | ||
-- Register the C function. | ||
CREATE OR REPLACE FUNCTION pg_freespace(regclass, int4) | ||
RETURNS int2 | ||
AS 'MODULE_PATHNAME', 'pg_freespace' | ||
LANGUAGE C; | ||
|
||
CREATE OR REPLACE FUNCTION pg_freespacemap_relations() | ||
-- pg_freespace shows the recorded space avail at each block in a relation | ||
CREATE OR REPLACE FUNCTION | ||
pg_freespace(rel regclass, blkno OUT int4, avail OUT int2) | ||
RETURNS SETOF RECORD | ||
AS 'MODULE_PATHNAME', 'pg_freespacemap_relations' | ||
LANGUAGE C; | ||
AS $$ | ||
SELECT blkno::int4, pg_freespace($1, blkno::int4) AS avail | ||
FROM generate_series(0, pg_relation_size($1) / current_setting('block_size')::bigint - 1) AS blkno; | ||
$$ | ||
LANGUAGE SQL; | ||
|
||
|
||
-- Create views for convenient access. | ||
CREATE VIEW pg_freespacemap_pages AS | ||
SELECT P.* FROM pg_freespacemap_pages() AS P | ||
(reltablespace oid, | ||
reldatabase oid, | ||
relfilenode oid, | ||
relblocknumber bigint, | ||
bytes integer); | ||
|
||
CREATE VIEW pg_freespacemap_relations AS | ||
SELECT P.* FROM pg_freespacemap_relations() AS P | ||
(reltablespace oid, | ||
reldatabase oid, | ||
relfilenode oid, | ||
avgrequest integer, | ||
interestingpages integer, | ||
storedpages integer, | ||
nextpage integer); | ||
|
||
|
||
-- Don't want these to be available to public. | ||
REVOKE ALL ON FUNCTION pg_freespacemap_pages() FROM PUBLIC; | ||
REVOKE ALL ON pg_freespacemap_pages FROM PUBLIC; | ||
|
||
REVOKE ALL ON FUNCTION pg_freespacemap_relations() FROM PUBLIC; | ||
REVOKE ALL ON pg_freespacemap_relations FROM PUBLIC; | ||
REVOKE ALL ON FUNCTION pg_freespace(regclass, int4) FROM PUBLIC; | ||
REVOKE ALL ON FUNCTION pg_freespace(regclass) FROM PUBLIC; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.