Skip to content

Commit 7622498

Browse files
author
Vladimir Ershov
committed
more accurate alloc
1 parent 5784b1a commit 7622498

File tree

2 files changed

+65
-7
lines changed

2 files changed

+65
-7
lines changed

src/scheduler_executor.c

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,13 @@ void executor_worker_main(Datum arg)
139139
}
140140
else if(result < 0)
141141
{
142+
if(result == -100)
143+
{
144+
snprintf(shared->message, PGPRO_SCHEDULER_EXECUTOR_MESSAGE_MAX,
145+
"Cannot allocate memory");
146+
shared->worker_exit = true;
147+
shared->status = SchdExecutorError;
148+
}
142149
delete_worker_mem_ctx();
143150
dsm_detach(seg);
144151
proc_exit(0);
@@ -159,10 +166,11 @@ int do_one_job(schd_executor_share_t *shared, schd_executor_status_t *status)
159166
{
160167
executor_error_t EE;
161168
char *error = NULL;
162-
int i;
169+
int i, ret;
163170
job_t *job;
164171
spi_response_t *r;
165172
MemoryContext old, mem;
173+
char buffer[1024];
166174

167175
EE.n = 0;
168176
EE.errors = NULL;
@@ -245,24 +253,29 @@ int do_one_job(schd_executor_share_t *shared, schd_executor_status_t *status)
245253
{
246254
r = execute_spi(mem, job->dosql[i]);
247255
}
256+
snprintf(buffer, 1024, "finalize: %s", job->dosql[i]);
257+
if(!r) return -100; /* cannot allocate memory */
258+
pgstat_report_activity(STATE_RUNNING, buffer);
248259
if(r->retval < 0)
249260
{
250261
/* success = false; */
251262
*status = SchdExecutorError;
252263
if(r->error)
253264
{
254-
push_executor_error(&EE, "error in command #%d: %s",
265+
ret = push_executor_error(&EE, "error in command #%d: %s",
255266
i+1, r->error);
256267
}
257268
else
258269
{
259-
push_executor_error(&EE, "error in command #%d: code: %d",
270+
ret = push_executor_error(&EE, "error in command #%d: code: %d",
260271
i+1, r->retval);
261272
}
273+
if(ret < 0) return -100; /* cannot alloc memory */
262274
destroy_spi_data(r);
263275
ABORT_SPI_SNAP();
264276
SetConfigOption("schedule.transaction_state", "failure", PGC_INTERNAL, PGC_S_SESSION);
265-
executor_onrollback(mem, job, &EE);
277+
if(executor_onrollback(mem, job, &EE) == -14000)
278+
return -100; /* cannot alloc memory */
266279

267280
break;
268281
}
@@ -486,11 +499,13 @@ int executor_onrollback(MemoryContext mem, job_t *job, executor_error_t *ee)
486499
{
487500
if(r->error)
488501
{
489-
push_executor_error(ee, "onrollback error: %s", r->error);
502+
if(push_executor_error(ee, "onrollback error: %s", r->error)) < 0)
503+
return -14000;
490504
}
491505
else
492506
{
493-
push_executor_error(ee, "onrollback error: unknown: %d", r->retval);
507+
if(push_executor_error(ee, "onrollback error: unknown: %d", r->retval)) < 0)
508+
return -14000;
494509
}
495510
ABORT_SPI_SNAP();
496511
}
@@ -583,6 +598,10 @@ int push_executor_error(executor_error_t *e, char *fmt, ...)
583598
{
584599
e->errors = repalloc(e->errors, sizeof(char *) * (e->n+1));
585600
}
601+
if(e->errors == NULL)
602+
{
603+
return -1;
604+
}
586605
e->errors[e->n] = worker_alloc(sizeof(char)*(len + 1));
587606
memcpy(e->errors[e->n], buf, len+1);
588607

src/scheduler_spi_utils.c

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,16 @@ spi_response_t *__error_spi_resp(MemoryContext ctx, int ret, char *error)
7373
spi_response_t *r;
7474

7575
r = MemoryContextAlloc(ctx, sizeof(spi_response_t));
76+
if(!r) return NULL;
77+
7678
r->n_rows = 0;
7779
r->n_attrs = 0;
7880
r->retval = ret;
7981
r->types = NULL;
8082
r->rows = NULL;
8183
r->ref = NULL;
8284
r->error = _mcopy_string(ctx, error);
85+
if(!(r->error) return NULL;
8386

8487
return r;
8588
}
@@ -93,6 +96,7 @@ spi_response_t *__copy_spi_data(MemoryContext ctx, int ret, int n)
9396

9497

9598
r = MemoryContextAlloc(ctx, sizeof(spi_response_t));
99+
if(!r) return NULL;
96100
r->retval = ret;
97101
r->error = NULL;
98102

@@ -109,9 +113,11 @@ spi_response_t *__copy_spi_data(MemoryContext ctx, int ret, int n)
109113
r->n_rows = n;
110114
r->n_attrs = SPI_tuptable->tupdesc->natts;
111115
r->types = MemoryContextAlloc(ctx, sizeof(Oid) * r->n_attrs);
116+
if(!r->types) return NULL;
112117
r->rows = MemoryContextAlloc(ctx, sizeof(spi_val_t *) * n);
118+
if(!r->rows) return NULL;
113119
r->ref = MemoryContextAlloc(ctx, sizeof(bool) * r->n_attrs);
114-
120+
if(!r->ref) return NULL;
115121

116122
for(i=0; i < r->n_attrs; i++)
117123
{
@@ -122,6 +128,7 @@ spi_response_t *__copy_spi_data(MemoryContext ctx, int ret, int n)
122128
for(i=0; i < n; i++)
123129
{
124130
r->rows[i] = MemoryContextAlloc(ctx, sizeof(spi_val_t) * r->n_attrs);
131+
if(!(r->rows[i])) return NULL;
125132
for(j=0; j < r->n_attrs; j++)
126133
{
127134
dat = SPI_getbinval(SPI_tuptable->vals[i],
@@ -152,6 +159,7 @@ char *_mcopy_string(MemoryContext ctx, char *str)
152159
if(!ctx) ctx = SchedulerWorkerContext;
153160

154161
cpy = MemoryContextAlloc(ctx, sizeof(char) * (len+1));
162+
if(!cpy) return NULL;
155163

156164
memcpy(cpy, str, len);
157165
cpy[len] = 0;
@@ -165,6 +173,7 @@ char *my_copy_string(char *str)
165173
char *cpy;
166174

167175
cpy = palloc(sizeof(char) * (len+1));
176+
if(!cpy) return NULL;
168177

169178
memcpy(cpy, str, len);
170179
cpy[len] = 0;
@@ -497,6 +506,11 @@ spi_response_t *execute_spi_sql_with_args(MemoryContext ctx, const char *sql, in
497506
ret = SPI_execute_with_args(sql, n, argtypes, values, nulls, false, 0);
498507
MemoryContextSwitchTo(ctx);
499508
rv = __copy_spi_data(ctx, ret, SPI_processed);
509+
if(!rv)
510+
{
511+
elog(LOG, "ESSWA: Cannot allocate memory while copy resp data");
512+
return NULL;
513+
}
500514
ReleaseCurrentSubTransaction();
501515
MemoryContextSwitchTo(ctx);
502516
CurrentResourceOwner = oldowner;
@@ -518,6 +532,11 @@ spi_response_t *execute_spi_sql_with_args(MemoryContext ctx, const char *sql, in
518532
{
519533
rv = __error_spi_resp(ctx, ret, "unknown error");
520534
}
535+
if(!rv)
536+
{
537+
elog(LOG, "ESSWA: Cannot allocate memory while reporting error");
538+
return NULL;
539+
}
521540
RollbackAndReleaseCurrentSubTransaction();
522541
CurrentResourceOwner = oldowner;
523542
MemoryContextSwitchTo(ctx);
@@ -550,6 +569,11 @@ spi_response_t *execute_spi_sql_with_args(MemoryContext ctx, const char *sql, in
550569
sprintf(other, "error number: %d", ret);
551570
rv = __error_spi_resp(ctx, ret, other);
552571
}
572+
if(!rv)
573+
{
574+
elog(LOG, "ESSWA: Cannot allocate memory while reporting pg error");
575+
return NULL;
576+
}
553577
}
554578

555579
return rv;
@@ -595,6 +619,11 @@ spi_response_t *execute_spi_params_prepared(MemoryContext ctx, const char *sql,
595619
SetCurrentStatementStartTimestamp();
596620
ret = SPI_execute_plan(plan, values, NULL, false, 0);
597621
rv = __copy_spi_data(ctx, ret, SPI_processed);
622+
if(!rv)
623+
{
624+
elog(LOG, "ESSWAP: Cannot allocate memory while copy data");
625+
return NULL;
626+
}
598627
}
599628
ReleaseCurrentSubTransaction();
600629
switch_to_worker_context();
@@ -618,6 +647,11 @@ spi_response_t *execute_spi_params_prepared(MemoryContext ctx, const char *sql,
618647
{
619648
rv = __error_spi_resp(ctx, ret, "unknown error");
620649
}
650+
if(!rv)
651+
{
652+
elog(LOG, "ESSWAP: Cannot allocate memory while report error");
653+
return NULL;
654+
}
621655
FreeErrorData(edata);
622656
FlushErrorState();
623657
RollbackAndReleaseCurrentSubTransaction();
@@ -653,6 +687,11 @@ spi_response_t *execute_spi_params_prepared(MemoryContext ctx, const char *sql,
653687
sprintf(other, "error number: %d", ret);
654688
rv = __error_spi_resp(ctx, ret, other);
655689
}
690+
if(!rv)
691+
{
692+
elog(LOG, "ESSWAP: Cannot allocate memory while report pg error");
693+
return NULL;
694+
}
656695
}
657696

658697
return rv;

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