diff --git a/src/backend/distributed/utils/citus_outfuncs.c b/src/backend/distributed/utils/citus_outfuncs.c index 06fb2ef72..ecb4150ba 100644 --- a/src/backend/distributed/utils/citus_outfuncs.c +++ b/src/backend/distributed/utils/citus_outfuncs.c @@ -473,6 +473,10 @@ OutShardPlacement(OUTFUNC_ARGS) WRITE_ENUM_FIELD(shardState, RelayFileState); WRITE_STRING_FIELD(nodeName); WRITE_UINT_FIELD(nodePort); + /* so we can deal with 0 */ + WRITE_INT_FIELD(partitionMethod); + WRITE_UINT_FIELD(colocationGroupId); + WRITE_UINT_FIELD(representativeValue); } diff --git a/src/backend/distributed/utils/citus_readfuncs.c b/src/backend/distributed/utils/citus_readfuncs.c index e7dc31e60..c430df0cb 100644 --- a/src/backend/distributed/utils/citus_readfuncs.c +++ b/src/backend/distributed/utils/citus_readfuncs.c @@ -268,6 +268,10 @@ ReadShardPlacement(READFUNC_ARGS) READ_ENUM_FIELD(shardState, RelayFileState); READ_STRING_FIELD(nodeName); READ_UINT_FIELD(nodePort); + /* so we can deal with 0 */ + READ_INT_FIELD(partitionMethod); + READ_UINT_FIELD(colocationGroupId); + READ_UINT_FIELD(representativeValue); READ_DONE(); } diff --git a/src/backend/distributed/utils/metadata_cache.c b/src/backend/distributed/utils/metadata_cache.c index 98623fc5d..21ff34447 100644 --- a/src/backend/distributed/utils/metadata_cache.c +++ b/src/backend/distributed/utils/metadata_cache.c @@ -703,9 +703,31 @@ BuildCachedShardList(DistTableCacheEntry *cacheEntry) foreach(placementCell, placementList) { ShardPlacement *srcPlacement = (ShardPlacement *) lfirst(placementCell); + ShardPlacement *dstPlacement = &placementArray[placementOffset]; - CopyShardPlacement(srcPlacement, &placementArray[placementOffset]); + CopyShardPlacement(srcPlacement, dstPlacement); + /* fill in remaining fields */ + Assert(cacheEntry->partitionMethod != 0); + dstPlacement->partitionMethod = cacheEntry->partitionMethod; + dstPlacement->colocationGroupId = cacheEntry->colocationId; + if (cacheEntry->partitionMethod == DISTRIBUTE_BY_HASH) + { + Assert(shardInterval->minValueExists); + Assert(shardInterval->valueTypeId == INT4OID); + + /* + * Use the lower boundary of the interval's range to identify + * it for colocation purposes. That remains meaningful even if + * a concurrent session splits a shard. + */ + dstPlacement->representativeValue = + DatumGetInt32(shardInterval->minValue); + } + else + { + dstPlacement->representativeValue = 0; + } placementOffset++; } MemoryContextSwitchTo(oldContext); diff --git a/src/include/distributed/master_metadata_utility.h b/src/include/distributed/master_metadata_utility.h index 696016f78..8198e677c 100644 --- a/src/include/distributed/master_metadata_utility.h +++ b/src/include/distributed/master_metadata_utility.h @@ -53,6 +53,9 @@ typedef struct ShardPlacement RelayFileState shardState; char *nodeName; uint32 nodePort; + char partitionMethod; + uint32 colocationGroupId; + uint32 representativeValue; } ShardPlacement;