Re: [PROPOSAL] Termination of Background Workers for ALTER/DROP DATABASE
От | Peter Smith |
---|---|
Тема | Re: [PROPOSAL] Termination of Background Workers for ALTER/DROP DATABASE |
Дата | |
Msg-id | CAHut+PuuOKKW2oDT0Z8q+UXsiteS67j6G6075FC3aAxeR0cxHQ@mail.gmail.com обсуждение исходный текст |
Ответ на | RE: [PROPOSAL] Termination of Background Workers for ALTER/DROP DATABASE ("Aya Iwata (Fujitsu)" <iwata.aya@fujitsu.com>) |
Ответы |
RE: [PROPOSAL] Termination of Background Workers for ALTER/DROP DATABASE
|
Список | pgsql-hackers |
Hi Iwata-San, Some v4 comments. ====== src/backend/postmaster/bgworker.c 1. + /* + * Set terminate flag in shared memory, unless slot has + * been used. + */ + for (int slotno = 0; slotno < BackgroundWorkerData->total_slots; ++slotno) + { + PGPROC *proc; + BackgroundWorkerSlot *slot = &BackgroundWorkerData->slot[slotno]; + + if (!slot->in_use) + continue; + + if (!(slot->worker.bgw_flags & BGWORKER_EXIT_AT_DATABASE_DROP)) + continue; + + proc = BackendPidGetProc(slot->pid); + + if (proc && proc->databaseId == databaseId) + { + slot->terminate = true; + signal_postmaster = true; + } + } 1a. It's not clear to me what you were trying to convey by saying "unless slot has been used" in the comment. Maybe you meant "unless slot is not in use", but is that useful even to say? Anyway, the comment as-is seems incorrect. ~ 1b. Sorry for wavering on this, but now that I see the resulting v4 code, I feel we don't really need any of those 'continues', and more if conditions can be combined. It becomes simpler. See if you agree. SUGGESTION: for (int slotno ...) { if (slot->in_use && (slot->worker.bgw_flags & BGWORKER_EXIT_AT_DATABASE_DROP)) { PGPROC *proc = BackendPidGetProc(slot->pid); if (proc && proc->databaseId == databaseId) { slot->terminate = true; signal_postmaster = true; } } } ====== src/backend/storage/ipc/procarray.c 2. + /* + * if set the bgw_flags, cancel background workers. + */ + CancelBackgroundWorkers(databaseId); + I was wondering about this function name "CancelXXX" -- do you "cancel" a worker, or do you "terminate" it? Isn't it better to name this new function more like the existing/similar TerminateBackgroundWorker() function? E.g. consider the following: /* * Terminate all background workers for this database, if * they had requested it (BGWORKER_EXIT_AT_DATABASE_DROP). */ TerminateBackgroundWorkersForDB(databaseId); ====== Kind Regards, Peter Smith. Fujitsu Australia
В списке pgsql-hackers по дате отправления: