Move task tracker lwlocks into their own tranche.

RequestAddinLWLocks()/LWLockAssign() are gone in 9.6. Luckily all citus
supported postgres versions support tranches, so use those.
pull/824/head
Andres Freund 2016-03-03 19:31:44 -08:00 committed by Jason Petersen
parent d52ebffce5
commit 77efe7fcd4
No known key found for this signature in database
GPG Key ID: 9F1D3510D110ABA9
3 changed files with 30 additions and 21 deletions

View File

@ -99,7 +99,6 @@ TaskTrackerRegister(void)
/* organize and register initialization of required shared memory */
RequestAddinShmemSpace(TaskTrackerShmemSize());
RequestAddinLWLocks(1);
prev_shmem_startup_hook = shmem_startup_hook;
shmem_startup_hook = TaskTrackerShmemInit;
@ -376,7 +375,7 @@ TrackerCleanupJobSchemas(void)
const uint64 jobId = RESERVED_JOB_ID;
uint32 taskIndex = 1;
LWLockAcquire(WorkerTasksSharedState->taskHashLock, LW_EXCLUSIVE);
LWLockAcquire(&WorkerTasksSharedState->taskHashLock, LW_EXCLUSIVE);
foreach(databaseNameCell, databaseNameList)
{
@ -409,7 +408,7 @@ TrackerCleanupJobSchemas(void)
taskIndex++;
}
LWLockRelease(WorkerTasksSharedState->taskHashLock);
LWLockRelease(&WorkerTasksSharedState->taskHashLock);
if (databaseNameList != NIL)
{
@ -457,13 +456,13 @@ TrackerRegisterShutDown(HTAB *WorkerTasksHash)
uint32 taskId = SHUTDOWN_MARKER_TASK_ID;
WorkerTask *shutdownMarkerTask = NULL;
LWLockAcquire(WorkerTasksSharedState->taskHashLock, LW_EXCLUSIVE);
LWLockAcquire(&WorkerTasksSharedState->taskHashLock, LW_EXCLUSIVE);
shutdownMarkerTask = WorkerTasksHashEnter(jobId, taskId);
shutdownMarkerTask->taskStatus = TASK_SUCCEEDED;
shutdownMarkerTask->connectionId = INVALID_CONNECTION_ID;
LWLockRelease(WorkerTasksSharedState->taskHashLock);
LWLockRelease(&WorkerTasksSharedState->taskHashLock);
}
@ -587,8 +586,16 @@ TaskTrackerShmemInit(void)
if (!alreadyInitialized)
{
/* allocate lwlock protecting the task tracker hash table */
WorkerTasksSharedState->taskHashLock = LWLockAssign();
/* initialize lwlock protecting the task tracker hash table */
LWLockTranche *tranche = &WorkerTasksSharedState->taskHashLockTranche;
WorkerTasksSharedState->taskHashTrancheId = LWLockNewTrancheId();
tranche->array_base = &WorkerTasksSharedState->taskHashLock;
tranche->array_stride = sizeof(LWLock);
tranche->name = "Worker Task Hash Tranche";
LWLockRegisterTranche(WorkerTasksSharedState->taskHashTrancheId, tranche);
LWLockInitialize(&WorkerTasksSharedState->taskHashLock,
WorkerTasksSharedState->taskHashTrancheId);
}
/* allocate hash table */
@ -600,7 +607,7 @@ TaskTrackerShmemInit(void)
LWLockRelease(AddinShmemInitLock);
Assert(WorkerTasksSharedState->taskHash != NULL);
Assert(WorkerTasksSharedState->taskHashLock != NULL);
Assert(WorkerTasksSharedState->taskHashTrancheId != 0);
if (prev_shmem_startup_hook != NULL)
{
@ -844,11 +851,11 @@ ManageWorkerTasksHash(HTAB *WorkerTasksHash)
WorkerTask *currentTask = NULL;
/* ask the scheduler if we have new tasks to schedule */
LWLockAcquire(WorkerTasksSharedState->taskHashLock, LW_SHARED);
LWLockAcquire(&WorkerTasksSharedState->taskHashLock, LW_SHARED);
schedulableTaskList = SchedulableTaskList(WorkerTasksHash);
LWLockRelease(WorkerTasksSharedState->taskHashLock);
LWLockRelease(&WorkerTasksSharedState->taskHashLock);
LWLockAcquire(WorkerTasksSharedState->taskHashLock, LW_EXCLUSIVE);
LWLockAcquire(&WorkerTasksSharedState->taskHashLock, LW_EXCLUSIVE);
/* schedule new tasks if we have any */
if (schedulableTaskList != NIL)
@ -878,7 +885,7 @@ ManageWorkerTasksHash(HTAB *WorkerTasksHash)
currentTask = (WorkerTask *) hash_seq_search(&status);
}
LWLockRelease(WorkerTasksSharedState->taskHashLock);
LWLockRelease(&WorkerTasksSharedState->taskHashLock);
}

View File

@ -100,7 +100,7 @@ task_tracker_assign_task(PG_FUNCTION_ARGS)
UnlockJobResource(jobId, AccessExclusiveLock);
}
LWLockAcquire(WorkerTasksSharedState->taskHashLock, LW_EXCLUSIVE);
LWLockAcquire(&WorkerTasksSharedState->taskHashLock, LW_EXCLUSIVE);
/* check if we already have the task in our shared hash */
workerTask = WorkerTasksHashFind(jobId, taskId);
@ -113,7 +113,7 @@ task_tracker_assign_task(PG_FUNCTION_ARGS)
UpdateTask(workerTask, taskCallString);
}
LWLockRelease(WorkerTasksSharedState->taskHashLock);
LWLockRelease(&WorkerTasksSharedState->taskHashLock);
PG_RETURN_VOID();
}
@ -132,7 +132,7 @@ task_tracker_task_status(PG_FUNCTION_ARGS)
bool taskTrackerRunning = TaskTrackerRunning();
if (taskTrackerRunning)
{
LWLockAcquire(WorkerTasksSharedState->taskHashLock, LW_SHARED);
LWLockAcquire(&WorkerTasksSharedState->taskHashLock, LW_SHARED);
workerTask = WorkerTasksHashFind(jobId, taskId);
if (workerTask == NULL)
@ -144,7 +144,7 @@ task_tracker_task_status(PG_FUNCTION_ARGS)
taskStatus = (uint32) workerTask->taskStatus;
LWLockRelease(WorkerTasksSharedState->taskHashLock);
LWLockRelease(&WorkerTasksSharedState->taskHashLock);
}
else
{
@ -174,7 +174,7 @@ task_tracker_cleanup_job(PG_FUNCTION_ARGS)
* We first clean up any open connections, and remove tasks belonging to
* this job from the shared hash.
*/
LWLockAcquire(WorkerTasksSharedState->taskHashLock, LW_EXCLUSIVE);
LWLockAcquire(&WorkerTasksSharedState->taskHashLock, LW_EXCLUSIVE);
hash_seq_init(&status, WorkerTasksSharedState->taskHash);
@ -189,7 +189,7 @@ task_tracker_cleanup_job(PG_FUNCTION_ARGS)
currentTask = (WorkerTask *) hash_seq_search(&status);
}
LWLockRelease(WorkerTasksSharedState->taskHashLock);
LWLockRelease(&WorkerTasksSharedState->taskHashLock);
/*
* We then delete the job directory and schema, if they exist. This cleans
@ -233,7 +233,7 @@ TaskTrackerRunning(void)
* marker task to the shared hash. We need to look up this marker task since
* the postmaster doesn't send a terminate signal to running backends.
*/
LWLockAcquire(WorkerTasksSharedState->taskHashLock, LW_SHARED);
LWLockAcquire(&WorkerTasksSharedState->taskHashLock, LW_SHARED);
workerTask = WorkerTasksHashFind(RESERVED_JOB_ID, SHUTDOWN_MARKER_TASK_ID);
if (workerTask != NULL)
@ -241,7 +241,7 @@ TaskTrackerRunning(void)
taskTrackerRunning = false;
}
LWLockRelease(WorkerTasksSharedState->taskHashLock);
LWLockRelease(&WorkerTasksSharedState->taskHashLock);
return taskTrackerRunning;
}

View File

@ -98,7 +98,9 @@ typedef struct WorkerTasksSharedStateData
HTAB *taskHash;
/* Lock protecting workerNodesHash */
LWLock *taskHashLock;
int taskHashTrancheId;
LWLockTranche taskHashLockTranche;
LWLock taskHashLock;
} WorkerTasksSharedStateData;