From 0d196d1bf4da89251ea06a79c24014732186c054 Mon Sep 17 00:00:00 2001 From: Jason Petersen Date: Tue, 16 Feb 2016 11:20:18 -0700 Subject: [PATCH] Ensure router executor acquires proper shard lock Though Citus' Task struct has a shardId field, it doesn't have the same semantics as the one previously used in pg_shard code. The analogous field in the Citus Task is anchorShardId. I've also added an argument check to the relevant locking function to catch future locking attempts which pass an invalid argument. --- src/backend/distributed/executor/multi_router_executor.c | 2 +- src/backend/distributed/utils/resource_lock.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/backend/distributed/executor/multi_router_executor.c b/src/backend/distributed/executor/multi_router_executor.c index 5c2f04165..d9900798f 100644 --- a/src/backend/distributed/executor/multi_router_executor.c +++ b/src/backend/distributed/executor/multi_router_executor.c @@ -153,7 +153,7 @@ CommutativityRuleToLockMode(CmdType commandType, bool upsertQuery) static void AcquireExecutorShardLock(Task *task, LOCKMODE lockMode) { - int64 shardId = task->shardId; + int64 shardId = task->anchorShardId; LockShardResource(shardId, lockMode); } diff --git a/src/backend/distributed/utils/resource_lock.c b/src/backend/distributed/utils/resource_lock.c index a2552d46b..fecd703d1 100644 --- a/src/backend/distributed/utils/resource_lock.c +++ b/src/backend/distributed/utils/resource_lock.c @@ -14,9 +14,10 @@ */ #include "postgres.h" - +#include "c.h" #include "miscadmin.h" +#include "distributed/relay_utility.h" #include "distributed/resource_lock.h" #include "storage/lmgr.h" @@ -68,6 +69,8 @@ LockShardResource(uint64 shardId, LOCKMODE lockmode) const bool sessionLock = false; const bool dontWait = false; + AssertArg(shardId != INVALID_SHARD_ID); + SET_LOCKTAG_SHARD_RESOURCE(tag, MyDatabaseId, shardId); (void) LockAcquire(&tag, lockmode, sessionLock, dontWait);