Skip to content

Latest commit

 

History

History
103 lines (75 loc) · 5.03 KB

20240330_04.md

File metadata and controls

103 lines (75 loc) · 5.03 KB

PostgreSQL 17 preview - 支持在申请时指定动态共享内存区域初始、最大段size

作者

digoal

日期

2024-03-30

标签

PostgreSQL , PolarDB , DuckDB , dsa , DSA_DEFAULT_INIT_SEGMENT_SIZE , DSA_MIN_SEGMENT_SIZE , DSA_MAX_SEGMENT_SIZE


背景

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=bb952c8c8b13279eca039499249cb5dc60991603

Allow specifying initial and maximum segment sizes for DSA.  
  
author	Masahiko Sawada <msawada@postgresql.org>	  
Wed, 27 Mar 2024 02:43:29 +0000 (11:43 +0900)  
committer	Masahiko Sawada <msawada@postgresql.org>	  
Wed, 27 Mar 2024 02:43:29 +0000 (11:43 +0900)  
commit	bb952c8c8b13279eca039499249cb5dc60991603  
tree	ba7cc3ced86501cb0da23a66b9170ffae19dcf6c	tree  
parent	1f42337be535243e665f85916ce21b2d85d9f2b3	commit | diff  
Allow specifying initial and maximum segment sizes for DSA.  
  
Previously, the DSA segment size always started with 1MB and grew up  
to DSA_MAX_SEGMENT_SIZE. It was inconvenient in certain scenarios,  
such as when the caller desired a soft constraint on the total DSA  
segment size, limiting it to less than 1MB.  
  
This commit introduces the capability to specify the initial and  
maximum DSA segment sizes when creating a DSA area, providing more  
flexibility and control over memory usage.  
  
Reviewed-by: John Naylor, Tomas Vondra  
Discussion: https://postgr.es/m/CAD21AoAYGGC1ePjVX0H%2Bpp9rH%3D9vuPK19nNOiu12NprdV5TVJA%40mail.gmail.com  
+/*  
+ * The number of bits used to represent the offset part of a dsa_pointer.  
+ * This controls the maximum size of a segment, the maximum possible  
+ * allocation size and also the maximum number of segments per area.  
+ */  
+#if SIZEOF_DSA_POINTER == 4  
+#define DSA_OFFSET_WIDTH 27        /* 32 segments of size up to 128MB */  
+#else  
+#define DSA_OFFSET_WIDTH 40        /* 1024 segments of size up to 1TB */  
+#endif  
+  
+/*  
+ * The default size of the initial DSM segment that backs a dsa_area created  
+ * by dsa_create.  After creating some number of segments of the initial size  
+ * we'll double this size, and so on.  Larger segments may be created if  
+ * necessary to satisfy large requests.  
+ */  
+#define DSA_DEFAULT_INIT_SEGMENT_SIZE ((size_t) (1 * 1024 * 1024))  
+  
+/* The minimum size of a DSM segment. */  
+#define DSA_MIN_SEGMENT_SIZE   ((size_t) (256 * 1024L))  
+  
+/* The maximum size of a DSM segment. */  
+#define DSA_MAX_SEGMENT_SIZE ((size_t) 1 << DSA_OFFSET_WIDTH)  
  
+/* Create dsa_area with default segment sizes */  
+#define dsa_create(tranch_id) \  
+   dsa_create_ext(tranch_id, DSA_DEFAULT_INIT_SEGMENT_SIZE, \  
+                  DSA_MAX_SEGMENT_SIZE)  
+  
+/* Create dsa_area with default segment sizes in an existing share memory space */  
+#define dsa_create_in_place(place, size, tranch_id, segment) \  
+   dsa_create_in_place_ext(place, size, tranch_id, segment, \  
+                           DSA_DEFAULT_INIT_SEGMENT_SIZE, \  
+                           DSA_MAX_SEGMENT_SIZE)  
+  

digoal's wechat