version 1.0.5.

- Disable autovacuum for working tables and update logs.
- Do ANALYZE automatically after reorg unless -Z, --no-analyze option
  is specified.
This commit is contained in:
Takahiro Itagaki
2009-05-25 07:06:38 +00:00
parent 9a8f2e9c33
commit 5fe3f037be
9 changed files with 232 additions and 101 deletions

View File

@ -11,6 +11,10 @@ BEGIN;
CREATE SCHEMA reorg;
CREATE FUNCTION reorg.version() RETURNS text AS
'MODULE_PATHNAME', 'reorg_version'
LANGUAGE 'C' IMMUTABLE STRICT;
CREATE AGGREGATE reorg.array_accum (
sfunc = array_append,
basetype = anyelement,
@ -142,6 +146,17 @@ CREATE FUNCTION reorg.reorg_trigger() RETURNS trigger AS
'MODULE_PATHNAME', 'reorg_trigger'
LANGUAGE 'C' VOLATILE STRICT SECURITY DEFINER;
CREATE FUNCTION reorg.conflicted_triggers(oid) RETURNS SETOF name AS
$$
SELECT tgname FROM pg_trigger
WHERE tgrelid = $1 AND tgname >= 'z_reorg_trigger'
$$
LANGUAGE sql STABLE STRICT;
CREATE FUNCTION reorg.disable_autovacuum(regclass) RETURNS void AS
'MODULE_PATHNAME', 'reorg_disable_autovacuum'
LANGUAGE 'C' VOLATILE STRICT;
CREATE FUNCTION reorg.reorg_apply(
sql_peek cstring,
sql_insert cstring,

View File

@ -67,6 +67,9 @@ extern text *cstring_to_text(const char *s);
extern int SPI_execute_with_args(const char *src, int nargs, Oid *argtypes,
Datum *values, const char *nulls, bool read_only, long tcount);
#define CStringGetTextDatum(s) PointerGetDatum(cstring_to_text(s))
#define TextDatumGetCString(d) text_to_cstring((text *) DatumGetPointer(d))
#endif
#endif /* PGUT_BE_H */

View File

@ -31,19 +31,23 @@
PG_MODULE_MAGIC;
Datum reorg_version(PG_FUNCTION_ARGS);
Datum reorg_trigger(PG_FUNCTION_ARGS);
Datum reorg_apply(PG_FUNCTION_ARGS);
Datum reorg_get_index_keys(PG_FUNCTION_ARGS);
Datum reorg_indexdef(PG_FUNCTION_ARGS);
Datum reorg_swap(PG_FUNCTION_ARGS);
Datum reorg_drop(PG_FUNCTION_ARGS);
Datum reorg_disable_autovacuum(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(reorg_version);
PG_FUNCTION_INFO_V1(reorg_trigger);
PG_FUNCTION_INFO_V1(reorg_apply);
PG_FUNCTION_INFO_V1(reorg_get_index_keys);
PG_FUNCTION_INFO_V1(reorg_indexdef);
PG_FUNCTION_INFO_V1(reorg_swap);
PG_FUNCTION_INFO_V1(reorg_drop);
PG_FUNCTION_INFO_V1(reorg_disable_autovacuum);
static void reorg_init(void);
static SPIPlanPtr reorg_prepare(const char *src, int nargs, Oid *argtypes);
@ -70,6 +74,12 @@ must_be_superuser(const char *func)
static void RenameRelationInternal(Oid myrelid, const char *newrelname, Oid namespaceId);
#endif
Datum
reorg_version(PG_FUNCTION_ARGS)
{
return CStringGetTextDatum("pg_reorg 1.0.5");
}
/**
* @fn Datum reorg_trigger(PG_FUNCTION_ARGS)
* @brief Insert a operation log into log-table.
@ -274,7 +284,7 @@ typedef struct IndexDef
} IndexDef;
static char *
generate_relation_name(Oid relid)
get_relation_name(Oid relid)
{
Oid nsp = get_rel_namespace(relid);
char *nspname;
@ -380,7 +390,7 @@ parse_indexdef(IndexDef *stmt, Oid index, Oid table)
{
char *sql = pg_get_indexdef_string(index);
const char *idxname = get_quoted_relname(index);
const char *tblname = generate_relation_name(table);
const char *tblname = get_relation_name(table);
/* CREATE [UNIQUE] INDEX */
stmt->create = sql;
@ -646,6 +656,19 @@ reorg_drop(PG_FUNCTION_ARGS)
"DROP TRIGGER IF EXISTS z_reorg_trigger ON %s.%s CASCADE",
nspname, relname);
#if PG_VERSION_NUM < 80400
/* delete autovacuum settings */
reorg_execf(
SPI_OK_DELETE,
"DELETE FROM pg_catalog.pg_autovacuum v"
" USING pg_class c, pg_namespace n"
" WHERE relname IN ('log_%u', 'table_%u')"
" AND n.nspname = 'reorg'"
" AND c.relnamespace = n.oid"
" AND v.vacrelid = c.oid",
oid, oid);
#endif
/* drop log table */
reorg_execf(
SPI_OK_UTILITY,
@ -669,6 +692,31 @@ reorg_drop(PG_FUNCTION_ARGS)
PG_RETURN_VOID();
}
Datum
reorg_disable_autovacuum(PG_FUNCTION_ARGS)
{
Oid oid = PG_GETARG_OID(0);
/* connect to SPI manager */
reorg_init();
#if PG_VERSION_NUM >= 80400
reorg_execf(
SPI_OK_UTILITY,
"ALTER TABLE %s SET (autovacuum_enabled = off)",
get_relation_name(oid));
#else
reorg_execf(
SPI_OK_INSERT,
"INSERT INTO pg_catalog.pg_autovacuum VALUES (%u, false, -1, -1, -1, -1, -1, -1, -1, -1)",
oid);
#endif
SPI_finish();
PG_RETURN_VOID();
}
/* init SPI */
static void
reorg_init(void)