mirror of https://github.com/citusdata/citus.git
Refactor EnsureLocalTableEmptyIfNecessary (#3830)
parent
8f3373c702
commit
249550b815
|
@ -102,7 +102,9 @@ static void EnsureTableNotDistributed(Oid relationId);
|
||||||
static Oid SupportFunctionForColumn(Var *partitionColumn, Oid accessMethodId,
|
static Oid SupportFunctionForColumn(Var *partitionColumn, Oid accessMethodId,
|
||||||
int16 supportFunctionNumber);
|
int16 supportFunctionNumber);
|
||||||
static void EnsureLocalTableEmptyIfNecessary(Oid relationId, char distributionMethod,
|
static void EnsureLocalTableEmptyIfNecessary(Oid relationId, char distributionMethod,
|
||||||
bool viaDepracatedAPI);
|
bool viaDeprecatedAPI);
|
||||||
|
static bool ShouldLocalTableBeEmpty(Oid relationId, char distributionMethod, bool
|
||||||
|
viaDeprecatedAPI);
|
||||||
static bool LocalTableEmpty(Oid tableId);
|
static bool LocalTableEmpty(Oid tableId);
|
||||||
static void CopyLocalDataIntoShards(Oid relationId);
|
static void CopyLocalDataIntoShards(Oid relationId);
|
||||||
static List * TupleDescColumnNameList(TupleDesc tupleDescriptor);
|
static List * TupleDescColumnNameList(TupleDesc tupleDescriptor);
|
||||||
|
@ -849,33 +851,57 @@ EnsureTableCanBeColocatedWith(Oid relationId, char replicationModel,
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* EnsureLocalTableEmptyIfNecessary only checks for emptiness if only an empty
|
* EnsureLocalTableEmptyIfNecessary errors out if the function should be empty
|
||||||
* relation can be distributed in given configuration.
|
* according to ShouldLocalTableBeEmpty but it is not.
|
||||||
*
|
|
||||||
* In some cases, it is possible and safe to send local data to shards while
|
|
||||||
* distributing the table. In those cases, we can distribute non-empty local
|
|
||||||
* tables. This function checks the distributionMethod and relation kind to
|
|
||||||
* see whether we need to be ensure emptiness of local table. If we need to
|
|
||||||
* be sure, this function calls EnsureLocalTableEmpty function to ensure
|
|
||||||
* that local table does not contain any data.
|
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
EnsureLocalTableEmptyIfNecessary(Oid relationId, char distributionMethod,
|
EnsureLocalTableEmptyIfNecessary(Oid relationId, char distributionMethod,
|
||||||
bool viaDepracatedAPI)
|
bool viaDeprecatedAPI)
|
||||||
{
|
{
|
||||||
if (viaDepracatedAPI)
|
if (ShouldLocalTableBeEmpty(relationId, distributionMethod, viaDeprecatedAPI))
|
||||||
{
|
{
|
||||||
EnsureLocalTableEmpty(relationId);
|
EnsureLocalTableEmpty(relationId);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ShouldLocalTableBeEmpty returns true if the local table should be empty
|
||||||
|
* before creating a citus table.
|
||||||
|
* In some cases, it is possible and safe to send local data to shards while
|
||||||
|
* distributing the table. In those cases, we can distribute non-empty local
|
||||||
|
* tables. This function checks the distributionMethod and relation kind to
|
||||||
|
* see whether we need to be ensure emptiness of local table.
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
ShouldLocalTableBeEmpty(Oid relationId, char distributionMethod,
|
||||||
|
bool viaDeprecatedAPI)
|
||||||
|
{
|
||||||
|
bool shouldLocalTableBeEmpty = false;
|
||||||
|
if (viaDeprecatedAPI)
|
||||||
|
{
|
||||||
|
/* we don't support copying local data via deprecated API */
|
||||||
|
shouldLocalTableBeEmpty = true;
|
||||||
|
}
|
||||||
else if (distributionMethod != DISTRIBUTE_BY_HASH &&
|
else if (distributionMethod != DISTRIBUTE_BY_HASH &&
|
||||||
distributionMethod != DISTRIBUTE_BY_NONE)
|
distributionMethod != DISTRIBUTE_BY_NONE)
|
||||||
{
|
{
|
||||||
EnsureLocalTableEmpty(relationId);
|
/*
|
||||||
|
* We only support hash distributed tables and reference tables
|
||||||
|
* for initial data loading
|
||||||
|
*/
|
||||||
|
shouldLocalTableBeEmpty = true;
|
||||||
}
|
}
|
||||||
else if (!RegularTable(relationId))
|
else if (!RegularTable(relationId))
|
||||||
{
|
{
|
||||||
EnsureLocalTableEmpty(relationId);
|
/*
|
||||||
|
* We only support tables and partitioned tables for initial
|
||||||
|
* data loading
|
||||||
|
*/
|
||||||
|
shouldLocalTableBeEmpty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return shouldLocalTableBeEmpty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue