Hi,

pg_xlogdump needs access to the *_desc functions for each rmgr.  We
already moved forward quite a bit by splitting those functions out of
their containing files; so now they are compilable separately.  Good.
The remaining task is enabling the code to find those functions in the
first place; currently, the function pointers live in rmgr.c which is
not compilable by frontend code because it contains pointers to other
functions.  Hence the attached patch splits RmgrData into two; the names
and rm_desc functions go into a new file which can be compiled easily by
frontend.

Proposed patch attached.

This comes from 
http://www.postgresql.org/message-id/20130204180327.gh4...@alvh.no-ip.org
which is part of the pg_xlogdump patch in commitfest.

-- 
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services
*** a/src/backend/access/transam/Makefile
--- b/src/backend/access/transam/Makefile
***************
*** 12,20 **** subdir = src/backend/access/transam
  top_builddir = ../../../..
  include $(top_builddir)/src/Makefile.global
  
! OBJS = clog.o transam.o varsup.o xact.o rmgr.o slru.o subtrans.o multixact.o \
! 	timeline.o twophase.o twophase_rmgr.o xlog.o xlogarchive.o xlogfuncs.o \
! 	xlogreader.o xlogutils.o
  
  include $(top_srcdir)/src/backend/common.mk
  
--- 12,20 ----
  top_builddir = ../../../..
  include $(top_builddir)/src/Makefile.global
  
! OBJS = clog.o multixact.o rmgrdesc.o rmgr.o slru.o subtrans.o timeline.o \
! 	transam.o twophase.o twophase_rmgr.o varsup.o xact.o xlogarchive.o \
! 	xlogfuncs.o xlog.o xlogreader.o xlogutils.o
  
  include $(top_srcdir)/src/backend/common.mk
  
*** a/src/backend/access/transam/rmgr.c
--- b/src/backend/access/transam/rmgr.c
***************
*** 24,46 ****
  #include "storage/standby.h"
  #include "utils/relmapper.h"
  
  
  const RmgrData RmgrTable[RM_MAX_ID + 1] = {
! 	{"XLOG", xlog_redo, xlog_desc, NULL, NULL, NULL},
! 	{"Transaction", xact_redo, xact_desc, NULL, NULL, NULL},
! 	{"Storage", smgr_redo, smgr_desc, NULL, NULL, NULL},
! 	{"CLOG", clog_redo, clog_desc, NULL, NULL, NULL},
! 	{"Database", dbase_redo, dbase_desc, NULL, NULL, NULL},
! 	{"Tablespace", tblspc_redo, tblspc_desc, NULL, NULL, NULL},
! 	{"MultiXact", multixact_redo, multixact_desc, NULL, NULL, NULL},
! 	{"RelMap", relmap_redo, relmap_desc, NULL, NULL, NULL},
! 	{"Standby", standby_redo, standby_desc, NULL, NULL, NULL},
! 	{"Heap2", heap2_redo, heap2_desc, NULL, NULL, NULL},
! 	{"Heap", heap_redo, heap_desc, NULL, NULL, NULL},
! 	{"Btree", btree_redo, btree_desc, btree_xlog_startup, btree_xlog_cleanup, btree_safe_restartpoint},
! 	{"Hash", hash_redo, hash_desc, NULL, NULL, NULL},
! 	{"Gin", gin_redo, gin_desc, gin_xlog_startup, gin_xlog_cleanup, gin_safe_restartpoint},
! 	{"Gist", gist_redo, gist_desc, gist_xlog_startup, gist_xlog_cleanup, NULL},
! 	{"Sequence", seq_redo, seq_desc, NULL, NULL, NULL},
! 	{"SPGist", spg_redo, spg_desc, spg_xlog_startup, spg_xlog_cleanup, NULL}
  };
--- 24,47 ----
  #include "storage/standby.h"
  #include "utils/relmapper.h"
  
+ /* See rmgrdesc.c, too */
  
  const RmgrData RmgrTable[RM_MAX_ID + 1] = {
! 	{xlog_redo, NULL, NULL, NULL},
! 	{xact_redo, NULL, NULL, NULL},
! 	{smgr_redo, NULL, NULL, NULL},
! 	{clog_redo, NULL, NULL, NULL},
! 	{dbase_redo, NULL, NULL, NULL},
! 	{tblspc_redo, NULL, NULL, NULL},
! 	{multixact_redo, NULL, NULL, NULL},
! 	{relmap_redo, NULL, NULL, NULL},
! 	{standby_redo, NULL, NULL, NULL},
! 	{heap2_redo, NULL, NULL, NULL},
! 	{heap_redo, NULL, NULL, NULL},
! 	{btree_redo, btree_xlog_startup, btree_xlog_cleanup, btree_safe_restartpoint},
! 	{hash_redo, NULL, NULL, NULL},
! 	{gin_redo, gin_xlog_startup, gin_xlog_cleanup, gin_safe_restartpoint},
! 	{gist_redo, gist_xlog_startup, gist_xlog_cleanup, NULL},
! 	{seq_redo, NULL, NULL, NULL},
! 	{spg_redo, spg_xlog_startup, spg_xlog_cleanup, NULL}
  };
*** /dev/null
--- b/src/backend/access/transam/rmgrdesc.c
***************
*** 0 ****
--- 1,47 ----
+ /*
+  * rmgrdesc.c
+  *
+  * Resource managers descriptor function definitions
+  *
+  * src/backend/access/transam/rmgrdesc.c
+  */
+ #include "postgres.h"
+ 
+ #include "access/clog.h"
+ #include "access/gin.h"
+ #include "access/gist_private.h"
+ #include "access/hash.h"
+ #include "access/heapam_xlog.h"
+ #include "access/multixact.h"
+ #include "access/nbtree.h"
+ #include "access/spgist.h"
+ #include "access/xact.h"
+ #include "access/xlog_internal.h"
+ #include "catalog/storage_xlog.h"
+ #include "commands/dbcommands.h"
+ #include "commands/sequence.h"
+ #include "commands/tablespace.h"
+ #include "storage/standby.h"
+ #include "utils/relmapper.h"
+ 
+ /* See rmgr.c, too */
+ 
+ const RmgrDescData RmgrDescTable[RM_MAX_ID + 1] = {
+ 	{"XLOG", xlog_desc},
+ 	{"Transaction", xact_desc},
+ 	{"Storage", smgr_desc},
+ 	{"CLOG", clog_desc},
+ 	{"Database", dbase_desc},
+ 	{"Tablespace", tblspc_desc},
+ 	{"MultiXact", multixact_desc},
+ 	{"RelMap", relmap_desc},
+ 	{"Standby", standby_desc},
+ 	{"Heap2", heap2_desc},
+ 	{"Heap", heap_desc},
+ 	{"Btree", btree_desc},
+ 	{"Hash", hash_desc},
+ 	{"Gin", gin_desc},
+ 	{"Gist", gist_desc},
+ 	{"Sequence", seq_desc},
+ 	{"SPGist", spg_desc},
+ };
*** a/src/backend/access/transam/xlog.c
--- b/src/backend/access/transam/xlog.c
***************
*** 1042,1048 **** begin:;
  		if (rdata->data != NULL)
  		{
  			appendStringInfo(&buf, " - ");
! 			RmgrTable[rechdr->xl_rmid].rm_desc(&buf, rechdr->xl_info, rdata->data);
  		}
  		elog(LOG, "%s", buf.data);
  		pfree(buf.data);
--- 1042,1048 ----
  		if (rdata->data != NULL)
  		{
  			appendStringInfo(&buf, " - ");
! 			RmgrDescTable[rechdr->xl_rmid].rm_desc(&buf, rechdr->xl_info, rdata->data);
  		}
  		elog(LOG, "%s", buf.data);
  		pfree(buf.data);
***************
*** 5352,5358 **** StartupXLOG(void)
  									 (uint32) (EndRecPtr >> 32), (uint32) EndRecPtr);
  					xlog_outrec(&buf, record);
  					appendStringInfo(&buf, " - ");
! 					RmgrTable[record->xl_rmid].rm_desc(&buf,
  													   record->xl_info,
  													 XLogRecGetData(record));
  					elog(LOG, "%s", buf.data);
