From fafe3079d4a1316f88e3b5107a7131fe0b028c58 Mon Sep 17 00:00:00 2001
From: Stepan Neretin <sndcppg@gmail.com>
Date: Sun, 8 Sep 2024 15:44:22 +0700
Subject: [PATCH v2 10/10] Refactor LSN Sorting to Use Template-Based
 sort_cmp_lsn

Refactored the sorting logic for Write, Flush, and Apply LSN arrays in SyncRepGetNthLatestSyncRecPtr to replace qsort with the optimized sort_cmp_lsn function, which leverages a template-based sorting mechanism.
---
 src/backend/replication/syncrep.c | 29 +++++++++++++----------------
 1 file changed, 13 insertions(+), 16 deletions(-)

diff --git a/src/backend/replication/syncrep.c b/src/backend/replication/syncrep.c
index fa5988c824..bea4b7275b 100644
--- a/src/backend/replication/syncrep.c
+++ b/src/backend/replication/syncrep.c
@@ -118,7 +118,6 @@ static void SyncRepGetNthLatestSyncRecPtr(XLogRecPtr *writePtr,
 										  uint8 nth);
 static int	SyncRepGetStandbyPriority(void);
 static int	standby_priority_comparator(const void *a, const void *b);
-static int	cmp_lsn(const void *a, const void *b);
 
 #ifdef USE_ASSERT_CHECKING
 static bool SyncRepQueueIsOrderedByLSN(int mode);
@@ -642,6 +641,16 @@ SyncRepGetOldestSyncRecPtr(XLogRecPtr *writePtr,
 	}
 }
 
+/*
+- * Compare lsn in order to sort array in descending order.
+-*/
+#define ST_SORT sort_cmp_lsn
+#define ST_ELEMENT_TYPE XLogRecPtr
+#define ST_COMPARE(a, b) pg_cmp_u64(*(b), *(a))  /* Dereference pointers for comparison */
+#define ST_SCOPE static
+#define ST_DEFINE
+#include <lib/sort_template.h>
+
 /*
  * Calculate the Nth latest Write, Flush and Apply positions among sync
  * standbys.
@@ -674,9 +683,9 @@ SyncRepGetNthLatestSyncRecPtr(XLogRecPtr *writePtr,
 	}
 
 	/* Sort each array in descending order */
-	qsort(write_array, num_standbys, sizeof(XLogRecPtr), cmp_lsn);
-	qsort(flush_array, num_standbys, sizeof(XLogRecPtr), cmp_lsn);
-	qsort(apply_array, num_standbys, sizeof(XLogRecPtr), cmp_lsn);
+	sort_cmp_lsn(write_array, num_standbys);
+	sort_cmp_lsn(flush_array, num_standbys);
+	sort_cmp_lsn(apply_array, num_standbys);
 
 	/* Get Nth latest Write, Flush, Apply positions */
 	*writePtr = write_array[nth - 1];
@@ -688,18 +697,6 @@ SyncRepGetNthLatestSyncRecPtr(XLogRecPtr *writePtr,
 	pfree(apply_array);
 }
 
-/*
- * Compare lsn in order to sort array in descending order.
- */
-static int
-cmp_lsn(const void *a, const void *b)
-{
-	XLogRecPtr	lsn1 = *((const XLogRecPtr *) a);
-	XLogRecPtr	lsn2 = *((const XLogRecPtr *) b);
-
-	return pg_cmp_u64(lsn2, lsn1);
-}
-
 /*
  * Return data about walsenders that are candidates to be sync standbys.
  *
-- 
2.43.0

