From 1ec5b6c890f2c2da08f49ba227b3fe9307b555ed Mon Sep 17 00:00:00 2001 From: Marco Slot Date: Sat, 24 Nov 2018 03:40:09 +0100 Subject: [PATCH] Remove old worker_hash_partition_table API --- .../distributed/citus--8.0-10--8.0-11.sql | 1 + .../worker/worker_partition_protocol.c | 96 +++---------------- 2 files changed, 12 insertions(+), 85 deletions(-) diff --git a/src/backend/distributed/citus--8.0-10--8.0-11.sql b/src/backend/distributed/citus--8.0-10--8.0-11.sql index 3a2ccc112..d96d45b46 100644 --- a/src/backend/distributed/citus--8.0-10--8.0-11.sql +++ b/src/backend/distributed/citus--8.0-10--8.0-11.sql @@ -2,6 +2,7 @@ SET search_path = 'pg_catalog'; -- Deprecated functions +DROP FUNCTION IF EXISTS worker_hash_partition_table(bigint,integer,text,text,oid,integer); DROP FUNCTION IF EXISTS worker_foreign_file_path(text); DROP FUNCTION IF EXISTS worker_find_block_local_path(bigint,text[]); DROP FUNCTION IF EXISTS worker_fetch_query_results_file(bigint,integer,integer,text,integer); diff --git a/src/backend/distributed/worker/worker_partition_protocol.c b/src/backend/distributed/worker/worker_partition_protocol.c index d5ca9b44f..0482ff3a9 100644 --- a/src/backend/distributed/worker/worker_partition_protocol.c +++ b/src/backend/distributed/worker/worker_partition_protocol.c @@ -80,7 +80,6 @@ static void OutputBinaryHeaders(FileOutputStream *partitionFileArray, uint32 fil static void OutputBinaryFooters(FileOutputStream *partitionFileArray, uint32 fileCount); static uint32 RangePartitionId(Datum partitionValue, const void *context); static uint32 HashPartitionId(Datum partitionValue, const void *context); -static uint32 HashPartitionIdViaDeprecatedAPI(Datum partitionValue, const void *context); static StringInfo UserPartitionFilename(StringInfo directoryName, uint32 partitionId); static bool FileIsLink(char *filename, struct stat filestat); @@ -187,71 +186,32 @@ worker_hash_partition_table(PG_FUNCTION_ARGS) text *filterQueryText = PG_GETARG_TEXT_P(2); text *partitionColumnText = PG_GETARG_TEXT_P(3); Oid partitionColumnType = PG_GETARG_OID(4); - ArrayType *hashRangeObject = NULL; + ArrayType *hashRangeObject = PG_GETARG_ARRAYTYPE_P(5); const char *filterQuery = text_to_cstring(filterQueryText); const char *partitionColumn = text_to_cstring(partitionColumnText); HashPartitionContext *partitionContext = NULL; FmgrInfo *hashFunction = NULL; - Datum *hashRangeArray = NULL; - int32 partitionCount = 0; + Datum *hashRangeArray = DeconstructArrayObject(hashRangeObject); + int32 partitionCount = ArrayObjectCount(hashRangeObject); StringInfo taskDirectory = NULL; StringInfo taskAttemptDirectory = NULL; FileOutputStream *partitionFileArray = NULL; uint32 fileCount = 0; - uint32 (*HashPartitionIdFunction)(Datum, const void *); - - Oid partitionBucketOid = InvalidOid; + uint32 (*hashPartitionIdFunction)(Datum, const void *); CheckCitusVersion(ERROR); partitionContext = palloc0(sizeof(HashPartitionContext)); + partitionContext->syntheticShardIntervalArray = + SyntheticShardIntervalArrayForShardMinValues(hashRangeArray, partitionCount); + partitionContext->hasUniformHashDistribution = + HasUniformHashDistribution(partitionContext->syntheticShardIntervalArray, + partitionCount); - /* - * We do this hack for backward compatibility. - * - * In the older versions of Citus, worker_hash_partition_table()'s 6th parameter - * was an integer which denoted the number of buckets to split the shard's data. - * In the later versions of Citus, the sixth parameter is changed to get an array - * of shard ranges, which is used as the ranges to split the shard's data. - * - * Keeping this value is important if the coordinator's Citus version is <= 7.3 - * and worker Citus version is > 7.3. - */ - partitionBucketOid = get_fn_expr_argtype(fcinfo->flinfo, 5); - if (partitionBucketOid == INT4ARRAYOID) - { - hashRangeObject = PG_GETARG_ARRAYTYPE_P(5); - - hashRangeArray = DeconstructArrayObject(hashRangeObject); - partitionCount = ArrayObjectCount(hashRangeObject); - - partitionContext->syntheticShardIntervalArray = - SyntheticShardIntervalArrayForShardMinValues(hashRangeArray, partitionCount); - partitionContext->hasUniformHashDistribution = - HasUniformHashDistribution(partitionContext->syntheticShardIntervalArray, - partitionCount); - - HashPartitionIdFunction = &HashPartitionId; - } - else if (partitionBucketOid == INT4OID) - { - partitionCount = PG_GETARG_UINT32(5); - - partitionContext->syntheticShardIntervalArray = - GenerateSyntheticShardIntervalArray(partitionCount); - partitionContext->hasUniformHashDistribution = true; - - HashPartitionIdFunction = &HashPartitionIdViaDeprecatedAPI; - } - else - { - /* we should never get other type of parameters */ - ereport(ERROR, (errmsg("unexpected parameter for " - "worker_hash_partition_table()"))); - } + hashPartitionIdFunction = &HashPartitionId; /* use column's type information to get the hashing function */ hashFunction = GetFunctionInfo(partitionColumnType, HASH_AM_OID, HASHSTANDARD_PROC); @@ -278,7 +238,7 @@ worker_hash_partition_table(PG_FUNCTION_ARGS) /* call the partitioning function that does the actual work */ FilterAndPartitionTable(filterQuery, partitionColumn, partitionColumnType, - HashPartitionIdFunction, (const void *) partitionContext, + hashPartitionIdFunction, (const void *) partitionContext, partitionFileArray, fileCount); /* close partition files and atomically rename (commit) them */ @@ -1318,37 +1278,3 @@ HashPartitionId(Datum partitionValue, const void *context) return hashPartitionId; } - - -/* - * HashPartitionIdViaDeprecatedAPI is required to provide backward compatibility - * between the Citus versions 7.4 and older versions. - * - * HashPartitionIdViaDeprecatedAPI determines the partition number for the given data value - * using hash partitioning. More specifically, the function returns zero if the - * given data value is null. If not, the function applies the standard Postgres - * hashing function for the given data type, and mods the hashed result with the - * number of partitions. The function then returns the modded number as the - * partition number. - * - * Note that any changes to PostgreSQL's hashing functions will reshuffle the - * entire distribution created by this function. For a discussion of this issue, - * see Google "PL/Proxy Users: Hash Functions Have Changed in PostgreSQL 8.4." - */ -static uint32 -HashPartitionIdViaDeprecatedAPI(Datum partitionValue, const void *context) -{ - HashPartitionContext *hashPartitionContext = (HashPartitionContext *) context; - FmgrInfo *hashFunction = hashPartitionContext->hashFunction; - uint32 partitionCount = hashPartitionContext->partitionCount; - Datum hashDatum = 0; - uint32 hashResult = 0; - uint32 hashPartitionId = 0; - - /* hash functions return unsigned 32-bit integers */ - hashDatum = FunctionCall1(hashFunction, partitionValue); - hashResult = DatumGetUInt32(hashDatum); - hashPartitionId = (hashResult % partitionCount); - - return hashPartitionId; -}