--- 5352,5358 ----
  									 (uint32) (EndRecPtr >> 32), (uint32) EndRecPtr);
  					xlog_outrec(&buf, record);
  					appendStringInfo(&buf, " - ");
! 					RmgrDescTable[record->xl_rmid].rm_desc(&buf,
  													   record->xl_info,
  													 XLogRecGetData(record));
  					elog(LOG, "%s", buf.data);
***************
*** 7882,7888 **** xlog_outrec(StringInfo buf, XLogRecord *record)
  			appendStringInfo(buf, "; bkpb%d", i);
  	}
  
! 	appendStringInfo(buf, ": %s", RmgrTable[record->xl_rmid].rm_name);
  }
  #endif   /* WAL_DEBUG */
  
--- 7882,7888 ----
  			appendStringInfo(buf, "; bkpb%d", i);
  	}
  
! 	appendStringInfo(buf, ": %s", RmgrDescTable[record->xl_rmid].rm_name);
  }
  #endif   /* WAL_DEBUG */
  
***************
*** 8924,8930 **** rm_redo_error_callback(void *arg)
  	StringInfoData buf;
  
  	initStringInfo(&buf);
! 	RmgrTable[record->xl_rmid].rm_desc(&buf,
  									   record->xl_info,
  									   XLogRecGetData(record));
  
--- 8924,8930 ----
  	StringInfoData buf;
  
  	initStringInfo(&buf);
! 	RmgrDescTable[record->xl_rmid].rm_desc(&buf,
  									   record->xl_info,
  									   XLogRecGetData(record));
  
*** a/src/include/access/rmgr.h
--- b/src/include/access/rmgr.h
***************
*** 14,20 **** typedef uint8 RmgrId;
   * Built-in resource managers
   *
   * Note: RM_MAX_ID could be as much as 255 without breaking the XLOG file
!  * format, but we keep it small to minimize the size of RmgrTable[].
   */
  #define RM_XLOG_ID				0
  #define RM_XACT_ID				1
--- 14,21 ----
   * Built-in resource managers
   *
   * Note: RM_MAX_ID could be as much as 255 without breaking the XLOG file
!  * format, but we keep it small to minimize the size of RmgrTable[]/
!  * RmgrDescTable[].
   */
  #define RM_XLOG_ID				0
  #define RM_XACT_ID				1
*** a/src/include/access/xlog_internal.h
--- b/src/include/access/xlog_internal.h
***************
*** 231,245 **** typedef struct xl_end_of_recovery
  struct XLogRecord;
  
  /*
!  * Method table for resource managers.
   *
!  * RmgrTable[] is indexed by RmgrId values (see rmgr.h).
   */
  typedef struct RmgrData
  {
- 	const char *rm_name;
  	void		(*rm_redo) (XLogRecPtr lsn, struct XLogRecord *rptr);
- 	void		(*rm_desc) (StringInfo buf, uint8 xl_info, char *rec);
  	void		(*rm_startup) (void);
  	void		(*rm_cleanup) (void);
  	bool		(*rm_safe_restartpoint) (void);
--- 231,246 ----
  struct XLogRecord;
  
  /*
!  * Method tables for resource managers.
   *
!  * RmgrDescData (for textual descriptor functions) is split so that the file it
!  * lives in can be used by frontend programs.
!  *
!  * RmgrTable[] and RmgrDescTable[] are indexed by RmgrId values (see rmgr.h).
   */
  typedef struct RmgrData
  {
  	void		(*rm_redo) (XLogRecPtr lsn, struct XLogRecord *rptr);
  	void		(*rm_startup) (void);
  	void		(*rm_cleanup) (void);
  	bool		(*rm_safe_restartpoint) (void);
***************
*** 247,252 **** typedef struct RmgrData
--- 248,262 ----
  
  extern const RmgrData RmgrTable[];
  
+ typedef struct RmgrDescData
+ {
+ 	const char *rm_name;
+ 	void		(*rm_desc) (StringInfo buf, uint8 xl_info, char *rec);
+ } RmgrDescData;
+ 
+ extern const RmgrDescData RmgrDescTable[];
+ 
+ 
  /*
   * Exported to support xlog switching from checkpointer
   */
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to