@@ -615,6 +615,8 @@ int _find_stat_database(scheduler_stat_t *list, char *dbname)
615
615
{
616
616
int i ;
617
617
618
+ if (list -> num_db == 0 ) return -1 ;
619
+
618
620
for (i = 0 ; i < list -> num_db ; i ++ )
619
621
{
620
622
if (strcmp (list -> dats [i ]-> name , dbname ) == 0 ) return i ;
@@ -1132,7 +1134,7 @@ scheduler_status(PG_FUNCTION_ARGS)
1132
1134
current = (char * )GetConfigOption ("schedule.database" , false, true);
1133
1135
in_use = _split_string_to_char_array (current , true);
1134
1136
1135
- list .super_pid = InvalidPid ;
1137
+ list .super_pid = 0 ;
1136
1138
list .super_datname [0 ] = 0 ;
1137
1139
list .num_db = in_use ? in_use -> n : 0 ;
1138
1140
if (list .num_db )
@@ -1146,13 +1148,17 @@ scheduler_status(PG_FUNCTION_ARGS)
1146
1148
if (!list .dats [i ])
1147
1149
elog (ERROR , "cannot alloc memory for pgpro_scheduler database stat" );
1148
1150
snprintf (list .dats [i ]-> name , NAMEDATALEN , "%s" , in_use -> data [i ]);
1149
- list .dats [i ]-> manager_pid = InvalidPid ;
1151
+ list .dats [i ]-> manager_pid = 0 ;
1150
1152
list .dats [i ]-> nexecs = 0 ;
1151
1153
list .dats [i ]-> execs = palloc (sizeof (pid_t )* max_worker_processes );
1152
1154
list .dats [i ]-> natexecs = 0 ;
1153
1155
list .dats [i ]-> atexecs = palloc (sizeof (pid_t )* max_worker_processes );
1154
1156
}
1155
1157
}
1158
+ else
1159
+ {
1160
+ list .dats = NULL ;
1161
+ }
1156
1162
1157
1163
num_backends = pgstat_fetch_stat_numbackends ();
1158
1164
for (i = 1 ; i <= num_backends ; i ++ )
@@ -1205,53 +1211,57 @@ scheduler_status(PG_FUNCTION_ARGS)
1205
1211
{
1206
1212
if (list .dats [i ]-> manager_pid == 0 ) nrecords ++ ;
1207
1213
}
1208
-
1209
- records = palloc (sizeof (scheduler_stat_record_t ) * nrecords );
1210
- if (list .super_pid )
1214
+
1215
+ if (nrecords == 0 )
1211
1216
{
1212
- records [nr ].pid = list .super_pid ;
1213
- records [nr ].datname = list .super_datname ;
1214
- records [nr ].name = names [0 ];
1215
- nr ++ ;
1217
+ funcctx -> max_calls = 0 ;
1218
+ funcctx -> user_fctx = NULL ;
1216
1219
}
1217
- for ( i = 0 ; i < list . num_db ; i ++ )
1220
+ else
1218
1221
{
1219
- if (list .dats [i ]-> manager_pid )
1222
+ records = palloc (sizeof (scheduler_stat_record_t ) * nrecords );
1223
+ if (list .super_pid )
1220
1224
{
1221
- records [nr ].pid = list .dats [i ]-> manager_pid ;
1222
- records [nr ].datname = list .dats [i ]-> name ;
1223
- records [nr ++ ].name = names [1 ];
1224
- if (list .dats [i ]-> nexecs )
1225
+ records [nr ].pid = list .super_pid ;
1226
+ records [nr ].datname = list .super_datname ;
1227
+ records [nr ++ ].name = names [0 ];
1228
+ }
1229
+ for (i = 0 ; i < list .num_db ; i ++ )
1230
+ {
1231
+ if (list .dats [i ]-> manager_pid )
1225
1232
{
1226
- for (j = 0 ; j < list .dats [i ]-> nexecs ; j ++ )
1233
+ records [nr ].pid = list .dats [i ]-> manager_pid ;
1234
+ records [nr ].datname = list .dats [i ]-> name ;
1235
+ records [nr ++ ].name = names [1 ];
1236
+ if (list .dats [i ]-> nexecs )
1227
1237
{
1228
- records [nr ].pid = list .dats [i ]-> execs [j ];
1229
- records [nr ].datname = list .dats [i ]-> name ;
1230
- records [nr ++ ].name = names [2 ];
1238
+ for (j = 0 ; j < list .dats [i ]-> nexecs ; j ++ )
1239
+ {
1240
+ records [nr ].pid = list .dats [i ]-> execs [j ];
1241
+ records [nr ].datname = list .dats [i ]-> name ;
1242
+ records [nr ++ ].name = names [2 ];
1243
+ }
1231
1244
}
1232
- }
1233
- if (list .dats [i ]-> natexecs )
1234
- {
1235
- for (j = 0 ; j < list .dats [i ]-> natexecs ; j ++ )
1245
+ if (list .dats [i ]-> natexecs )
1236
1246
{
1237
- records [nr ].pid = list .dats [i ]-> atexecs [j ];
1238
- records [nr ].datname = list .dats [i ]-> name ;
1239
- records [nr ++ ].name = names [3 ];
1247
+ for (j = 0 ; j < list .dats [i ]-> natexecs ; j ++ )
1248
+ {
1249
+ records [nr ].pid = list .dats [i ]-> atexecs [j ];
1250
+ records [nr ].datname = list .dats [i ]-> name ;
1251
+ records [nr ++ ].name = names [3 ];
1252
+ }
1240
1253
}
1241
1254
}
1255
+ else
1256
+ {
1257
+ records [nr ].pid = 0 ;
1258
+ records [nr ].datname = list .dats [i ]-> name ;
1259
+ records [nr ++ ].name = names [1 ];
1260
+ }
1242
1261
}
1262
+ funcctx -> max_calls = nrecords ;
1263
+ funcctx -> user_fctx = (void * )records ;
1243
1264
}
1244
- for (i = 0 ; i < list .num_db ; i ++ )
1245
- {
1246
- if (list .dats [i ]-> manager_pid == 0 )
1247
- {
1248
- records [nr ].pid = 0 ;
1249
- records [nr ].datname = list .dats [i ]-> name ;
1250
- records [nr ++ ].name = names [1 ];
1251
- }
1252
- }
1253
- funcctx -> max_calls = nrecords ;
1254
- funcctx -> user_fctx = (void * )records ;
1255
1265
MemoryContextSwitchTo (old_ctx );
1256
1266
}
1257
1267
funcctx = SRF_PERCALL_SETUP ();
@@ -1260,6 +1270,8 @@ scheduler_status(PG_FUNCTION_ARGS)
1260
1270
tupdesc = funcctx -> tuple_desc ;
1261
1271
nrecords = funcctx -> max_calls ;
1262
1272
1273
+ if (nrecords == 0 ) SRF_RETURN_DONE (funcctx );
1274
+
1263
1275
records = (scheduler_stat_record_t * )funcctx -> user_fctx ;
1264
1276
if (nr < nrecords )
1265
1277
{
0 commit comments