mirror of https://github.com/citusdata/citus.git
add error state + wait for job udf
parent
12b0063c31
commit
12aec202d8
|
@ -2264,11 +2264,34 @@ RebalanceJobStatusByOid(Oid enumOid)
|
||||||
{
|
{
|
||||||
return REBALANCE_JOB_STATUS_SCHEDULED;
|
return REBALANCE_JOB_STATUS_SCHEDULED;
|
||||||
}
|
}
|
||||||
|
else if (enumOid == JobStatusErrorId())
|
||||||
|
{
|
||||||
|
return REBALANCE_JOB_STATUS_ERROR;
|
||||||
|
}
|
||||||
ereport(ERROR, (errmsg("unknown enum value for citus_job_status")));
|
ereport(ERROR, (errmsg("unknown enum value for citus_job_status")));
|
||||||
return REBALANCE_JOB_STATUS_UNKNOWN;
|
return REBALANCE_JOB_STATUS_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
IsRebalanceJobStatusTerminal(RebalanceJobStatus status)
|
||||||
|
{
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case REBALANCE_JOB_STATUS_DONE:
|
||||||
|
case REBALANCE_JOB_STATUS_ERROR:
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static Oid
|
static Oid
|
||||||
RebalanceJobStatusOid(RebalanceJobStatus status)
|
RebalanceJobStatusOid(RebalanceJobStatus status)
|
||||||
{
|
{
|
||||||
|
@ -2338,6 +2361,52 @@ GetScheduledRebalanceJob(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RebalanceJob *
|
||||||
|
GetScheduledRebalanceJobyJobID(int64 jobId)
|
||||||
|
{
|
||||||
|
const int scanKeyCount = 1;
|
||||||
|
ScanKeyData scanKey[1];
|
||||||
|
bool indexOK = true;
|
||||||
|
|
||||||
|
Relation pgDistRebalanceJobs = table_open(DistRebalanceJobsRelationId(),
|
||||||
|
AccessShareLock);
|
||||||
|
|
||||||
|
/* pg_dist_rebalance_jobs.jobid == $jobId */
|
||||||
|
ScanKeyInit(&scanKey[0], Anum_pg_dist_rebalance_jobs_jobid,
|
||||||
|
BTEqualStrategyNumber, F_INT8EQ, Int64GetDatum(jobId));
|
||||||
|
|
||||||
|
SysScanDesc scanDescriptor = systable_beginscan(pgDistRebalanceJobs,
|
||||||
|
DistRebalanceJobsStatusJobsIdIndexId(),
|
||||||
|
indexOK, NULL, scanKeyCount, scanKey);
|
||||||
|
|
||||||
|
HeapTuple jobTuple = systable_getnext(scanDescriptor);
|
||||||
|
RebalanceJob *job = NULL;
|
||||||
|
if (HeapTupleIsValid(jobTuple))
|
||||||
|
{
|
||||||
|
Form_pg_dist_rebalance_job jobData = NULL;
|
||||||
|
jobData = (Form_pg_dist_rebalance_job) GETSTRUCT(jobTuple);
|
||||||
|
|
||||||
|
job = palloc0(sizeof(RebalanceJob));
|
||||||
|
job->jobid = jobData->jobid;
|
||||||
|
job->status = RebalanceJobStatusByOid(jobData->status);
|
||||||
|
|
||||||
|
/* TODO parse the actual job */
|
||||||
|
Datum datumArray[Natts_pg_dist_rebalance_jobs];
|
||||||
|
bool isNullArray[Natts_pg_dist_rebalance_jobs];
|
||||||
|
TupleDesc tupleDescriptor = RelationGetDescr(pgDistRebalanceJobs);
|
||||||
|
heap_deform_tuple(jobTuple, tupleDescriptor, datumArray, isNullArray);
|
||||||
|
|
||||||
|
job->command = text_to_cstring(
|
||||||
|
DatumGetTextP(datumArray[Anum_pg_dist_rebalance_jobs_command - 1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
systable_endscan(scanDescriptor);
|
||||||
|
table_close(pgDistRebalanceJobs, AccessShareLock);
|
||||||
|
|
||||||
|
return job;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
UpdateJobStatus(RebalanceJob *job, RebalanceJobStatus newStatus)
|
UpdateJobStatus(RebalanceJob *job, RebalanceJobStatus newStatus)
|
||||||
{
|
{
|
||||||
|
|
|
@ -91,3 +91,5 @@ CREATE TABLE citus.pg_dist_rebalance_jobs(
|
||||||
ALTER TABLE citus.pg_dist_rebalance_jobs SET SCHEMA pg_catalog;
|
ALTER TABLE citus.pg_dist_rebalance_jobs SET SCHEMA pg_catalog;
|
||||||
CREATE UNIQUE INDEX pg_dist_rebalance_jobs_jobid_index ON pg_catalog.pg_dist_rebalance_jobs using btree(jobid);
|
CREATE UNIQUE INDEX pg_dist_rebalance_jobs_jobid_index ON pg_catalog.pg_dist_rebalance_jobs using btree(jobid);
|
||||||
CREATE INDEX pg_dist_rebalance_jobs_status_jobid_index ON pg_catalog.pg_dist_rebalance_jobs using btree(status, jobid);
|
CREATE INDEX pg_dist_rebalance_jobs_status_jobid_index ON pg_catalog.pg_dist_rebalance_jobs using btree(status, jobid);
|
||||||
|
|
||||||
|
#include "udfs/citus_wait_for_rebalance_job/11.1-1.sql"
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
CREATE FUNCTION pg_catalog.citus_wait_for_rebalance_job(jobid bigint)
|
||||||
|
RETURNS VOID
|
||||||
|
LANGUAGE C STRICT
|
||||||
|
AS 'MODULE_PATHNAME',$$citus_wait_for_rebalance_job$$;
|
||||||
|
COMMENT ON FUNCTION pg_catalog.citus_wait_for_rebalance_job()
|
||||||
|
IS 'blocks till the job identified by jobid is at a terminal state, errors if no such job exists';
|
||||||
|
|
||||||
|
GRANT EXECUTE ON FUNCTION pg_catalog.citus_wait_for_rebalance_job() TO PUBLIC;
|
|
@ -0,0 +1,8 @@
|
||||||
|
CREATE FUNCTION pg_catalog.citus_wait_for_rebalance_job(jobid bigint)
|
||||||
|
RETURNS VOID
|
||||||
|
LANGUAGE C STRICT
|
||||||
|
AS 'MODULE_PATHNAME',$$citus_wait_for_rebalance_job$$;
|
||||||
|
COMMENT ON FUNCTION pg_catalog.citus_wait_for_rebalance_job()
|
||||||
|
IS 'blocks till the job identified by jobid is at a terminal state, errors if no such job exists';
|
||||||
|
|
||||||
|
GRANT EXECUTE ON FUNCTION pg_catalog.citus_wait_for_rebalance_job() TO PUBLIC;
|
|
@ -0,0 +1,46 @@
|
||||||
|
|
||||||
|
|
||||||
|
#include "postgres.h"
|
||||||
|
|
||||||
|
#include "fmgr.h"
|
||||||
|
#include "miscadmin.h"
|
||||||
|
|
||||||
|
#include "utils/wait_event.h"
|
||||||
|
|
||||||
|
#include "distributed/metadata_cache.h"
|
||||||
|
#include "distributed/metadata_utility.h"
|
||||||
|
|
||||||
|
/* pg_catalog.citus_wait_for_rebalance_job(jobid bigint) */
|
||||||
|
PG_FUNCTION_INFO_V1(citus_wait_for_rebalance_job);
|
||||||
|
|
||||||
|
Datum
|
||||||
|
citus_wait_for_rebalance_job(PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
|
CheckCitusVersion(ERROR);
|
||||||
|
EnsureCoordinator();
|
||||||
|
|
||||||
|
int64 jobid = PG_GETARG_INT64(0);
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
CHECK_FOR_INTERRUPTS();
|
||||||
|
|
||||||
|
RebalanceJob *job = GetScheduledRebalanceJobyJobID(jobid);
|
||||||
|
if (!job)
|
||||||
|
{
|
||||||
|
ereport(ERROR, (errmsg("unkown job with jobid: %ld", jobid)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsRebalanceJobStatusTerminal(job->status))
|
||||||
|
{
|
||||||
|
PG_RETURN_VOID();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* not finished, sleeping */
|
||||||
|
(void) WaitLatch(MyLatch,
|
||||||
|
WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH,
|
||||||
|
1000, /* TODO, what timeout would be good here */
|
||||||
|
WAIT_EVENT_PG_SLEEP);
|
||||||
|
ResetLatch(MyLatch);
|
||||||
|
}
|
||||||
|
}
|
|
@ -208,7 +208,8 @@ typedef enum RebalanceJobStatus
|
||||||
{
|
{
|
||||||
REBALANCE_JOB_STATUS_UNKNOWN,
|
REBALANCE_JOB_STATUS_UNKNOWN,
|
||||||
REBALANCE_JOB_STATUS_SCHEDULED,
|
REBALANCE_JOB_STATUS_SCHEDULED,
|
||||||
REBALANCE_JOB_STATUS_DONE
|
REBALANCE_JOB_STATUS_DONE,
|
||||||
|
REBALANCE_JOB_STATUS_ERROR
|
||||||
} RebalanceJobStatus;
|
} RebalanceJobStatus;
|
||||||
|
|
||||||
|
|
||||||
|
@ -329,6 +330,8 @@ extern void AlterSequenceType(Oid seqOid, Oid typeOid);
|
||||||
extern void EnsureRelationHasCompatibleSequenceTypes(Oid relationId);
|
extern void EnsureRelationHasCompatibleSequenceTypes(Oid relationId);
|
||||||
extern bool HasScheduledRebalanceJobs(void);
|
extern bool HasScheduledRebalanceJobs(void);
|
||||||
extern RebalanceJob * GetScheduledRebalanceJob(void);
|
extern RebalanceJob * GetScheduledRebalanceJob(void);
|
||||||
|
extern RebalanceJob * GetScheduledRebalanceJobyJobID(int64 jobId);
|
||||||
extern void UpdateJobStatus(RebalanceJob *job, RebalanceJobStatus newStatus);
|
extern void UpdateJobStatus(RebalanceJob *job, RebalanceJobStatus newStatus);
|
||||||
extern void UpdateJobError(RebalanceJob *job, ErrorData *edata);
|
extern void UpdateJobError(RebalanceJob *job, ErrorData *edata);
|
||||||
|
extern bool IsRebalanceJobStatusTerminal(RebalanceJobStatus status);
|
||||||
#endif /* METADATA_UTILITY_H */
|
#endif /* METADATA_UTILITY_H */
|
||||||
|
|
Loading…
Reference in New Issue