Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit7622498

Browse files
author
Vladimir Ershov
committed
more accurate alloc
1 parent5784b1a commit7622498

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
elseif(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_tEE;
161168
char*error=NULL;
162-
inti;
169+
inti,ret;
163170
job_t*job;
164171
spi_response_t*r;
165172
MemoryContextold,mem;
173+
charbuffer[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)returnNULL;
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)returnNULL;
8386

8487
returnr;
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)returnNULL;
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)returnNULL;
112117
r->rows=MemoryContextAlloc(ctx,sizeof(spi_val_t*)*n);
118+
if(!r->rows)returnNULL;
113119
r->ref=MemoryContextAlloc(ctx,sizeof(bool)*r->n_attrs);
114-
120+
if(!r->ref)returnNULL;
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]))returnNULL;
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)returnNULL;
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)returnNULL;
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+
returnNULL;
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+
returnNULL;
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+
returnNULL;
576+
}
553577
}
554578

555579
returnrv;
@@ -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+
returnNULL;
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+
returnNULL;
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+
returnNULL;
694+
}
656695
}
657696

658697
returnrv;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp