mirror of https://github.com/citusdata/citus.git
start & stop metadata operations commit when the main transaction commits
parent
2aa67421a7
commit
bb381e7eee
|
@ -366,28 +366,17 @@ SyncMetadataSnapshotToNode(WorkerNode *workerNode, bool raiseOnError)
|
||||||
recreateMetadataSnapshotCommandList = list_concat(recreateMetadataSnapshotCommandList,
|
recreateMetadataSnapshotCommandList = list_concat(recreateMetadataSnapshotCommandList,
|
||||||
createMetadataCommandList);
|
createMetadataCommandList);
|
||||||
|
|
||||||
/*
|
const char *command = NULL;
|
||||||
* Send the snapshot recreation commands in a single remote transaction and
|
foreach_ptr(command, recreateMetadataSnapshotCommandList)
|
||||||
* if requested, error out in any kind of failure. Note that it is not
|
|
||||||
* required to send createMetadataSnapshotCommandList in the same transaction
|
|
||||||
* that we send nodeDeleteCommand and nodeInsertCommand commands below.
|
|
||||||
*/
|
|
||||||
if (raiseOnError)
|
|
||||||
{
|
{
|
||||||
SendCommandListToWorkerInSingleTransaction(workerNode->workerName,
|
if (raiseOnError)
|
||||||
workerNode->workerPort,
|
{
|
||||||
currentUser,
|
SendCommandToWorkersWithMetadata(command);
|
||||||
recreateMetadataSnapshotCommandList);
|
}
|
||||||
return true;
|
else
|
||||||
}
|
{
|
||||||
else
|
SendOptionalCommandToWorkersWithMetadata(command);
|
||||||
{
|
}
|
||||||
bool success =
|
|
||||||
SendOptionalCommandListToWorkerInTransaction(workerNode->workerName,
|
|
||||||
workerNode->workerPort,
|
|
||||||
currentUser,
|
|
||||||
recreateMetadataSnapshotCommandList);
|
|
||||||
return success;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -407,10 +396,11 @@ DropMetadataSnapshotOnNode(WorkerNode *workerNode)
|
||||||
dropMetadataCommandList = lappend(dropMetadataCommandList,
|
dropMetadataCommandList = lappend(dropMetadataCommandList,
|
||||||
LocalGroupIdUpdateCommand(0));
|
LocalGroupIdUpdateCommand(0));
|
||||||
|
|
||||||
SendOptionalCommandListToWorkerInTransaction(workerNode->workerName,
|
const char *command = NULL;
|
||||||
workerNode->workerPort,
|
foreach_ptr(command, dropMetadataCommandList)
|
||||||
userName,
|
{
|
||||||
dropMetadataCommandList);
|
SendOptionalCommandToWorkersWithMetadata(command);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,12 +36,14 @@
|
||||||
static void SendCommandToMetadataWorkersParams(const char *command,
|
static void SendCommandToMetadataWorkersParams(const char *command,
|
||||||
const char *user, int parameterCount,
|
const char *user, int parameterCount,
|
||||||
const Oid *parameterTypes,
|
const Oid *parameterTypes,
|
||||||
const char *const *parameterValues);
|
const char *const *parameterValues,
|
||||||
|
bool raiseInterrupts);
|
||||||
static void SendCommandToWorkersParamsInternal(TargetWorkerSet targetWorkerSet,
|
static void SendCommandToWorkersParamsInternal(TargetWorkerSet targetWorkerSet,
|
||||||
const char *command, const char *user,
|
const char *command, const char *user,
|
||||||
int parameterCount,
|
int parameterCount,
|
||||||
const Oid *parameterTypes,
|
const Oid *parameterTypes,
|
||||||
const char *const *parameterValues);
|
const char *const *parameterValues,
|
||||||
|
bool raiseInterrupts);
|
||||||
static void ErrorIfAnyMetadataNodeOutOfSync(List *metadataNodeList);
|
static void ErrorIfAnyMetadataNodeOutOfSync(List *metadataNodeList);
|
||||||
static List * OpenConnectionsToWorkersInParallel(TargetWorkerSet targetWorkerSet,
|
static List * OpenConnectionsToWorkersInParallel(TargetWorkerSet targetWorkerSet,
|
||||||
const char *user);
|
const char *user);
|
||||||
|
@ -112,14 +114,29 @@ SendCommandToWorkerAsUser(const char *nodeName, int32 nodePort, const char *node
|
||||||
/*
|
/*
|
||||||
* SendCommandToWorkers sends a command to all workers in
|
* SendCommandToWorkers sends a command to all workers in
|
||||||
* parallel. Commands are committed on the workers when the local
|
* parallel. Commands are committed on the workers when the local
|
||||||
* transaction commits. The connection are made as the extension
|
* transaction commits. Failures abort the current transaction.
|
||||||
* owner to ensure write access to the Citus metadata tables.
|
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
SendCommandToWorkersWithMetadata(const char *command)
|
SendCommandToWorkersWithMetadata(const char *command)
|
||||||
{
|
{
|
||||||
|
bool raiseInterrupts = true;
|
||||||
SendCommandToMetadataWorkersParams(command, CurrentUserName(),
|
SendCommandToMetadataWorkersParams(command, CurrentUserName(),
|
||||||
0, NULL, NULL);
|
0, NULL, NULL, raiseInterrupts);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SendOptionalCommandToWorkersWithMetadata sends a command to
|
||||||
|
* all workers in parallel. Commands are committed on the workers
|
||||||
|
* when the local transaction commits. Failures do not abort
|
||||||
|
* the current transaction.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SendOptionalCommandToWorkersWithMetadata(const char *command)
|
||||||
|
{
|
||||||
|
bool raiseInterrupts = false;
|
||||||
|
SendCommandToMetadataWorkersParams(command, CurrentUserName(),
|
||||||
|
0, NULL, NULL, raiseInterrupts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -205,7 +222,8 @@ static void
|
||||||
SendCommandToMetadataWorkersParams(const char *command,
|
SendCommandToMetadataWorkersParams(const char *command,
|
||||||
const char *user, int parameterCount,
|
const char *user, int parameterCount,
|
||||||
const Oid *parameterTypes,
|
const Oid *parameterTypes,
|
||||||
const char *const *parameterValues)
|
const char *const *parameterValues,
|
||||||
|
bool raiseInterrupts)
|
||||||
{
|
{
|
||||||
List *workerNodeList = TargetWorkerSetNodeList(NON_COORDINATOR_METADATA_NODES,
|
List *workerNodeList = TargetWorkerSetNodeList(NON_COORDINATOR_METADATA_NODES,
|
||||||
ShareLock);
|
ShareLock);
|
||||||
|
@ -214,7 +232,7 @@ SendCommandToMetadataWorkersParams(const char *command,
|
||||||
|
|
||||||
SendCommandToWorkersParamsInternal(NON_COORDINATOR_METADATA_NODES, command, user,
|
SendCommandToWorkersParamsInternal(NON_COORDINATOR_METADATA_NODES, command, user,
|
||||||
parameterCount, parameterTypes,
|
parameterCount, parameterTypes,
|
||||||
parameterValues);
|
parameterValues, raiseInterrupts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -353,7 +371,8 @@ static void
|
||||||
SendCommandToWorkersParamsInternal(TargetWorkerSet targetWorkerSet, const char *command,
|
SendCommandToWorkersParamsInternal(TargetWorkerSet targetWorkerSet, const char *command,
|
||||||
const char *user, int parameterCount,
|
const char *user, int parameterCount,
|
||||||
const Oid *parameterTypes,
|
const Oid *parameterTypes,
|
||||||
const char *const *parameterValues)
|
const char *const *parameterValues,
|
||||||
|
bool raiseInterrupts)
|
||||||
{
|
{
|
||||||
List *connectionList = NIL;
|
List *connectionList = NIL;
|
||||||
List *workerNodeList = TargetWorkerSetNodeList(targetWorkerSet, ShareLock);
|
List *workerNodeList = TargetWorkerSetNodeList(targetWorkerSet, ShareLock);
|
||||||
|
@ -361,6 +380,8 @@ SendCommandToWorkersParamsInternal(TargetWorkerSet targetWorkerSet, const char *
|
||||||
UseCoordinatedTransaction();
|
UseCoordinatedTransaction();
|
||||||
Use2PCForCoordinatedTransaction();
|
Use2PCForCoordinatedTransaction();
|
||||||
|
|
||||||
|
int logLevel = raiseInterrupts ? ERROR : WARNING;
|
||||||
|
|
||||||
/* open connections in parallel */
|
/* open connections in parallel */
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerNodeList)
|
foreach_ptr(workerNode, workerNodeList)
|
||||||
|
@ -397,7 +418,7 @@ SendCommandToWorkersParamsInternal(TargetWorkerSet targetWorkerSet, const char *
|
||||||
parameterTypes, parameterValues, false);
|
parameterTypes, parameterValues, false);
|
||||||
if (querySent == 0)
|
if (querySent == 0)
|
||||||
{
|
{
|
||||||
ReportConnectionError(connection, ERROR);
|
ReportConnectionError(connection, logLevel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -407,7 +428,7 @@ SendCommandToWorkersParamsInternal(TargetWorkerSet targetWorkerSet, const char *
|
||||||
PGresult *result = GetRemoteCommandResult(connection, true);
|
PGresult *result = GetRemoteCommandResult(connection, true);
|
||||||
if (!IsResponseOK(result))
|
if (!IsResponseOK(result))
|
||||||
{
|
{
|
||||||
ReportResultError(connection, result, ERROR);
|
ReportResultError(connection, result, logLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
PQclear(result);
|
PQclear(result);
|
||||||
|
|
|
@ -42,6 +42,7 @@ extern bool SendOptionalCommandListToWorkerInTransaction(const char *nodeName, i
|
||||||
const char *nodeUser,
|
const char *nodeUser,
|
||||||
List *commandList);
|
List *commandList);
|
||||||
extern void SendCommandToWorkersWithMetadata(const char *command);
|
extern void SendCommandToWorkersWithMetadata(const char *command);
|
||||||
|
extern void SendOptionalCommandToWorkersWithMetadata(const char *command);
|
||||||
extern void SendBareCommandListToMetadataWorkers(List *commandList);
|
extern void SendBareCommandListToMetadataWorkers(List *commandList);
|
||||||
extern void EnsureNoModificationsHaveBeenDone(void);
|
extern void EnsureNoModificationsHaveBeenDone(void);
|
||||||
extern void SendCommandListToWorkerInSingleTransaction(const char *nodeName,
|
extern void SendCommandListToWorkerInSingleTransaction(const char *nodeName,
|
||||||
|
|
Loading…
Reference in New Issue