Skip to content

Commit 695a5d0

Browse files
author
Vladimir Ershov
committed
more accurate context switching
1 parent ba22bba commit 695a5d0

File tree

6 files changed

+35
-39
lines changed

6 files changed

+35
-39
lines changed

src/memutils.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@ void *worker_alloc(Size size)
3535
return MemoryContextAlloc(SchedulerWorkerContext, size);
3636
}
3737

38-
void delete_worker_mem_ctx(void)
38+
void delete_worker_mem_ctx(MemoryContext old)
3939
{
40-
MemoryContextSwitchTo(TopMemoryContext);
40+
if(!old) old = TopMemoryContext;
41+
42+
MemoryContextSwitchTo(old);
4143
MemoryContextDelete(SchedulerWorkerContext);
4244
SchedulerWorkerContext = NULL;
4345
}

src/memutils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ MemoryContext init_worker_mem_ctx(const char *name);
1010
MemoryContext init_mem_ctx(const char *name);
1111
MemoryContext switch_to_worker_context(void);
1212
void *worker_alloc(Size size);
13-
void delete_worker_mem_ctx(void);
13+
void delete_worker_mem_ctx(MemoryContext toswitch);
1414

1515
#endif

src/pgpro_scheduler.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ void parent_scheduler_main(Datum arg)
395395
ResetLatch(MyLatch);
396396
}
397397
stopAllManagers(pool);
398-
delete_worker_mem_ctx();
398+
delete_worker_mem_ctx(NULL);
399399

400400
proc_exit(0);
401401
}

src/scheduler_executor.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ void executor_worker_main(Datum arg)
8484
PGPROC *parent;
8585

8686
CurrentResourceOwner = ResourceOwnerCreate(NULL, "pgpro_scheduler_executor");
87+
init_worker_mem_ctx("ExecutorMemoryContext");
88+
8789
seg = dsm_attach(DatumGetInt32(arg));
8890
if(seg == NULL)
8991
ereport(ERROR,
@@ -107,7 +109,6 @@ void executor_worker_main(Datum arg)
107109
pqsignal(SIGHUP, worker_spi_sighup);
108110
BackgroundWorkerUnblockSignals();
109111

110-
init_worker_mem_ctx("ExecutorMemoryContext");
111112
worker_jobs_limit = read_worker_job_limit();
112113

113114
while(1)
@@ -146,7 +147,7 @@ void executor_worker_main(Datum arg)
146147
shared->worker_exit = true;
147148
shared->status = SchdExecutorError;
148149
}
149-
delete_worker_mem_ctx();
150+
delete_worker_mem_ctx(NULL);
150151
dsm_detach(seg);
151152
proc_exit(0);
152153
}
@@ -157,7 +158,7 @@ void executor_worker_main(Datum arg)
157158
if(rc && rc & WL_POSTMASTER_DEATH) break;
158159
}
159160

160-
delete_worker_mem_ctx();
161+
delete_worker_mem_ctx(NULL);
161162
dsm_detach(seg);
162163
proc_exit(0);
163164
}
@@ -360,7 +361,7 @@ int set_session_authorization(char *username, char **error)
360361
int rv;
361362
char *sql = "select oid, rolsuper from pg_catalog.pg_roles where rolname = $1";
362363
char buff[1024];
363-
MemoryContext mem = CurrentMemoryContext;
364+
MemoryContext mem = SchedulerWorkerContext;
364365

365366
values[0] = CStringGetTextDatum(username);
366367
START_SPI_SNAP();
@@ -440,7 +441,7 @@ TimestampTz get_next_excution_time(char *sql, executor_error_t *ee)
440441

441442
START_SPI_SNAP();
442443
pgstat_report_activity(STATE_RUNNING, "culc next time execution time");
443-
r = execute_spi(CurrentMemoryContext, sql);
444+
r = execute_spi(SchedulerWorkerContext, sql);
444445
if(r->retval < 0)
445446
{
446447
if(r->error)
@@ -665,6 +666,7 @@ void at_executor_worker_main(Datum arg)
665666
/* PGPROC *parent; */
666667

667668
CurrentResourceOwner = ResourceOwnerCreate(NULL, "pgpro_scheduler_at_executor");
669+
init_worker_mem_ctx("ExecutorMemoryContext");
668670
seg = dsm_attach(DatumGetInt32(arg));
669671
if(seg == NULL)
670672
ereport(ERROR,
@@ -689,7 +691,6 @@ void at_executor_worker_main(Datum arg)
689691
pqsignal(SIGHUP, worker_spi_sighup);
690692
BackgroundWorkerUnblockSignals();
691693

692-
init_worker_mem_ctx("ExecutorMemoryContext");
693694

694695
while(1)
695696
{
@@ -708,7 +709,7 @@ void at_executor_worker_main(Datum arg)
708709
}
709710
else if(result < 0)
710711
{
711-
delete_worker_mem_ctx();
712+
delete_worker_mem_ctx(NULL);
712713
dsm_detach(seg);
713714
proc_exit(1);
714715
}
@@ -730,7 +731,7 @@ void at_executor_worker_main(Datum arg)
730731
elog(LOG, "at worker stopped by parent signal");
731732
}
732733

733-
delete_worker_mem_ctx();
734+
delete_worker_mem_ctx(NULL);
734735
dsm_detach(seg);
735736
proc_exit(0);
736737
}

