bgwriter-stats-fix-incomplete.patch

text/x-patch

Filename: bgwriter-stats-fix-incomplete.patch
Type: text/x-patch
Part: 0
Message: Checkpointer split has broken things dramatically (was Re: DELETE vs TRUNCATE explanation)

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
File+
src/backend/postmaster/bgwriter.c 0 0
src/backend/postmaster/checkpointer.c 0 0
src/include/postmaster/bgwriter.h 0 0
diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c
index 5f93fccbfab1bbb8306f5de4ad228f3cb48b0862..41a7b2be4f680db08556d948eaaa002ed50119c5 100644
*** a/src/backend/postmaster/bgwriter.c
--- b/src/backend/postmaster/bgwriter.c
*************** BackgroundWriterMain(void)
*** 341,346 ****
--- 341,357 ----
  }
  
  
+ /*
+  * IsBackgroundWriterProcess
+  *		Return true if running in background writer process.
+  */
+ bool
+ IsBackgroundWriterProcess(void)
+ {
+ 	return am_bg_writer;
+ }
+ 
+ 
  /* --------------------------------
   *		signal handler routines
   * --------------------------------
diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c
index 92fd4276cd1b3be81d1ac741f9f6ea09d241ea52..bd1db4811d661d75e616bc77157c4a9e9b7e92fc 100644
*** a/src/backend/postmaster/checkpointer.c
--- b/src/backend/postmaster/checkpointer.c
*************** bool
*** 1124,1129 ****
--- 1124,1130 ----
  ForwardFsyncRequest(RelFileNode rnode, ForkNumber forknum, BlockNumber segno)
  {
  	CheckpointerRequest *request;
+ 	bool		am_bg_writer;
  	bool		too_full;
  
  	if (!IsUnderPostmaster)
*************** ForwardFsyncRequest(RelFileNode rnode, F
*** 1131,1141 ****
  
  	if (am_checkpointer)
  		elog(ERROR, "ForwardFsyncRequest must not be called in checkpointer");
  
  	LWLockAcquire(CheckpointerCommLock, LW_EXCLUSIVE);
  
  	/* Count all backend writes regardless of if they fit in the queue */
! 	CheckpointerShmem->num_backend_writes++;
  
  	/*
  	 * If the checkpointer isn't running or the request queue is full, the
--- 1132,1144 ----
  
  	if (am_checkpointer)
  		elog(ERROR, "ForwardFsyncRequest must not be called in checkpointer");
+ 	am_bg_writer = IsBackgroundWriterProcess();
  
  	LWLockAcquire(CheckpointerCommLock, LW_EXCLUSIVE);
  
  	/* Count all backend writes regardless of if they fit in the queue */
! 	if (!am_bg_writer)
! 		CheckpointerShmem->num_backend_writes++;
  
  	/*
  	 * If the checkpointer isn't running or the request queue is full, the
*************** ForwardFsyncRequest(RelFileNode rnode, F
*** 1150,1156 ****
  		 * Count the subset of writes where backends have to do their own
  		 * fsync
  		 */
! 		CheckpointerShmem->num_backend_fsync++;
  		LWLockRelease(CheckpointerCommLock);
  		return false;
  	}
--- 1153,1160 ----
  		 * Count the subset of writes where backends have to do their own
  		 * fsync
  		 */
! 		if (!am_bg_writer)
! 			CheckpointerShmem->num_backend_fsync++;
  		LWLockRelease(CheckpointerCommLock);
  		return false;
  	}
diff --git a/src/include/postmaster/bgwriter.h b/src/include/postmaster/bgwriter.h
index 2e97e6aea5551f338939e680cb58e903fa409dc4..7deb62cf24a5d86248019ded418c360cb6f2800a 100644
*** a/src/include/postmaster/bgwriter.h
--- b/src/include/postmaster/bgwriter.h
*************** extern double CheckPointCompletionTarget
*** 28,33 ****
--- 28,35 ----
  extern void BackgroundWriterMain(void) __attribute__((noreturn));
  extern void CheckpointerMain(void) __attribute__((noreturn));
  
+ extern bool IsBackgroundWriterProcess(void);
+ 
  extern void RequestCheckpoint(int flags);
  extern void CheckpointWriteDelay(int flags, double progress);