Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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)