src/scheduler_manager.c

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1738,7 +1738,7 @@ void start_at_workers(scheduler_manager_ctx_t *ctx, schd_manager_share_t *shared
17381738
if(start_at_worker(ctx, i) == 0)
17391739
{
17401740
scheduler_manager_stop(ctx);
1741-
delete_worker_mem_ctx();
1741+
delete_worker_mem_ctx(NULL);
17421742
changeChildBgwState(shared, SchdManagerDie);
17431743
dsm_detach(ctx->seg);
17441744
proc_exit(0);
@@ -1757,7 +1757,7 @@ void manager_worker_main(Datum arg)
17571757
scheduler_manager_ctx_t *ctx;
17581758
int wait = 0;
17591759
schd_manager_share_t *parent_shared;
1760-
MemoryContext old;
1760+
MemoryContext old = NULL;
17611761
MemoryContext longTerm;
17621762

17631763

@@ -1795,7 +1795,7 @@ void manager_worker_main(Datum arg)
17951795
elog(LOG, "cannot start scheduler for %s - there is no namespace", database);
17961796
changeChildBgwState(shared, SchdManagerQuit);
17971797
dsm_detach(seg);
1798-
delete_worker_mem_ctx();
1798+
delete_worker_mem_ctx(NULL);
17991799
proc_exit(0);
18001800
}
18011801
SetCurrentStatementStartTimestamp();
@@ -1837,17 +1837,12 @@ void manager_worker_main(Datum arg)
18371837
{
18381838
wait = 0;
18391839
if(check_parent_stop_signal(ctx, parent_shared)) break;
1840-
/** start at jobs **/
1841-
/**** wait += scheduler_start_jobs(ctx, AtJob); */
18421840

18431841
/** start cron jobs **/
18441842
wait += scheduler_start_jobs(ctx, CronJob);
18451843

1846-
/** check at slots **/
1847-
/**** scheduler_check_slots(ctx, &(ctx->at)); */
1848-
18491844
/** check cron slots **/
1850-
scheduler_check_slots(ctx, &(ctx->cron));
1845+
scheduler_check_slots(ctx, &(ctx->cron));
18511846

18521847
scheduler_make_atcron_record(ctx);
18531848
set_slots_stat_report(ctx);
@@ -1858,16 +1853,15 @@ void manager_worker_main(Datum arg)
18581853
}
18591854
}
18601855

1861-
MemoryContextSwitchTo(old);
1862-
delete_worker_mem_ctx();
1856+
delete_worker_mem_ctx(old);
18631857
rc = WaitLatch(MyLatch,
18641858
WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH, 1500L);
18651859
ResetLatch(MyLatch);
18661860
}
18671861
scheduler_manager_stop(ctx);
18681862
pgstat_report_activity(STATE_RUNNING, "finalize manager");
18691863
changeChildBgwState(shared, SchdManagerDie);
1870-
if(SchedulerWorkerContext) delete_worker_mem_ctx();
1864+
if(SchedulerWorkerContext) delete_worker_mem_ctx(old);
18711865
dsm_detach(seg);
18721866
pgstat_report_activity(STATE_RUNNING, "drop context");
18731867
MemoryContextDelete(longTerm);
@@ -1888,7 +1882,7 @@ void manager_fatal_error(scheduler_manager_ctx_t *ctx, int ecode, char *message,
18881882
va_end(arglist);
18891883

18901884

1891-
delete_worker_mem_ctx();
1885+
delete_worker_mem_ctx(NULL);
18921886
if(ecode == 0)
18931887
{
18941888
ecode = ERRCODE_INTERNAL_ERROR;

src/scheduler_spi_utils.c

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,9 @@ spi_response_t *__copy_spi_data(MemoryContext ctx, int ret, int n)
9393
int i, j;
9494
Datum dat;
9595
bool is_null;
96+
MemoryContext old;
9697

97-
98+
old = MemoryContextSwitchTo(ctx);
9899
r = MemoryContextAlloc(ctx, sizeof(spi_response_t));
99100
if(!r) return NULL;
100101
r->retval = ret;
@@ -147,6 +148,7 @@ spi_response_t *__copy_spi_data(MemoryContext ctx, int ret, int n)
147148
}
148149
}
149150
}
151+
MemoryContextSwitchTo(old);
150152

