1 /*-------------------------------------------------------------------------
2  *
3  * metadata_sync.h
4  *	  Type and function declarations used to sync metadata across all
5  *	  workers.
6  *
7  * Copyright (c) Citus Data, Inc.
8  *
9  *-------------------------------------------------------------------------
10  */
11 
12 #ifndef METADATA_SYNC_H
13 #define METADATA_SYNC_H
14 
15 
16 #include "distributed/metadata_cache.h"
17 #include "nodes/pg_list.h"
18 
19 /* config variables */
20 extern int MetadataSyncInterval;
21 extern int MetadataSyncRetryInterval;
22 
23 typedef enum
24 {
25 	METADATA_SYNC_SUCCESS = 0,
26 	METADATA_SYNC_FAILED_LOCK = 1,
27 	METADATA_SYNC_FAILED_SYNC = 2
28 } MetadataSyncResult;
29 
30 /* Functions declarations for metadata syncing */
31 extern void StartMetadataSyncToNode(const char *nodeNameString, int32 nodePort);
32 extern bool ClusterHasKnownMetadataWorkers(void);
33 extern bool ShouldSyncTableMetadata(Oid relationId);
34 extern List * MetadataCreateCommands(void);
35 extern List * MetadataDropCommands(void);
36 extern char * DistributionCreateCommand(CitusTableCacheEntry *cacheEntry);
37 extern char * DistributionDeleteCommand(const char *schemaName,
38 										const char *tableName);
39 extern char * TableOwnerResetCommand(Oid distributedRelationId);
40 extern char * NodeListInsertCommand(List *workerNodeList);
41 extern List * ShardListInsertCommand(List *shardIntervalList);
42 extern char * NodeDeleteCommand(uint32 nodeId);
43 extern char * NodeStateUpdateCommand(uint32 nodeId, bool isActive);
44 extern char * ShouldHaveShardsUpdateCommand(uint32 nodeId, bool shouldHaveShards);
45 extern char * ColocationIdUpdateCommand(Oid relationId, uint32 colocationId);
46 extern char * CreateSchemaDDLCommand(Oid schemaId);
47 extern List * GrantOnSchemaDDLCommands(Oid schemaId);
48 extern char * PlacementUpsertCommand(uint64 shardId, uint64 placementId, int shardState,
49 									 uint64 shardLength, int32 groupId);
50 extern void CreateTableMetadataOnWorkers(Oid relationId);
51 extern BackgroundWorkerHandle * SpawnSyncMetadataToNodes(Oid database, Oid owner);
52 extern void SyncMetadataToNodesMain(Datum main_arg);
53 extern void SignalMetadataSyncDaemon(Oid database, int sig);
54 extern bool ShouldInitiateMetadataSync(bool *lockFailure);
55 
56 extern List * SequenceDDLCommandsForTable(Oid relationId);
57 extern List * GetSequencesFromAttrDef(Oid attrdefOid);
58 extern void GetDependentSequencesWithRelation(Oid relationId, List **attnumList,
59 											  List **dependentSequenceList, AttrNumber
60 											  attnum);
61 extern Oid GetAttributeTypeOid(Oid relationId, AttrNumber attnum);
62 
63 #define DELETE_ALL_NODES "TRUNCATE pg_dist_node CASCADE"
64 #define REMOVE_ALL_CLUSTERED_TABLES_COMMAND \
65 	"SELECT worker_drop_distributed_table(logicalrelid::regclass::text) FROM pg_dist_partition"
66 #define DISABLE_DDL_PROPAGATION "SET citus.enable_ddl_propagation TO 'off'"
67 #define ENABLE_DDL_PROPAGATION "SET citus.enable_ddl_propagation TO 'on'"
68 #define WORKER_APPLY_SEQUENCE_COMMAND "SELECT worker_apply_sequence_command (%s,%s)"
69 #define UPSERT_PLACEMENT \
70 	"INSERT INTO pg_dist_placement " \
71 	"(shardid, shardstate, shardlength, " \
72 	"groupid, placementid) " \
73 	"VALUES (" UINT64_FORMAT ", %d, " UINT64_FORMAT \
74 	", %d, " UINT64_FORMAT \
75 	") " \
76 	"ON CONFLICT (placementid) DO UPDATE SET " \
77 	"shardid = EXCLUDED.shardid, " \
78 	"shardstate = EXCLUDED.shardstate, " \
79 	"shardlength = EXCLUDED.shardlength, " \
80 	"groupid = EXCLUDED.groupid"
81 #define METADATA_SYNC_CHANNEL "metadata_sync"
82 
83 
84 /* controlled via GUC */
85 extern char *EnableManualMetadataChangesForUser;
86 
87 #endif /* METADATA_SYNC_H */
88