citus/src/include/distributed/shard_transfer.h

86 lines
3.5 KiB
C

/*-------------------------------------------------------------------------
*
* shard_transfer.h
* Code used to move shards around.
*
* Copyright (c) Citus Data, Inc.
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "nodes/pg_list.h"
#include "distributed/shard_rebalancer.h"
extern Datum citus_move_shard_placement(PG_FUNCTION_ARGS);
extern Datum citus_move_shard_placement_with_nodeid(PG_FUNCTION_ARGS);
typedef enum
{
SHARD_TRANSFER_INVALID_FIRST = 0,
SHARD_TRANSFER_MOVE = 1,
SHARD_TRANSFER_COPY = 2
} ShardTransferType;
/*
* ShardTransferOperationMode is used to pass flags to the shard transfer
* function. The flags are used to control the behavior of the transfer
* function.
*/
typedef enum
{
/*
* This flag instructs the transfer function to only transfer single shard
* rather than transfer all the colocated shards for the shard interval.
* Using this flag mean we might break the colocated shard
* relationship on the source node. So this is only usefull when setting up
* the new node and we are sure that the node would not be used until we have
* transfered all the shards.
* The reason we need this flag is that we want to be able to transfer
* colocated shards in parallel and for now it is only used for the reference
* table shards.
* Finally if you are using this flag, you should also use consider defering
* the creation of the relationships on the source node until all colocated
* shards are transfered (see: SHARD_TRANSFER_NO_CREATE_RELATIONSHIPS).
*/
SHARD_TRANSFER_SINGLE_SHARD_ONLY = 1 << 0,
/* With this flag the shard transfer function does not create any constrainsts
* or foreign relations defined on the shard, This can be used to defer the
* creation of the relationships until all the shards are transfered.
* This is usefull when we are transfering colocated shards in parallel and
* we want to avoid the creation of the relationships on the source node
* until all the shards are transfered.
*/
SHARD_TRANSFER_SKIP_CREATE_RELATIONSHIPS = 1 << 1,
/* This flag is used to indicate that the shard transfer function should
* only create the relationships on the target node and not transfer any data.
* This is can be used to create the relationships that were defered
* during the transfering of shards.
*/
SHARD_TRANSFER_CREATE_RELATIONSHIPS_ONLY = 1 << 2
} ShardTransferOperationMode;
extern void TransferShards(int64 shardId,
char *sourceNodeName, int32 sourceNodePort,
char *targetNodeName, int32 targetNodePort,
char shardReplicationMode, ShardTransferType transferType,
uint32 optionFlags);
extern uint64 ShardListSizeInBytes(List *colocatedShardList,
char *workerNodeName, uint32 workerNodePort);
extern void ErrorIfMoveUnsupportedTableType(Oid relationId);
extern void CopyShardsToNode(WorkerNode *sourceNode, WorkerNode *targetNode,
List *shardIntervalList, char *snapshotName);
extern void VerifyTablesHaveReplicaIdentity(List *colocatedTableList);
extern bool RelationCanPublishAllModifications(Oid relationId);
extern void UpdatePlacementUpdateStatusForShardIntervalList(List *shardIntervalList,
char *sourceName,
int sourcePort,
PlacementUpdateStatus status);
extern void InsertDeferredDropCleanupRecordsForShards(List *shardIntervalList);
extern void InsertCleanupRecordsForShardPlacementsOnNode(List *shardIntervalList,
int32 groupId);