Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 4ab6060

Browse files
author
Vladimir Ershov
committed
more clean but still bug in EE 9.6.2
1 parent d2b77ad commit 4ab6060

File tree

6 files changed

+43
-60
lines changed

6 files changed

+43
-60
lines changed

src/char_array.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ char_array_t *makeCharArray(void)
2525

2626
char_array_t *sortCharArray(char_array_t *a)
2727
{
28+
if(a->n <= 1) return a;
2829
qsort(a->data, a->n, sizeof(char *), __sort_char_string);
2930

3031
return a;

src/memutils.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,6 @@ void *worker_alloc(Size size)
2929

3030
void delete_worker_mem_ctx(void)
3131
{
32+
MemoryContextSwitchTo(TopMemoryContext);
3233
MemoryContextDelete(SchedulerWorkerContext);
3334
}

src/pgpro_scheduler.c

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ char_array_t *readBasesToCheck(void)
212212
pgstat_report_activity(STATE_RUNNING, "read configuration");
213213
result = makeCharArray();
214214

215-
value = GetConfigOption("schedule.database", 1, 0);
215+
value = GetConfigOption("schedule.database", true, false);
216216
if(!value || strlen(value) == 0)
217217
{
218218
return result;
@@ -254,6 +254,7 @@ char_array_t *readBasesToCheck(void)
254254
pfree(clean_value);
255255
if(names->n == 0)
256256
{
257+
destroyCharArray(names);
257258
return result;
258259
}
259260

@@ -264,46 +265,39 @@ char_array_t *readBasesToCheck(void)
264265
appendStringInfo(&sql, "'%s'", names->data[i]);
265266
if(i + 1 != names->n) appendStringInfo(&sql, ",");
266267
}
268+
destroyCharArray(names);
267269
appendStringInfo(&sql, ")");
268-
SetCurrentStatementStartTimestamp();
269-
StartTransactionCommand();
270-
SPI_connect();
271-
PushActiveSnapshot(GetTransactionSnapshot());
270+
271+
START_SPI_SNAP();
272272

273273
ret = SPI_execute(sql.data, true, 0);
274274
if (ret != SPI_OK_SELECT)
275275
{
276-
SPI_finish();
277-
PopActiveSnapshot();
278-
CommitTransactionCommand();
276+
STOP_SPI_SNAP();
279277
elog(ERROR, "cannot select from pg_database");
280278
}
281-
destroyCharArray(names);
282279
processed = SPI_processed;
283280
if(processed == 0)
284281
{
285-
SPI_finish();
286-
PopActiveSnapshot();
287-
CommitTransactionCommand();
282+
STOP_SPI_SNAP();
288283
return result;
289284
}
290285
for(i=0; i < processed; i++)
291286
{
292287
clean_value = SPI_getvalue(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 1);
293288
pushCharArray(result, clean_value);
294289
}
295-
SPI_finish();
296-
PopActiveSnapshot();
297-
CommitTransactionCommand();
290+
STOP_SPI_SNAP();
298291
sortCharArray(result);
292+
299293
return result;
300294
}
301295

302296
void parent_scheduler_main(Datum arg)
303297
{
304298
int rc = 0, i;
305299
char_array_t *names = NULL;
306-
schd_managers_poll_t *poll;
300+
schd_managers_poll_t *pool;
307301
schd_manager_share_t *shared;
308302
bool refresh = false;
309303

@@ -320,10 +314,10 @@ void parent_scheduler_main(Datum arg)
320314

321315
BackgroundWorkerInitializeConnection("postgres", NULL);
322316
names = readBasesToCheck();
323-
poll = initSchedulerManagerPool(names);
317+
pool = initSchedulerManagerPool(names);
324318
destroyCharArray(names);
325319

326-
set_supervisor_pgstatus(poll);
320+
set_supervisor_pgstatus(pool);
327321

328322
while(!got_sigterm)
329323
{
@@ -335,62 +329,62 @@ void parent_scheduler_main(Datum arg)
335329
ProcessConfigFile(PGC_SIGHUP);
336330
refresh = false;
337331
names = NULL;
338-
if(is_scheduler_enabled() != poll->enabled)
332+
if(is_scheduler_enabled() != pool->enabled)
339333
{
340-
if(poll->enabled)
334+
if(pool->enabled)
341335
{
342-
poll->enabled = false;
343-
stopAllManagers(poll);
344-
set_supervisor_pgstatus(poll);
336+
pool->enabled = false;
337+
stopAllManagers(pool);
338+
set_supervisor_pgstatus(pool);
345339
}
346340
else
347341
{
348342
refresh = true;
349-
poll->enabled = true;
343+
pool->enabled = true;
350344
names = readBasesToCheck();
351345
}
352346
}
353-
else if(poll->enabled)
347+
else if(pool->enabled)
354348
{
355349
names = readBasesToCheck();
356-
if(isBaseListChanged(names, poll)) refresh = true;
350+
if(isBaseListChanged(names, pool)) refresh = true;
357351
else destroyCharArray(names);
358352
}
359353

360354
if(refresh)
361355
{
362-
refreshManagers(names, poll);
363-
set_supervisor_pgstatus(poll);
356+
refreshManagers(names, pool);
357+
set_supervisor_pgstatus(pool);
364358
destroyCharArray(names);
365359
}
366360
}
367361
else
368362
{
369-
for(i=0; i < poll->n; i++)
363+
for(i=0; i < pool->n; i++)
370364
{
371-
shared = dsm_segment_address(poll->workers[i]->shared);
365+
shared = dsm_segment_address(pool->workers[i]->shared);
372366

373367
if(shared->setbychild)
374368
{
375-
/* elog(LOG, "got status change from: %s", poll->workers[i]->dbname); */
369+
/* elog(LOG, "got status change from: %s", pool->workers[i]->dbname); */
376370
shared->setbychild = false;
377371
if(shared->status == SchdManagerConnected)
378372
{
379-
poll->workers[i]->connected = true;
373+
pool->workers[i]->connected = true;
380374
}
381375
else if(shared->status == SchdManagerQuit)
382376
{
383-
removeManagerFromPoll(poll, poll->workers[i]->dbname, 1, true);
384-
set_supervisor_pgstatus(poll);
377+
removeManagerFromPoll(pool, pool->workers[i]->dbname, 1, true);
378+
set_supervisor_pgstatus(pool);
385379
}
386380
else if(shared->status == SchdManagerDie)
387381
{
388-
removeManagerFromPoll(poll, poll->workers[i]->dbname, 1, false);
389-
set_supervisor_pgstatus(poll);
382+
removeManagerFromPoll(pool, pool->workers[i]->dbname, 1, false);
383+
set_supervisor_pgstatus(pool);
390384
}
391385
else
392386
{
393-
elog(WARNING, "manager: %s set strange status: %d", poll->workers[i]->dbname, shared->status);
387+
elog(WARNING, "manager: %s set strange status: %d", pool->workers[i]->dbname, shared->status);
394388
}
395389
}
396390
}
@@ -400,7 +394,7 @@ void parent_scheduler_main(Datum arg)
400394
CHECK_FOR_INTERRUPTS();
401395
ResetLatch(MyLatch);
402396
}
403-
stopAllManagers(poll);
397+
stopAllManagers(pool);
404398
delete_worker_mem_ctx();
405399

406400
proc_exit(0);

src/sched_manager_poll.c

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -297,14 +297,8 @@ int addManagerToPoll(schd_managers_poll_t *poll, char *name, int sort)
297297
schd_manager_t *man;
298298
schd_manager_share_t *shm_data;
299299
Size segsize;
300-
/* shm_toc_estimator e;
301-
shm_toc *toc; */
302300
dsm_segment *seg;
303301

304-
/* shm_toc_initialize_estimator(&e);
305-
shm_toc_estimate_chunk(&e, sizeof(schd_manager_share_t));
306-
shm_toc_estimate_keys(&e, 1);
307-
segsize = shm_toc_estimate(&e); */
308302
segsize = (Size)sizeof(schd_manager_share_t);
309303

310304
CurrentResourceOwner = ResourceOwnerCreate(NULL, "pgpro_scheduler");
@@ -315,11 +309,6 @@ int addManagerToPoll(schd_managers_poll_t *poll, char *name, int sort)
315309
man->connected = false;
316310
memcpy(man->dbname, name, strlen(name) + 1);
317311
man->shared = seg;
318-
/* toc = shm_toc_create(PGPRO_SHM_TOC_MAGIC, dsm_segment_address(man->shared),
319-
segsize);
320-
321-
shm_data = shm_toc_allocate(toc, sizeof(schd_manager_share_t));
322-
shm_toc_insert(toc, 0, shm_data); */
323312
shm_data = dsm_segment_address(man->shared);
324313

325314
shm_data->setbyparent = true;

src/scheduler_executor.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ void executor_worker_main(Datum arg)
108108
BackgroundWorkerUnblockSignals();
109109

110110
init_worker_mem_ctx("ExecutorMemoryContext");
111-
switch_to_worker_context();
112111
worker_jobs_limit = read_worker_job_limit();
113112

114113
while(1)
@@ -626,15 +625,15 @@ void at_executor_worker_main(Datum arg)
626625
if(seg == NULL)
627626
ereport(ERROR,
628627
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
629-
errmsg("executor unable to map dynamic shared memory segment")));
628+
errmsg("at-executor unable to map dynamic shared memory segment")));
630629
shared = dsm_segment_address(seg);
631630
/* parent = BackendPidGetProc(MyBgworkerEntry->bgw_notify_pid); */
632631

633632
if(shared->status != SchdExecutorInit)
634633
{
635634
ereport(ERROR,
636635
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
637-
errmsg("executor corrupted dynamic shared memory segment")));
636+
errmsg("at-executor corrupted dynamic shared memory segment")));
638637
}
639638
shared->start_at = GetCurrentTimestamp();
640639

@@ -647,7 +646,6 @@ void at_executor_worker_main(Datum arg)
647646
BackgroundWorkerUnblockSignals();
648647

649648
init_worker_mem_ctx("ExecutorMemoryContext");
650-
switch_to_worker_context();
651649

652650
while(1)
653651
{
@@ -730,6 +728,7 @@ int process_one_job(schd_executor_share_state_t *shared, schd_executor_status_t
730728
return -1;
731729
} */
732730
STOP_SPI_SNAP(); /* Commit changes */
731+
elog(LOG, "JOB MOVED TO PROCESSED");
733732
pgstat_report_activity(STATE_RUNNING, "job initialized");
734733
START_SPI_SNAP();
735734

@@ -753,6 +752,7 @@ int process_one_job(schd_executor_share_state_t *shared, schd_executor_status_t
753752
return -1;
754753
}
755754
STOP_SPI_SNAP();
755+
elog(LOG, "JOB MOVED TO DONE");
756756
return 1;
757757
}
758758

src/scheduler_manager.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,14 @@ int checkSchedulerNamespace(void)
5858

5959
schema = GetConfigOption("schedule.schema", false, true);
6060

61-
StartTransactionCommand();
62-
SPI_connect();
63-
PushActiveSnapshot(GetTransactionSnapshot());
61+
START_SPI_SNAP();
6462

6563
values[0] = CStringGetTextDatum(schema);
6664
count = select_count_with_args(sql, 1, argtypes, values, NULL);
6765

6866
if(count == -1)
6967
{
68+
STOP_SPI_SNAP();
7069
elog(ERROR, "Scheduler manager: %s: cannot check namespace: sql error",
7170
MyBgworkerEntry->bgw_name);
7271
}
@@ -82,13 +81,12 @@ int checkSchedulerNamespace(void)
8281
}
8382
else if(count != 1)
8483
{
84+
STOP_SPI_SNAP();
8585
elog(ERROR, "Scheduler manager: %s: cannot check namespace: "
8686
"unknown error %d", MyBgworkerEntry->bgw_name, count);
8787
}
88+
STOP_SPI_SNAP();
8889

89-
SPI_finish();
90-
PopActiveSnapshot();
91-
CommitTransactionCommand();
9290
if(count) {
9391
SetConfigOption("search_path", schema, PGC_USERSET, PGC_S_SESSION);
9492
}
@@ -1762,7 +1760,7 @@ void manager_worker_main(Datum arg)
17621760
{
17631761
got_sighup = false;
17641762
ProcessConfigFile(PGC_SIGHUP);
1765-
reload_db_role_config(database);
1763+
reload_db_role_config(database);
17661764
refresh_scheduler_manager_context(ctx);
17671765
set_slots_stat_report(ctx);
17681766
}

0 commit comments

Comments
 (0)