Reintroduce ForceSearchShardPlacementInList (#3664)

This was added to silence static analysis errors. It was removed
accidentally in #3591. This reintroduces it again.
pull/3675/head
Jelte Fennema 2020-03-27 14:28:50 +01:00 committed by GitHub
parent c0930d157e
commit 3be665269f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 47 deletions

View File

@ -271,8 +271,6 @@ RepairShardPlacement(int64 shardId, const char *sourceNodeName, int32 sourceNode
char relationKind = get_rel_relkind(distributedTableId); char relationKind = get_rel_relkind(distributedTableId);
char *tableOwner = TableOwner(shardInterval->relationId); char *tableOwner = TableOwner(shardInterval->relationId);
bool missingOk = false;
/* prevent table from being dropped */ /* prevent table from being dropped */
LockRelationOid(distributedTableId, AccessShareLock); LockRelationOid(distributedTableId, AccessShareLock);
@ -369,9 +367,9 @@ RepairShardPlacement(int64 shardId, const char *sourceNodeName, int32 sourceNode
/* after successful repair, we update shard state as healthy*/ /* after successful repair, we update shard state as healthy*/
List *placementList = ShardPlacementList(shardId); List *placementList = ShardPlacementList(shardId);
ShardPlacement *placement = SearchShardPlacementInList(placementList, targetNodeName, ShardPlacement *placement = ForceSearchShardPlacementInList(placementList,
targetNodePort, targetNodeName,
missingOk); targetNodePort);
UpdateShardPlacementState(placement->placementId, SHARD_STATE_ACTIVE); UpdateShardPlacementState(placement->placementId, SHARD_STATE_ACTIVE);
} }
@ -600,23 +598,19 @@ EnsureShardCanBeRepaired(int64 shardId, const char *sourceNodeName, int32 source
const char *targetNodeName, int32 targetNodePort) const char *targetNodeName, int32 targetNodePort)
{ {
List *shardPlacementList = ShardPlacementList(shardId); List *shardPlacementList = ShardPlacementList(shardId);
bool missingSourceOk = false;
bool missingTargetOk = false;
ShardPlacement *sourcePlacement = SearchShardPlacementInList(shardPlacementList, ShardPlacement *sourcePlacement = ForceSearchShardPlacementInList(shardPlacementList,
sourceNodeName, sourceNodeName,
sourceNodePort, sourceNodePort);
missingSourceOk);
if (sourcePlacement->shardState != SHARD_STATE_ACTIVE) if (sourcePlacement->shardState != SHARD_STATE_ACTIVE)
{ {
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("source placement must be in active state"))); errmsg("source placement must be in active state")));
} }
ShardPlacement *targetPlacement = SearchShardPlacementInList(shardPlacementList, ShardPlacement *targetPlacement = ForceSearchShardPlacementInList(shardPlacementList,
targetNodeName, targetNodeName,
targetNodePort, targetNodePort);
missingTargetOk);
if (targetPlacement->shardState != SHARD_STATE_INACTIVE) if (targetPlacement->shardState != SHARD_STATE_INACTIVE)
{ {
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@ -634,13 +628,10 @@ EnsureShardCanBeCopied(int64 shardId, const char *sourceNodeName, int32 sourceNo
const char *targetNodeName, int32 targetNodePort) const char *targetNodeName, int32 targetNodePort)
{ {
List *shardPlacementList = ShardPlacementList(shardId); List *shardPlacementList = ShardPlacementList(shardId);
bool missingSourceOk = false;
bool missingTargetOk = true;
ShardPlacement *sourcePlacement = SearchShardPlacementInList(shardPlacementList, ShardPlacement *sourcePlacement = ForceSearchShardPlacementInList(shardPlacementList,
sourceNodeName, sourceNodeName,
sourceNodePort, sourceNodePort);
missingSourceOk);
if (sourcePlacement->shardState != SHARD_STATE_ACTIVE) if (sourcePlacement->shardState != SHARD_STATE_ACTIVE)
{ {
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@ -649,8 +640,7 @@ EnsureShardCanBeCopied(int64 shardId, const char *sourceNodeName, int32 sourceNo
ShardPlacement *targetPlacement = SearchShardPlacementInList(shardPlacementList, ShardPlacement *targetPlacement = SearchShardPlacementInList(shardPlacementList,
targetNodeName, targetNodeName,
targetNodePort, targetNodePort);
missingTargetOk);
if (targetPlacement != NULL) if (targetPlacement != NULL)
{ {
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@ -662,42 +652,48 @@ EnsureShardCanBeCopied(int64 shardId, const char *sourceNodeName, int32 sourceNo
/* /*
* SearchShardPlacementInList searches a provided list for a shard placement with the * SearchShardPlacementInList searches a provided list for a shard placement with the
* specified node name and port. If missingOk is set to true, this function returns NULL * specified node name and port. This function returns NULL if no such
* if no such placement exists in the provided list, otherwise it throws an error. * placement exists in the provided list.
*/ */
ShardPlacement * ShardPlacement *
SearchShardPlacementInList(List *shardPlacementList, const char *nodeName, SearchShardPlacementInList(List *shardPlacementList, const char *nodeName,
uint32 nodePort, bool missingOk) uint32 nodePort)
{ {
ListCell *shardPlacementCell = NULL; ShardPlacement *shardPlacement = NULL;
ShardPlacement *matchingPlacement = NULL; foreach_ptr(shardPlacement, shardPlacementList)
foreach(shardPlacementCell, shardPlacementList)
{ {
ShardPlacement *shardPlacement = lfirst(shardPlacementCell);
if (strncmp(nodeName, shardPlacement->nodeName, MAX_NODE_LENGTH) == 0 && if (strncmp(nodeName, shardPlacement->nodeName, MAX_NODE_LENGTH) == 0 &&
nodePort == shardPlacement->nodePort) nodePort == shardPlacement->nodePort)
{ {
matchingPlacement = shardPlacement; return shardPlacement;
break;
} }
} }
return NULL;
}
if (matchingPlacement == NULL)
/*
* ForceSearchShardPlacementInList searches a provided list for a shard
* placement with the specified node name and port. This function throws an
* error if no such placement exists in the provided list.
*
* This is a separate function (instead of using missingOk), so static analysis
* reasons about NULL returns correctly.
*/
ShardPlacement *
ForceSearchShardPlacementInList(List *shardPlacementList, const char *nodeName,
uint32 nodePort)
{
ShardPlacement *placement = SearchShardPlacementInList(shardPlacementList, nodeName,
nodePort);
if (placement == NULL)
{ {
if (missingOk)
{
return NULL;
}
ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION), ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
errmsg("could not find placement matching \"%s:%d\"", errmsg("could not find placement matching \"%s:%d\"",
nodeName, nodePort), nodeName, nodePort),
errhint("Confirm the placement still exists and try again."))); errhint("Confirm the placement still exists and try again.")));
} }
return placement;
return matchingPlacement;
} }

View File

@ -270,10 +270,8 @@ ReplicateShardToNode(ShardInterval *shardInterval, char *nodeName, int nodePort)
CopyShardCommandList(shardInterval, srcNodeName, srcNodePort, includeData); CopyShardCommandList(shardInterval, srcNodeName, srcNodePort, includeData);
List *shardPlacementList = ShardPlacementList(shardId); List *shardPlacementList = ShardPlacementList(shardId);
bool missingWorkerOk = true;
ShardPlacement *targetPlacement = SearchShardPlacementInList(shardPlacementList, ShardPlacement *targetPlacement = SearchShardPlacementInList(shardPlacementList,
nodeName, nodePort, nodeName, nodePort);
missingWorkerOk);
char *tableOwner = TableOwner(shardInterval->relationId); char *tableOwner = TableOwner(shardInterval->relationId);
/* /*

View File

@ -165,7 +165,9 @@ extern void CopyShardForeignConstraintCommandListGrouped(ShardInterval *shardInt
List ** List **
referenceTableForeignConstraintList); referenceTableForeignConstraintList);
extern ShardPlacement * SearchShardPlacementInList(List *shardPlacementList, extern ShardPlacement * SearchShardPlacementInList(List *shardPlacementList,
const char *nodeName, uint32 nodePort, const char *nodeName, uint32 nodePort);
bool missingOk); extern ShardPlacement * ForceSearchShardPlacementInList(List *shardPlacementList,
const char *nodeName,
uint32 nodePort);
#endif /* MASTER_PROTOCOL_H */ #endif /* MASTER_PROTOCOL_H */