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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy