Proposal: PageLayout footprint - Mailing list pgsql-hackers
From | Zdenek Kotala |
---|---|
Subject | Proposal: PageLayout footprint |
Date | |
Msg-id | 489FC8E1.9090307@sun.com Whole thread Raw |
Responses |
Re: Proposal: PageLayout footprint
|
List | pgsql-hackers |
Current content of control file is insufficient to check if database is compatible with postgres server. I think we should create footprint file which will contains all page data structures and their member offset and length (and maybe more). As a first step which is useful at least for in-place-upgrade is footprint switch which prints page layout structures. I attach WIP patch. I'm thinking also to create pg_footprint view with (version, structure name, attribute, offset, size) columns. But I'm not sure about usefulness of this catalog (?maybe for regression tests?). Comments, ideas? Thanks Zdenek -- Zdenek Kotala Sun Microsystems Prague, Czech Republic http://sun.com/postgresql *** pgsql_footprint.76863ce445f3/src/backend/main/main.c po srp 11 06:48:20 2008 --- pgsql_footprint/src/backend/main/main.c ne srp 10 19:15:03 2008 *************** *** 34,39 **** --- 34,40 ---- #include <sys/param.h> #endif + #include "access/itup.h" #include "bootstrap/bootstrap.h" #include "postmaster/postmaster.h" #include "tcop/tcopprot.h" *************** *** 44,50 **** #include "libpq/pqsignal.h" #endif - const char *progname; --- 45,50 ---- *************** *** 52,60 **** static void help(const char *progname); static void check_root(const char *progname); static char *get_current_username(const char *progname); - int main(int argc, char *argv[]) { --- 52,60 ---- static void help(const char *progname); static void check_root(const char *progname); static char *get_current_username(const char *progname); + static void footprint(void); int main(int argc, char *argv[]) { *************** *** 149,154 **** --- 149,159 ---- puts("postgres (PostgreSQL) " PG_VERSION); exit(0); } + if ( strcmp(argv[1], "--footprint") == 0 ) + { + footprint(); + exit(0); + } } /* *************** *** 301,306 **** --- 306,312 ---- printf(_(" -t pa|pl|ex show timings after each query\n")); printf(_(" -T send SIGSTOP to all backend servers if one dies\n")); printf(_(" -W NUM wait NUM seconds to allow attach from a debugger\n")); + printf(_(" --footprint output page structure layout, then exit\n")); printf(_("\nOptions for single-user mode:\n")); printf(_(" --single selects single-user mode (must be first argument)\n")); *************** *** 396,398 **** --- 402,439 ---- return name; #endif } + + #define PRT_STRUCT(str) \ + printf("%s (%i/%i)\n", CppAsString(str), sizeof(str), MAXALIGN(sizeof(str))); + #define PRT_ATTR(str, attr) \ + printf("\t%s - %i,%i\n", CppAsString(attr), offsetof(str,attr), sizeof(((str *)0)->attr)); + + static void + footprint(void) + { + PRT_STRUCT(PageHeaderData); + PRT_ATTR(PageHeaderData, pd_lsn); + PRT_ATTR(PageHeaderData, pd_tli); + PRT_ATTR(PageHeaderData, pd_flags); + PRT_ATTR(PageHeaderData, pd_lower); + PRT_ATTR(PageHeaderData, pd_upper); + PRT_ATTR(PageHeaderData, pd_special); + PRT_ATTR(PageHeaderData, pd_pagesize_version); + PRT_ATTR(PageHeaderData, pd_prune_xid); + PRT_ATTR(PageHeaderData, pd_linp); + + PRT_STRUCT(HeapTupleHeaderData); + PRT_ATTR(HeapTupleHeaderData, t_choice.t_heap.t_xmin); + PRT_ATTR(HeapTupleHeaderData, t_choice.t_heap.t_xmax); + PRT_ATTR(HeapTupleHeaderData, t_choice.t_heap.t_field3.t_cid); + PRT_ATTR(HeapTupleHeaderData, t_ctid); + PRT_ATTR(HeapTupleHeaderData, t_infomask2); + PRT_ATTR(HeapTupleHeaderData, t_infomask); + PRT_ATTR(HeapTupleHeaderData, t_hoff); + PRT_ATTR(HeapTupleHeaderData, t_bits); + + PRT_STRUCT(IndexTupleData); + PRT_ATTR(IndexTupleData, t_tid); + PRT_ATTR(IndexTupleData, t_info); + } +
pgsql-hackers by date: