agora inbox for pgsql-hackers@postgresql.org  
help / color / mirror / Atom feed
[PATCH v4 2/2] Remove durable_rename_excl().
5+ messages / 2 participants
[nested] [flat]

* [PATCH v4 2/2] Remove durable_rename_excl().
@ 2022-04-26 19:38 Nathan Bossart <nathandbossart@gmail.com>
  0 siblings, 0 replies; 5+ messages in thread

From: Nathan Bossart @ 2022-04-26 19:38 UTC (permalink / raw)

A previous commit replaced all calls to this function with
durable_rename(), but the function itself was not removed in back-
branches since extensions may use it.  This change removes the
function from v16devel.

Do not back-patch.

Author: Nathan Bossart
Reviewed-by: Robert Haas, Kyotaro Horiguchi, Michael Paquier
Discussion: https://postgr.es/m/20220418182336.GA2298576%40nathanxps13
---
 src/backend/storage/file/fd.c  | 63 ----------------------------------
 src/include/pg_config_manual.h |  7 ----
 src/include/storage/fd.h       |  1 -
 3 files changed, 71 deletions(-)

diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c
index 24704b6a02..f904f60c08 100644
--- a/src/backend/storage/file/fd.c
+++ b/src/backend/storage/file/fd.c
@@ -807,69 +807,6 @@ durable_unlink(const char *fname, int elevel)
 	return 0;
 }
 
-/*
- * durable_rename_excl -- rename a file in a durable manner.
- *
- * Similar to durable_rename(), except that this routine tries (but does not
- * guarantee) not to overwrite the target file.
- *
- * Note that a crash in an unfortunate moment can leave you with two links to
- * the target file.
- *
- * Log errors with the caller specified severity.
- *
- * On Windows, using a hard link followed by unlink() causes concurrency
- * issues, while a simple rename() does not cause that, so be careful when
- * changing the logic of this routine.
- *
- * Returns 0 if the operation succeeded, -1 otherwise. Note that errno is not
- * valid upon return.
- */
-int
-durable_rename_excl(const char *oldfile, const char *newfile, int elevel)
-{
-	/*
-	 * Ensure that, if we crash directly after the rename/link, a file with
-	 * valid contents is moved into place.
-	 */
-	if (fsync_fname_ext(oldfile, false, false, elevel) != 0)
-		return -1;
-
-#ifdef HAVE_WORKING_LINK
-	if (link(oldfile, newfile) < 0)
-	{
-		ereport(elevel,
-				(errcode_for_file_access(),
-				 errmsg("could not link file \"%s\" to \"%s\": %m",
-						oldfile, newfile)));
-		return -1;
-	}
-	unlink(oldfile);
-#else
-	if (rename(oldfile, newfile) < 0)
-	{
-		ereport(elevel,
-				(errcode_for_file_access(),
-				 errmsg("could not rename file \"%s\" to \"%s\": %m",
-						oldfile, newfile)));
-		return -1;
-	}
-#endif
-
-	/*
-	 * Make change persistent in case of an OS crash, both the new entry and
-	 * its parent directory need to be flushed.
-	 */
-	if (fsync_fname_ext(newfile, false, false, elevel) != 0)
-		return -1;
-
-	/* Same for parent directory */
-	if (fsync_parent_path(newfile, elevel) != 0)
-		return -1;
-
-	return 0;
-}
-
 /*
  * InitFileAccess --- initialize this module during backend startup
  *
diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h
index 84ce5a4a5d..830804fdfb 100644
--- a/src/include/pg_config_manual.h
+++ b/src/include/pg_config_manual.h
@@ -163,13 +163,6 @@
 #define USE_BARRIER_SMGRRELEASE
 #endif
 
-/*
- * Define this if your operating system supports link()
- */
-#if !defined(WIN32) && !defined(__CYGWIN__)
-#define HAVE_WORKING_LINK 1
-#endif
-
 /*
  * USE_POSIX_FADVISE controls whether Postgres will attempt to use the
  * posix_fadvise() kernel call.  Usually the automatic configure tests are
diff --git a/src/include/storage/fd.h b/src/include/storage/fd.h
index 69549b000f..2b4a8e0ffe 100644
--- a/src/include/storage/fd.h
+++ b/src/include/storage/fd.h
@@ -187,7 +187,6 @@ extern void fsync_fname(const char *fname, bool isdir);
 extern int	fsync_fname_ext(const char *fname, bool isdir, bool ignore_perm, int elevel);
 extern int	durable_rename(const char *oldfile, const char *newfile, int loglevel);
 extern int	durable_unlink(const char *fname, int loglevel);
-extern int	durable_rename_excl(const char *oldfile, const char *newfile, int loglevel);
 extern void SyncDataDirectory(void);
 extern int	data_sync_elevel(int elevel);
 
-- 
2.25.1


--k+w/mQv8wyuph6w0--





^ permalink  raw  reply  [nested|flat] 5+ messages in thread

* [PATCH v1 1/2] Revert "Teach DSM registry to ERROR if attaching to an uninitialized entry."
@ 2025-11-24 17:03 Nathan Bossart <nathan@postgresql.org>
  0 siblings, 0 replies; 5+ messages in thread

From: Nathan Bossart @ 2025-11-24 17:03 UTC (permalink / raw)

This reverts commit 1165a933aab1355757a43cfd9193b6cce06f573b.
---
 src/backend/storage/ipc/dsm_registry.c | 34 +++-----------------------
 1 file changed, 4 insertions(+), 30 deletions(-)

diff --git a/src/backend/storage/ipc/dsm_registry.c b/src/backend/storage/ipc/dsm_registry.c
index 7eba8a8cffb..a926b9c3f32 100644
--- a/src/backend/storage/ipc/dsm_registry.c
+++ b/src/backend/storage/ipc/dsm_registry.c
@@ -93,7 +93,6 @@ typedef struct DSMRegistryEntry
 {
 	char		name[NAMEDATALEN];
 	DSMREntryType type;
-	bool		initialized;
 	union
 	{
 		NamedDSMState dsm;
@@ -217,7 +216,6 @@ GetNamedDSMSegment(const char *name, size_t size,
 		dsm_segment *seg;
 
 		entry->type = DSMR_ENTRY_TYPE_DSM;
-		entry->initialized = false;
 
 		/* Initialize the segment. */
 		seg = dsm_create(size, 0);
@@ -230,21 +228,13 @@ GetNamedDSMSegment(const char *name, size_t size,
 
 		if (init_callback)
 			(*init_callback) (ret);
-
-		entry->initialized = true;
 	}
 	else if (entry->type != DSMR_ENTRY_TYPE_DSM)
 		ereport(ERROR,
-				(errmsg("requested DSM segment \"%s\" does not match type of existing entry",
-						name)));
-	else if (!entry->initialized)
-		ereport(ERROR,
-				(errmsg("requested DSM segment \"%s\" failed initialization",
-						name)));
+				(errmsg("requested DSM segment does not match type of existing entry")));
 	else if (entry->dsm.size != size)
 		ereport(ERROR,
-				(errmsg("requested DSM segment \"%s\" does not match size of existing entry",
-						name)));
+				(errmsg("requested DSM segment size does not match size of existing segment")));
 	else
 	{
 		NamedDSMState *state = &entry->dsm;
@@ -307,7 +297,6 @@ GetNamedDSA(const char *name, bool *found)
 		NamedDSAState *state = &entry->dsa;
 
 		entry->type = DSMR_ENTRY_TYPE_DSA;
-		entry->initialized = false;
 
 		/* Initialize the LWLock tranche for the DSA. */
 		state->tranche = LWLockNewTrancheId(name);
@@ -319,17 +308,10 @@ GetNamedDSA(const char *name, bool *found)
 
 		/* Store handle for other backends to use. */
 		state->handle = dsa_get_handle(ret);
-
-		entry->initialized = true;
 	}
 	else if (entry->type != DSMR_ENTRY_TYPE_DSA)
 		ereport(ERROR,
-				(errmsg("requested DSA \"%s\" does not match type of existing entry",
-						name)));
-	else if (!entry->initialized)
-		ereport(ERROR,
-				(errmsg("requested DSA \"%s\" failed initialization",
-						name)));
+				(errmsg("requested DSA does not match type of existing entry")));
 	else
 	{
 		NamedDSAState *state = &entry->dsa;
@@ -390,7 +372,6 @@ GetNamedDSHash(const char *name, const dshash_parameters *params, bool *found)
 		dsa_area   *dsa;
 
 		entry->type = DSMR_ENTRY_TYPE_DSH;
-		entry->initialized = false;
 
 		/* Initialize the LWLock tranche for the hash table. */
 		dsh_state->tranche = LWLockNewTrancheId(name);
@@ -408,17 +389,10 @@ GetNamedDSHash(const char *name, const dshash_parameters *params, bool *found)
 		/* Store handles for other backends to use. */
 		dsh_state->dsa_handle = dsa_get_handle(dsa);
 		dsh_state->dsh_handle = dshash_get_hash_table_handle(ret);
-
-		entry->initialized = true;
 	}
 	else if (entry->type != DSMR_ENTRY_TYPE_DSH)
 		ereport(ERROR,
-				(errmsg("requested DSHash \"%s\" does not match type of existing entry",
-						name)));
-	else if (!entry->initialized)
-		ereport(ERROR,
-				(errmsg("requested DSHash \"%s\" failed initialization",
-						name)));
+				(errmsg("requested DSHash does not match type of existing entry")));
 	else
 	{
 		NamedDSHState *dsh_state = &entry->dsh;
-- 
2.39.5 (Apple Git-154)


--RrQwG/d5bOC9SOJ1
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
	filename=v1-0002-handle-ERRORs-in-DSM-registry-functions.patch



^ permalink  raw  reply  [nested|flat] 5+ messages in thread

* [PATCH v2 1/2] Revert "Teach DSM registry to ERROR if attaching to an uninitialized entry."
@ 2025-11-24 17:03 Nathan Bossart <nathan@postgresql.org>
  0 siblings, 0 replies; 5+ messages in thread

From: Nathan Bossart @ 2025-11-24 17:03 UTC (permalink / raw)

This reverts commit 1165a933aab1355757a43cfd9193b6cce06f573b.
---
 src/backend/storage/ipc/dsm_registry.c | 34 +++-----------------------
 1 file changed, 4 insertions(+), 30 deletions(-)

diff --git a/src/backend/storage/ipc/dsm_registry.c b/src/backend/storage/ipc/dsm_registry.c
index 7eba8a8cffb..a926b9c3f32 100644
--- a/src/backend/storage/ipc/dsm_registry.c
+++ b/src/backend/storage/ipc/dsm_registry.c
@@ -93,7 +93,6 @@ typedef struct DSMRegistryEntry
 {
 	char		name[NAMEDATALEN];
 	DSMREntryType type;
-	bool		initialized;
 	union
 	{
 		NamedDSMState dsm;
@@ -217,7 +216,6 @@ GetNamedDSMSegment(const char *name, size_t size,
 		dsm_segment *seg;
 
 		entry->type = DSMR_ENTRY_TYPE_DSM;
-		entry->initialized = false;
 
 		/* Initialize the segment. */
 		seg = dsm_create(size, 0);
@@ -230,21 +228,13 @@ GetNamedDSMSegment(const char *name, size_t size,
 
 		if (init_callback)
 			(*init_callback) (ret);
-
-		entry->initialized = true;
 	}
 	else if (entry->type != DSMR_ENTRY_TYPE_DSM)
 		ereport(ERROR,
-				(errmsg("requested DSM segment \"%s\" does not match type of existing entry",
-						name)));
-	else if (!entry->initialized)
-		ereport(ERROR,
-				(errmsg("requested DSM segment \"%s\" failed initialization",
-						name)));
+				(errmsg("requested DSM segment does not match type of existing entry")));
 	else if (entry->dsm.size != size)
 		ereport(ERROR,
-				(errmsg("requested DSM segment \"%s\" does not match size of existing entry",
-						name)));
+				(errmsg("requested DSM segment size does not match size of existing segment")));
 	else
 	{
 		NamedDSMState *state = &entry->dsm;
@@ -307,7 +297,6 @@ GetNamedDSA(const char *name, bool *found)
 		NamedDSAState *state = &entry->dsa;
 
 		entry->type = DSMR_ENTRY_TYPE_DSA;
-		entry->initialized = false;
 
 		/* Initialize the LWLock tranche for the DSA. */
 		state->tranche = LWLockNewTrancheId(name);
@@ -319,17 +308,10 @@ GetNamedDSA(const char *name, bool *found)
 
 		/* Store handle for other backends to use. */
 		state->handle = dsa_get_handle(ret);
-
-		entry->initialized = true;
 	}
 	else if (entry->type != DSMR_ENTRY_TYPE_DSA)
 		ereport(ERROR,
-				(errmsg("requested DSA \"%s\" does not match type of existing entry",
-						name)));
-	else if (!entry->initialized)
-		ereport(ERROR,
-				(errmsg("requested DSA \"%s\" failed initialization",
-						name)));
+				(errmsg("requested DSA does not match type of existing entry")));
 	else
 	{
 		NamedDSAState *state = &entry->dsa;
@@ -390,7 +372,6 @@ GetNamedDSHash(const char *name, const dshash_parameters *params, bool *found)
 		dsa_area   *dsa;
 
 		entry->type = DSMR_ENTRY_TYPE_DSH;
-		entry->initialized = false;
 
 		/* Initialize the LWLock tranche for the hash table. */
 		dsh_state->tranche = LWLockNewTrancheId(name);
@@ -408,17 +389,10 @@ GetNamedDSHash(const char *name, const dshash_parameters *params, bool *found)
 		/* Store handles for other backends to use. */
 		dsh_state->dsa_handle = dsa_get_handle(dsa);
 		dsh_state->dsh_handle = dshash_get_hash_table_handle(ret);
-
-		entry->initialized = true;
 	}
 	else if (entry->type != DSMR_ENTRY_TYPE_DSH)
 		ereport(ERROR,
-				(errmsg("requested DSHash \"%s\" does not match type of existing entry",
-						name)));
-	else if (!entry->initialized)
-		ereport(ERROR,
-				(errmsg("requested DSHash \"%s\" failed initialization",
-						name)));
+				(errmsg("requested DSHash does not match type of existing entry")));
 	else
 	{
 		NamedDSHState *dsh_state = &entry->dsh;
-- 
2.39.5 (Apple Git-154)


--POf/bFZrFFck8lM9
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
	filename=v2-0002-handle-ERRORs-in-DSM-registry-functions.patch



^ permalink  raw  reply  [nested|flat] 5+ messages in thread

* [PATCH v3 1/2] Revert "Teach DSM registry to ERROR if attaching to an uninitialized entry."
@ 2025-11-24 17:03 Nathan Bossart <nathan@postgresql.org>
  0 siblings, 0 replies; 5+ messages in thread

From: Nathan Bossart @ 2025-11-24 17:03 UTC (permalink / raw)

This reverts commit 1165a933aab1355757a43cfd9193b6cce06f573b.
---
 src/backend/storage/ipc/dsm_registry.c | 34 +++-----------------------
 1 file changed, 4 insertions(+), 30 deletions(-)

diff --git a/src/backend/storage/ipc/dsm_registry.c b/src/backend/storage/ipc/dsm_registry.c
index 7eba8a8cffb..a926b9c3f32 100644
--- a/src/backend/storage/ipc/dsm_registry.c
+++ b/src/backend/storage/ipc/dsm_registry.c
@@ -93,7 +93,6 @@ typedef struct DSMRegistryEntry
 {
 	char		name[NAMEDATALEN];
 	DSMREntryType type;
-	bool		initialized;
 	union
 	{
 		NamedDSMState dsm;
@@ -217,7 +216,6 @@ GetNamedDSMSegment(const char *name, size_t size,
 		dsm_segment *seg;
 
 		entry->type = DSMR_ENTRY_TYPE_DSM;
-		entry->initialized = false;
 
 		/* Initialize the segment. */
 		seg = dsm_create(size, 0);
@@ -230,21 +228,13 @@ GetNamedDSMSegment(const char *name, size_t size,
 
 		if (init_callback)
 			(*init_callback) (ret);
-
-		entry->initialized = true;
 	}
 	else if (entry->type != DSMR_ENTRY_TYPE_DSM)
 		ereport(ERROR,
-				(errmsg("requested DSM segment \"%s\" does not match type of existing entry",
-						name)));
-	else if (!entry->initialized)
-		ereport(ERROR,
-				(errmsg("requested DSM segment \"%s\" failed initialization",
-						name)));
+				(errmsg("requested DSM segment does not match type of existing entry")));
 	else if (entry->dsm.size != size)
 		ereport(ERROR,
-				(errmsg("requested DSM segment \"%s\" does not match size of existing entry",
-						name)));
+				(errmsg("requested DSM segment size does not match size of existing segment")));
 	else
 	{
 		NamedDSMState *state = &entry->dsm;
@@ -307,7 +297,6 @@ GetNamedDSA(const char *name, bool *found)
 		NamedDSAState *state = &entry->dsa;
 
 		entry->type = DSMR_ENTRY_TYPE_DSA;
-		entry->initialized = false;
 
 		/* Initialize the LWLock tranche for the DSA. */
 		state->tranche = LWLockNewTrancheId(name);
@@ -319,17 +308,10 @@ GetNamedDSA(const char *name, bool *found)
 
 		/* Store handle for other backends to use. */
 		state->handle = dsa_get_handle(ret);
-
-		entry->initialized = true;
 	}
 	else if (entry->type != DSMR_ENTRY_TYPE_DSA)
 		ereport(ERROR,
-				(errmsg("requested DSA \"%s\" does not match type of existing entry",
-						name)));
-	else if (!entry->initialized)
-		ereport(ERROR,
-				(errmsg("requested DSA \"%s\" failed initialization",
-						name)));
+				(errmsg("requested DSA does not match type of existing entry")));
 	else
 	{
 		NamedDSAState *state = &entry->dsa;
@@ -390,7 +372,6 @@ GetNamedDSHash(const char *name, const dshash_parameters *params, bool *found)
 		dsa_area   *dsa;
 
 		entry->type = DSMR_ENTRY_TYPE_DSH;
-		entry->initialized = false;
 
 		/* Initialize the LWLock tranche for the hash table. */
 		dsh_state->tranche = LWLockNewTrancheId(name);
@@ -408,17 +389,10 @@ GetNamedDSHash(const char *name, const dshash_parameters *params, bool *found)
 		/* Store handles for other backends to use. */
 		dsh_state->dsa_handle = dsa_get_handle(dsa);
 		dsh_state->dsh_handle = dshash_get_hash_table_handle(ret);
-
-		entry->initialized = true;
 	}
 	else if (entry->type != DSMR_ENTRY_TYPE_DSH)
 		ereport(ERROR,
-				(errmsg("requested DSHash \"%s\" does not match type of existing entry",
-						name)));
-	else if (!entry->initialized)
-		ereport(ERROR,
-				(errmsg("requested DSHash \"%s\" failed initialization",
-						name)));
+				(errmsg("requested DSHash does not match type of existing entry")));
 	else
 	{
 		NamedDSHState *dsh_state = &entry->dsh;
-- 
2.39.5 (Apple Git-154)


--c08aH/hgV4/mNMsI
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
	filename=v3-0002-handle-ERRORs-in-DSM-registry-functions.patch



^ permalink  raw  reply  [nested|flat] 5+ messages in thread

* [PATCH v4 1/2] Revert "Teach DSM registry to ERROR if attaching to an uninitialized entry."
@ 2025-11-24 17:03 Nathan Bossart <nathan@postgresql.org>
  0 siblings, 0 replies; 5+ messages in thread

From: Nathan Bossart @ 2025-11-24 17:03 UTC (permalink / raw)

This reverts commit 1165a933aab1355757a43cfd9193b6cce06f573b.
---
 src/backend/storage/ipc/dsm_registry.c | 34 +++-----------------------
 1 file changed, 4 insertions(+), 30 deletions(-)

diff --git a/src/backend/storage/ipc/dsm_registry.c b/src/backend/storage/ipc/dsm_registry.c
index 7eba8a8cffb..a926b9c3f32 100644
--- a/src/backend/storage/ipc/dsm_registry.c
+++ b/src/backend/storage/ipc/dsm_registry.c
@@ -93,7 +93,6 @@ typedef struct DSMRegistryEntry
 {
 	char		name[NAMEDATALEN];
 	DSMREntryType type;
-	bool		initialized;
 	union
 	{
 		NamedDSMState dsm;
@@ -217,7 +216,6 @@ GetNamedDSMSegment(const char *name, size_t size,
 		dsm_segment *seg;
 
 		entry->type = DSMR_ENTRY_TYPE_DSM;
-		entry->initialized = false;
 
 		/* Initialize the segment. */
 		seg = dsm_create(size, 0);
@@ -230,21 +228,13 @@ GetNamedDSMSegment(const char *name, size_t size,
 
 		if (init_callback)
 			(*init_callback) (ret);
-
-		entry->initialized = true;
 	}
 	else if (entry->type != DSMR_ENTRY_TYPE_DSM)
 		ereport(ERROR,
-				(errmsg("requested DSM segment \"%s\" does not match type of existing entry",
-						name)));
-	else if (!entry->initialized)
-		ereport(ERROR,
-				(errmsg("requested DSM segment \"%s\" failed initialization",
-						name)));
+				(errmsg("requested DSM segment does not match type of existing entry")));
 	else if (entry->dsm.size != size)
 		ereport(ERROR,
-				(errmsg("requested DSM segment \"%s\" does not match size of existing entry",
-						name)));
+				(errmsg("requested DSM segment size does not match size of existing segment")));
 	else
 	{
 		NamedDSMState *state = &entry->dsm;
@@ -307,7 +297,6 @@ GetNamedDSA(const char *name, bool *found)
 		NamedDSAState *state = &entry->dsa;
 
 		entry->type = DSMR_ENTRY_TYPE_DSA;
-		entry->initialized = false;
 
 		/* Initialize the LWLock tranche for the DSA. */
 		state->tranche = LWLockNewTrancheId(name);
@@ -319,17 +308,10 @@ GetNamedDSA(const char *name, bool *found)
 
 		/* Store handle for other backends to use. */
 		state->handle = dsa_get_handle(ret);
-
-		entry->initialized = true;
 	}
 	else if (entry->type != DSMR_ENTRY_TYPE_DSA)
 		ereport(ERROR,
-				(errmsg("requested DSA \"%s\" does not match type of existing entry",
-						name)));
-	else if (!entry->initialized)
-		ereport(ERROR,
-				(errmsg("requested DSA \"%s\" failed initialization",
-						name)));
+				(errmsg("requested DSA does not match type of existing entry")));
 	else
 	{
 		NamedDSAState *state = &entry->dsa;
@@ -390,7 +372,6 @@ GetNamedDSHash(const char *name, const dshash_parameters *params, bool *found)
 		dsa_area   *dsa;
 
 		entry->type = DSMR_ENTRY_TYPE_DSH;
-		entry->initialized = false;
 
 		/* Initialize the LWLock tranche for the hash table. */
 		dsh_state->tranche = LWLockNewTrancheId(name);
@@ -408,17 +389,10 @@ GetNamedDSHash(const char *name, const dshash_parameters *params, bool *found)
 		/* Store handles for other backends to use. */
 		dsh_state->dsa_handle = dsa_get_handle(dsa);
 		dsh_state->dsh_handle = dshash_get_hash_table_handle(ret);
-
-		entry->initialized = true;
 	}
 	else if (entry->type != DSMR_ENTRY_TYPE_DSH)
 		ereport(ERROR,
-				(errmsg("requested DSHash \"%s\" does not match type of existing entry",
-						name)));
-	else if (!entry->initialized)
-		ereport(ERROR,
-				(errmsg("requested DSHash \"%s\" failed initialization",
-						name)));
+				(errmsg("requested DSHash does not match type of existing entry")));
 	else
 	{
 		NamedDSHState *dsh_state = &entry->dsh;
-- 
2.39.5 (Apple Git-154)


--kUugHEtL9xji53W5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
	filename=v4-0002-handle-ERRORs-in-DSM-registry-functions.patch



^ permalink  raw  reply  [nested|flat] 5+ messages in thread


end of thread, other threads:[~2025-11-24 17:03 UTC | newest]

Thread overview: 5+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2022-04-26 19:38 [PATCH v4 2/2] Remove durable_rename_excl(). Nathan Bossart <nathandbossart@gmail.com>
2025-11-24 17:03 [PATCH v1 1/2] Revert "Teach DSM registry to ERROR if attaching to an uninitialized entry." Nathan Bossart <nathan@postgresql.org>
2025-11-24 17:03 [PATCH v2 1/2] Revert "Teach DSM registry to ERROR if attaching to an uninitialized entry." Nathan Bossart <nathan@postgresql.org>
2025-11-24 17:03 [PATCH v3 1/2] Revert "Teach DSM registry to ERROR if attaching to an uninitialized entry." Nathan Bossart <nathan@postgresql.org>
2025-11-24 17:03 [PATCH v4 1/2] Revert "Teach DSM registry to ERROR if attaching to an uninitialized entry." Nathan Bossart <nathan@postgresql.org>

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox