You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudberry.apache.org by ch...@apache.org on 2025/10/15 14:05:24 UTC

(cloudberry) branch cbdb-postgres-merge updated: Add tuple lock in table may be inplace update

This is an automated email from the ASF dual-hosted git repository.

chenjinbao1989 pushed a commit to branch cbdb-postgres-merge
in repository https://gitbox.apache.org/repos/asf/cloudberry.git


The following commit(s) were added to refs/heads/cbdb-postgres-merge by this push:
     new 2465a15f86e Add tuple lock in table may be inplace update
2465a15f86e is described below

commit 2465a15f86e5b25a7a877a8468bb4ecf55f7d822
Author: Jinbao Chen <ch...@gmail.com>
AuthorDate: Wed Oct 15 22:05:10 2025 +0800

    Add tuple lock in table may be inplace update
---
 src/backend/executor/nodeModifyTable.c | 14 ++++++++-
 src/bin/initdb/initdb.c                | 52 ++++++++++++++++++----------------
 2 files changed, 40 insertions(+), 26 deletions(-)

diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 675e5bf47ad..c41e5bd67eb 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -3895,6 +3895,7 @@ ExecModifyTable(PlanState *pstate)
 	HeapTupleData oldtupdata;
 	HeapTuple	oldtuple;
 	ItemPointer tupleid;
+	bool		tuplock;
 	List	   *relinfos = NIL;
 	ListCell   *lc;
 	PartitionTupleRouting *proute = node->mt_partition_tuple_routing;
@@ -4223,6 +4224,8 @@ ExecModifyTable(PlanState *pstate)
 				break;
 
 			case CMD_UPDATE:
+				tuplock = false;
+				
 				if (!AttributeNumberIsValid(action_attno))
 				{
 					/* normal non-split UPDATE */
@@ -4237,6 +4240,7 @@ ExecModifyTable(PlanState *pstate)
 					oldSlot = resultRelInfo->ri_oldTupleSlot;
 					if (oldtuple != NULL)
 					{
+						Assert(!resultRelInfo->ri_needLockTagTuple);
 						/* Use the wholerow junk attr as the old tuple. */
 						ExecForceStoreHeapTuple(oldtuple, oldSlot, false);
 					}
@@ -4245,7 +4249,11 @@ ExecModifyTable(PlanState *pstate)
 						/* Fetch the most recent version of old tuple. */
 						Relation	relation = resultRelInfo->ri_RelationDesc;
 
-						Assert(tupleid != NULL);
+						if (resultRelInfo->ri_needLockTagTuple)
+						{
+							LockTuple(relation, tupleid, InplaceUpdateTupleLock);
+							tuplock = true;
+						}
 						if (!table_tuple_fetch_row_version(relation, tupleid,
 														   SnapshotAny,
 														   oldSlot))
@@ -4253,10 +4261,14 @@ ExecModifyTable(PlanState *pstate)
 					}
 					slot = ExecGetUpdateNewTuple(resultRelInfo, context.planSlot,
 												 oldSlot);
+					context.relaction = NULL;
 
 					/* Now apply the update. */
 					slot = ExecUpdate(&context, resultRelInfo, tupleid, oldtuple,
 									  slot, segid, node->canSetTag);
+					if (tuplock)
+						UnlockTuple(resultRelInfo->ri_RelationDesc, tupleid,
+									InplaceUpdateTupleLock);
 				}
 				else if (action == DML_INSERT)
 				{
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index c6818fdf71e..e360e2d91c2 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -301,8 +301,8 @@ static void set_info_version(void);
 static void setup_schema(FILE *cmdfd);
 static void setup_cdb_schema(FILE *cmdfd);
 static void setup_password_history(FILE *cmdfd);
-static void load_plpgsql(FILE *cmdfd);
-static void vacuum_db(FILE *cmdfd);
+//static void load_plpgsql(FILE *cmdfd);
+//static void vacuum_db(FILE *cmdfd);
 static void make_template0(FILE *cmdfd);
 static void make_postgres(FILE *cmdfd);
 static void trapsig(SIGNAL_ARGS);
@@ -2142,6 +2142,8 @@ setup_cdb_schema(FILE *cmdfd)
 			free(*line);
 		}
 
+		PG_CMD_PUTS("\n");
+		
 		free(lines);
 		free(path);
 	}
@@ -2150,30 +2152,30 @@ setup_cdb_schema(FILE *cmdfd)
 /*
  * load PL/pgSQL server-side language
  */
-static void
-load_plpgsql(FILE *cmdfd)
-{
-	PG_CMD_PUTS("CREATE EXTENSION plpgsql;\n\n");
-}
+//static void
+//load_plpgsql(FILE *cmdfd)
+//{
+//	PG_CMD_PUTS("CREATE EXTENSION plpgsql;\n\n");
+//}
 
 /*
  * GPDB: load external table support
  */
-static void
-load_exttable(FILE *cmdfd)
-{
-	PG_CMD_PUTS("CREATE EXTENSION gp_exttable_fdw;\n\n");
-}
+//static void
+//load_exttable(FILE *cmdfd)
+//{
+//	PG_CMD_PUTS("CREATE EXTENSION gp_exttable_fdw;\n\n");
+//}
 
 /*
  * clean everything up in template1
  */
-static void
-vacuum_db(FILE *cmdfd)
-{
-	/* Run analyze before VACUUM so the statistics are frozen. */
-	PG_CMD_PUTS("ANALYZE;\n\nVACUUM FREEZE;\n\n");
-}
+//static void
+//vacuum_db(FILE *cmdfd)
+//{
+//	/* Run analyze before VACUUM so the statistics are frozen. */
+//	PG_CMD_PUTS("ANALYZE;\n\nVACUUM FREEZE;\n\n");
+//}
 
 /*
  * copy template1 to template0
@@ -2226,7 +2228,7 @@ make_template0(FILE *cmdfd)
 	/*
 	 * Finally vacuum to clean up dead rows in pg_database
 	 */
-	PG_CMD_PUTS("VACUUM pg_database;\n\n");
+	// PG_CMD_PUTS("VACUUM pg_database;\n\n");
 }
 
 /*
@@ -2245,7 +2247,7 @@ make_postgres(FILE *cmdfd)
 	PG_CMD_PUTS("UPDATE pg_database SET "
 				"	datistemplate = 't' "
 				"    WHERE datname = 'postgres';\n\n");
-	PG_CMD_PUTS("VACUUM FULL pg_database;\n\n");
+	//PG_CMD_PUTS("VACUUM FULL pg_database;\n\n");
 }
 
 /*
@@ -3410,14 +3412,14 @@ initialize_data_directory(void)
 
 	setup_schema(cmdfd);
 
-	load_plpgsql(cmdfd);
-
-	load_exttable(cmdfd);
+//	load_plpgsql(cmdfd);
+//
+//	load_exttable(cmdfd);
 
 	/* sets up the Apache Cloudberry admin schema */
 	setup_cdb_schema(cmdfd);
 
-	vacuum_db(cmdfd);
+//	vacuum_db(cmdfd);
 
 	make_template0(cmdfd);
 
@@ -3427,7 +3429,7 @@ initialize_data_directory(void)
 	 * vacuum template1 to remove the dead tuples. otherwise, some mismatch error 
 	 * will be reported in gp_replica_check.
 	 */
-	vacuum_db(cmdfd);
+//	vacuum_db(cmdfd);
 
 	PG_CMD_CLOSE;
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org