mirror of https://github.com/citusdata/citus.git
source shardgroup id's from its own sequence
parent
405cc896f7
commit
27c44ef216
|
@ -194,9 +194,7 @@ CreateShardsWithRoundRobinPolicy(Oid distributedTableId, int32 shardCount,
|
||||||
int32 shardMinHashToken = PG_INT32_MIN + (shardIndex * hashTokenIncrement);
|
int32 shardMinHashToken = PG_INT32_MIN + (shardIndex * hashTokenIncrement);
|
||||||
int32 shardMaxHashToken = shardMinHashToken + (hashTokenIncrement - 1);
|
int32 shardMaxHashToken = shardMinHashToken + (hashTokenIncrement - 1);
|
||||||
uint64 shardId = GetNextShardId();
|
uint64 shardId = GetNextShardId();
|
||||||
|
int64 shardGroupId = GetNextShardgroupId();
|
||||||
/* we use shardid of the first shard in a shardgroup as the shardgroupid */
|
|
||||||
int64 shardGroupId = (int64) shardId;
|
|
||||||
|
|
||||||
/* if we are at the last shard, make sure the max token value is INT_MAX */
|
/* if we are at the last shard, make sure the max token value is INT_MAX */
|
||||||
if (shardIndex == (shardCount - 1))
|
if (shardIndex == (shardCount - 1))
|
||||||
|
@ -399,7 +397,7 @@ CreateReferenceTableShard(Oid distributedTableId, Oid colocatedTableId,
|
||||||
|
|
||||||
/* get the next shard id */
|
/* get the next shard id */
|
||||||
uint64 shardId = GetNextShardId();
|
uint64 shardId = GetNextShardId();
|
||||||
int64 shardGroupId = (int64) shardId;
|
int64 shardGroupId = GetNextShardgroupId();
|
||||||
|
|
||||||
StringInfoData shardgroupQuery = { 0 };
|
StringInfoData shardgroupQuery = { 0 };
|
||||||
initStringInfo(&shardgroupQuery);
|
initStringInfo(&shardgroupQuery);
|
||||||
|
|
|
@ -252,6 +252,30 @@ GetNextShardId()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int64
|
||||||
|
GetNextShardgroupId()
|
||||||
|
{
|
||||||
|
Oid savedUserId = InvalidOid;
|
||||||
|
int savedSecurityContext = 0;
|
||||||
|
|
||||||
|
text *sequenceName = cstring_to_text(SHARDGROUPID_SEQUENCE_NAME);
|
||||||
|
Oid sequenceId = ResolveRelationId(sequenceName, false);
|
||||||
|
Datum sequenceIdDatum = ObjectIdGetDatum(sequenceId);
|
||||||
|
|
||||||
|
GetUserIdAndSecContext(&savedUserId, &savedSecurityContext);
|
||||||
|
SetUserIdAndSecContext(CitusExtensionOwner(), SECURITY_LOCAL_USERID_CHANGE);
|
||||||
|
|
||||||
|
/* generate new and unique shardId from sequence */
|
||||||
|
Datum shardgroupIdDatum = DirectFunctionCall1(nextval_oid, sequenceIdDatum);
|
||||||
|
|
||||||
|
SetUserIdAndSecContext(savedUserId, savedSecurityContext);
|
||||||
|
|
||||||
|
int64 shardgroupId = DatumGetInt64(shardgroupIdDatum);
|
||||||
|
|
||||||
|
return shardgroupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* master_get_new_placementid is a user facing wrapper function around
|
* master_get_new_placementid is a user facing wrapper function around
|
||||||
* GetNextPlacementId() which allocates and returns a unique placement id for the
|
* GetNextPlacementId() which allocates and returns a unique placement id for the
|
||||||
|
|
|
@ -157,6 +157,7 @@ static void AddDummyShardEntryInMap(HTAB *mapOfPlacementToDummyShardList, uint32
|
||||||
targetNodeId,
|
targetNodeId,
|
||||||
ShardInterval *shardInterval);
|
ShardInterval *shardInterval);
|
||||||
static uint64 GetNextShardIdForSplitChild(void);
|
static uint64 GetNextShardIdForSplitChild(void);
|
||||||
|
static int64 GetNextShardgroupIdForSplitChild(void);
|
||||||
static void AcquireNonblockingSplitLock(Oid relationId);
|
static void AcquireNonblockingSplitLock(Oid relationId);
|
||||||
static List * GetWorkerNodesFromWorkerIds(List *nodeIdsForPlacementList);
|
static List * GetWorkerNodesFromWorkerIds(List *nodeIdsForPlacementList);
|
||||||
static void DropShardgroupMetadata(int64 shardgroupId);
|
static void DropShardgroupMetadata(int64 shardgroupId);
|
||||||
|
@ -1063,7 +1064,7 @@ CreateNewShardgroups(uint32 colocationId, ShardInterval *sampleInterval,
|
||||||
Datum splitPoint = (Datum) lfirst(splitPointCell);
|
Datum splitPoint = (Datum) lfirst(splitPointCell);
|
||||||
|
|
||||||
Shardgroup *shardgroup = palloc0(sizeof(Shardgroup));
|
Shardgroup *shardgroup = palloc0(sizeof(Shardgroup));
|
||||||
shardgroup->shardgroupId = (int64) GetNextShardIdForSplitChild();
|
shardgroup->shardgroupId = GetNextShardgroupIdForSplitChild();
|
||||||
shardgroup->colocationId = colocationId;
|
shardgroup->colocationId = colocationId;
|
||||||
shardgroup->minShardValue = Int32GetDatum(currentSplitChildMinValue);
|
shardgroup->minShardValue = Int32GetDatum(currentSplitChildMinValue);
|
||||||
shardgroup->maxShardValue = splitPoint;
|
shardgroup->maxShardValue = splitPoint;
|
||||||
|
@ -1080,7 +1081,7 @@ CreateNewShardgroups(uint32 colocationId, ShardInterval *sampleInterval,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Shardgroup *shardgroup = palloc0(sizeof(Shardgroup));
|
Shardgroup *shardgroup = palloc0(sizeof(Shardgroup));
|
||||||
shardgroup->shardgroupId = (int64) GetNextShardIdForSplitChild();
|
shardgroup->shardgroupId = GetNextShardgroupIdForSplitChild();
|
||||||
shardgroup->colocationId = colocationId;
|
shardgroup->colocationId = colocationId;
|
||||||
shardgroup->minShardValue = Int32GetDatum(currentSplitChildMinValue);
|
shardgroup->minShardValue = Int32GetDatum(currentSplitChildMinValue);
|
||||||
shardgroup->maxShardValue = splitParentMaxValue;
|
shardgroup->maxShardValue = splitParentMaxValue;
|
||||||
|
@ -2228,3 +2229,36 @@ GetNextShardIdForSplitChild()
|
||||||
|
|
||||||
return shardId;
|
return shardId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int64
|
||||||
|
GetNextShardgroupIdForSplitChild()
|
||||||
|
{
|
||||||
|
StringInfo nextValueCommand = makeStringInfo();
|
||||||
|
appendStringInfo(nextValueCommand, "SELECT nextval(%s);",
|
||||||
|
quote_literal_cstr("pg_catalog.pg_dist_shardgroupid_seq"));
|
||||||
|
|
||||||
|
MultiConnection *connection =
|
||||||
|
GetConnectionForLocalQueriesOutsideTransaction(CitusExtensionOwnerName());
|
||||||
|
|
||||||
|
PGresult *result = NULL;
|
||||||
|
int queryResult = ExecuteOptionalRemoteCommand(connection, nextValueCommand->data,
|
||||||
|
&result);
|
||||||
|
if (queryResult != RESPONSE_OKAY || !IsResponseOK(result) || PQntuples(result) != 1 ||
|
||||||
|
PQnfields(result) != 1)
|
||||||
|
{
|
||||||
|
PQclear(result);
|
||||||
|
ForgetResults(connection);
|
||||||
|
CloseConnection(connection);
|
||||||
|
|
||||||
|
ereport(ERROR, (errcode(ERRCODE_CONNECTION_FAILURE),
|
||||||
|
errmsg("Could not generate next shardgroup id while executing "
|
||||||
|
"shard splits.")));
|
||||||
|
}
|
||||||
|
|
||||||
|
int64 shardgroupId = SafeStringToInt64(PQgetvalue(result, 0, 0 /* nodeId column*/));
|
||||||
|
PQclear(result);
|
||||||
|
ForgetResults(connection);
|
||||||
|
|
||||||
|
return shardgroupId;
|
||||||
|
}
|
||||||
|
|
|
@ -186,7 +186,7 @@ master_create_empty_shard(PG_FUNCTION_ARGS)
|
||||||
|
|
||||||
CitusTableCacheEntry *tableEntry = LookupCitusTableCacheEntry(relationId);
|
CitusTableCacheEntry *tableEntry = LookupCitusTableCacheEntry(relationId);
|
||||||
|
|
||||||
int64 shardgroupId = (int64) shardId;
|
int64 shardgroupId = GetNextShardgroupId();
|
||||||
InsertShardGroupRow(shardgroupId, tableEntry->colocationId,
|
InsertShardGroupRow(shardgroupId, tableEntry->colocationId,
|
||||||
nullMinValue, nullMaxValue);
|
nullMinValue, nullMaxValue);
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,11 @@ CREATE TABLE citus.pg_dist_shardgroup (
|
||||||
);
|
);
|
||||||
ALTER TABLE citus.pg_dist_shardgroup SET SCHEMA pg_catalog;
|
ALTER TABLE citus.pg_dist_shardgroup SET SCHEMA pg_catalog;
|
||||||
|
|
||||||
|
CREATE SEQUENCE citus.pg_dist_shardgroupid_seq
|
||||||
|
MINVALUE 100000 -- TO BO DECIDED
|
||||||
|
NO CYCLE;
|
||||||
|
ALTER SEQUENCE citus.pg_dist_shardgroupid_seq SET SCHEMA pg_catalog;
|
||||||
|
|
||||||
INSERT INTO pg_catalog.pg_dist_shardgroup
|
INSERT INTO pg_catalog.pg_dist_shardgroup
|
||||||
SELECT min(shardid) as shardgroupid,
|
SELECT min(shardid) as shardgroupid,
|
||||||
colocationid,
|
colocationid,
|
||||||
|
|
|
@ -53,6 +53,7 @@
|
||||||
#define TRANSFER_MODE_BLOCK_WRITES 'b'
|
#define TRANSFER_MODE_BLOCK_WRITES 'b'
|
||||||
|
|
||||||
#define SHARDID_SEQUENCE_NAME "pg_dist_shardid_seq"
|
#define SHARDID_SEQUENCE_NAME "pg_dist_shardid_seq"
|
||||||
|
#define SHARDGROUPID_SEQUENCE_NAME "pg_dist_shardgroupid_seq"
|
||||||
#define PLACEMENTID_SEQUENCE_NAME "pg_dist_placement_placementid_seq"
|
#define PLACEMENTID_SEQUENCE_NAME "pg_dist_placement_placementid_seq"
|
||||||
|
|
||||||
/* Remote call definitions to help with data staging and deletion */
|
/* Remote call definitions to help with data staging and deletion */
|
||||||
|
@ -221,6 +222,7 @@ extern bool IsCoordinator(void);
|
||||||
|
|
||||||
/* Function declarations local to the distributed module */
|
/* Function declarations local to the distributed module */
|
||||||
extern uint64 GetNextShardId(void);
|
extern uint64 GetNextShardId(void);
|
||||||
|
extern int64 GetNextShardgroupId(void);
|
||||||
extern uint64 GetNextPlacementId(void);
|
extern uint64 GetNextPlacementId(void);
|
||||||
extern Oid ResolveRelationId(text *relationName, bool missingOk);
|
extern Oid ResolveRelationId(text *relationName, bool missingOk);
|
||||||
extern List * GetFullTableCreationCommands(Oid relationId,
|
extern List * GetFullTableCreationCommands(Oid relationId,
|
||||||
|
|
Loading…
Reference in New Issue