mirror of https://github.com/citusdata/citus.git
86 lines
3.5 KiB
C
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);
|