151153
return r;
152154
}
@@ -495,32 +497,32 @@ spi_response_t *execute_spi_sql_with_args(MemoryContext ctx, const char *sql, in
495497
char other[100];
496498
ResourceOwner oldowner = CurrentResourceOwner;
497499
spi_response_t *rv = NULL;
498-
MemoryContext old;
500+
MemoryContext old = CurrentMemoryContext;
499501

500502
if(!ctx) ctx = SchedulerWorkerContext;
501503

504+
505+
502506
SetCurrentStatementStartTimestamp();
503507
BeginInternalSubTransaction(NULL);
504-
old = MemoryContextSwitchTo(ctx);
508+
MemoryContextSwitchTo(old);
505509

506510
PG_TRY();
507511
{
508512
ret = SPI_execute_with_args(sql, n, argtypes, values, nulls, false, 0);
509-
MemoryContextSwitchTo(ctx);
510513
rv = __copy_spi_data(ctx, ret, SPI_processed);
511514
if(!rv)
512515
{
513516
elog(LOG, "ESSWA: Cannot allocate memory while copy resp data");
514517
return NULL;
515518
}
516519
ReleaseCurrentSubTransaction();
517-
MemoryContextSwitchTo(ctx);
520+
MemoryContextSwitchTo(old);
518521
CurrentResourceOwner = oldowner;
519522
SPI_restore_connection();
520523
}
521524
PG_CATCH();
522525
{
523-
MemoryContextSwitchTo(ctx);
524526
edata = CopyErrorData();
525527
if(edata->message)
526528
{
@@ -541,7 +543,7 @@ spi_response_t *execute_spi_sql_with_args(MemoryContext ctx, const char *sql, in
541543
}
542544
RollbackAndReleaseCurrentSubTransaction();
543545
CurrentResourceOwner = oldowner;
544-
MemoryContextSwitchTo(ctx);
546+
MemoryContextSwitchTo(old);
545547
SPI_restore_connection();
546548
FreeErrorData(edata);
547549
FlushErrorState();
@@ -574,12 +576,10 @@ spi_response_t *execute_spi_sql_with_args(MemoryContext ctx, const char *sql, in
574576
if(!rv)
575577
{
576578
elog(LOG, "ESSWA: Cannot allocate memory while reporting pg error");
577-
MemoryContextSwitchTo(old);
578579
return NULL;
579580
}
580581
}
581582

582-
MemoryContextSwitchTo(old);
583583
return rv;
584584
}
585585

@@ -599,6 +599,7 @@ spi_response_t *execute_spi_params_prepared(MemoryContext ctx, const char *sql,
599599
int i;
600600
ResourceOwner oldowner = CurrentResourceOwner;
601601
spi_response_t *rv;
602+
MemoryContext old = CurrentMemoryContext;
602603

603604
if(!ctx) ctx = SchedulerWorkerContext;
604605

@@ -613,7 +614,7 @@ spi_response_t *execute_spi_params_prepared(MemoryContext ctx, const char *sql,
613614

614615
SetCurrentStatementStartTimestamp();
615616
BeginInternalSubTransaction(NULL);
616-
switch_to_worker_context();
617+
MemoryContextSwitchTo(old);
617618

618619
PG_TRY();
619620
{
@@ -630,14 +631,12 @@ spi_response_t *execute_spi_params_prepared(MemoryContext ctx, const char *sql,
630631
}
631632
}
632633
ReleaseCurrentSubTransaction();
633-
switch_to_worker_context();
634+
MemoryContextSwitchTo(old);
634635
CurrentResourceOwner = oldowner;
635636
SPI_restore_connection();
636637
}
637638
PG_CATCH();
638639
{
639-
switch_to_worker_context();
640-
641640
edata = CopyErrorData();
642641
if(edata->message)
643642
{
@@ -660,7 +659,7 @@ spi_response_t *execute_spi_params_prepared(MemoryContext ctx, const char *sql,
660659
FlushErrorState();
661660
RollbackAndReleaseCurrentSubTransaction();
662661
CurrentResourceOwner = oldowner;
663-
switch_to_worker_context();
662+
MemoryContextSwitchTo(old);
664663
SPI_restore_connection();
665664
}
666665
PG_END_TRY();

0 commit comments

Comments
 (0)