Skip to content

Commit e69b99d

Browse files
author
Vladimir Ershov
committed
more accurate with namespace
1 parent 54b4b68 commit e69b99d

File tree

3 files changed

+37
-53
lines changed

3 files changed

+37
-53
lines changed

src/pgpro_scheduler.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,18 +178,23 @@ char *get_scheduler_schema_name(void)
178178
{
179179
Oid ns_oid;
180180
Oid ext_oid;
181+
char *name = NULL;
181182

182183
Relation rel;
183184
SysScanDesc scandesc;
184185
HeapTuple tuple;
185186
ScanKeyData entry[1];
186187
LOCKMODE heap_lock = AccessShareLock;
188+
bool use_transaction = false;
187189

190+
if (!IsTransactionState())
191+
{
192+
StartTransactionCommand();
193+
use_transaction = true;
194+
}
188195

189196
if(scheduler_schema_oid == InvalidOid)
190197
{
191-
if (!IsTransactionState())
192-
elog(ERROR, "pgpro_scheduler: cannot get extension scheme (1)");
193198
ext_oid = get_extension_oid("pgpro_scheduler", true);
194199
if(ext_oid == InvalidOid)
195200
elog(ERROR, "pgpro_scheduler: cannot get extension id");
@@ -210,6 +215,7 @@ char *get_scheduler_schema_name(void)
210215
systable_endscan(scandesc);
211216
heap_close(rel, heap_lock);
212217

218+
213219
if(ns_oid == InvalidOid)
214220
elog(ERROR, "pgpro_scheduler: cannot get extension schema oid");
215221

@@ -220,7 +226,10 @@ char *get_scheduler_schema_name(void)
220226
ns_oid = scheduler_schema_oid;
221227
}
222228

223-
return get_namespace_name(ns_oid);
229+
name = get_namespace_name(ns_oid);
230+
if(use_transaction) CommitTransactionCommand();
231+
232+
return name;
224233
}
225234

226235
char *set_schema(const char *name, bool get_old)

src/scheduler_manager.c

Lines changed: 24 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#include "storage/procarray.h"
1212
#include "storage/shm_toc.h"
1313
#include "catalog/pg_type.h"
14+
#include "commands/extension.h"
15+
#include "nodes/makefuncs.h"
1416

1517
#include "pg_config.h"
1618
#include "fmgr.h"
@@ -50,54 +52,22 @@
5052
extern volatile sig_atomic_t got_sighup;
5153
extern volatile sig_atomic_t got_sigterm;
5254
extern Oid scheduler_atjob_id_OID;
55+
extern Oid scheduler_schema_oid;
5356

54-
int checkSchedulerNamespace(void)
57+
bool checkSchedulerExtension(void)
5558
{
56-
const char *sql = "select count(*) from pg_catalog.pg_namespace where nspname = $1";
57-
int count = 0;
58-
const char *schema;
59-
Oid argtypes[1] = { TEXTOID };
60-
Datum values[1];
61-
62-
SetCurrentStatementStartTimestamp();
63-
pgstat_report_activity(STATE_RUNNING, "initialize: check namespace");
64-
65-
schema = GetConfigOption("schedule.schema", false, true);
66-
67-
START_SPI_SNAP();
68-
69-
values[0] = CStringGetTextDatum(schema);
70-
count = select_count_with_args(sql, 1, argtypes, values, NULL);
71-
72-
if(count == -1)
73-
{
74-
STOP_SPI_SNAP();
75-
elog(ERROR, "Scheduler manager: %s: cannot check namespace: sql error",
76-
MyBgworkerEntry->bgw_name);
77-
}
78-
else if(count > 1 || count == 0 )
59+
Oid extoid;
60+
bool use_transaction = false;
61+
if (!IsTransactionState())
7962
{
80-
elog(LOG, "Scheduler manager: %s: cannot check namespace: "
81-
"found %d namespaces", MyBgworkerEntry->bgw_name, count);
82-
}
83-
else if(count == -2)
84-
{
85-
elog(LOG, "Scheduler manager: %s: cannot check namespace: "
86-
"count return null", MyBgworkerEntry->bgw_name);
87-
}
88-
else if(count != 1)
89-
{
90-
STOP_SPI_SNAP();
91-
elog(ERROR, "Scheduler manager: %s: cannot check namespace: "
92-
"unknown error %d", MyBgworkerEntry->bgw_name, count);
93-
}
94-
STOP_SPI_SNAP();
95-
96-
if(count) {
97-
SetConfigOption("search_path", schema, PGC_USERSET, PGC_S_SESSION);
63+
StartTransactionCommand();
64+
use_transaction = true;
9865
}
66+
67+
extoid = get_extension_oid("pgpro_scheduler", true);
68+
if(use_transaction) CommitTransactionCommand();
9969

100-
return count;
70+
return extoid != InvalidOid ? true: false;
10171
}
10272

10373
int get_scheduler_maxworkers(void)
@@ -1822,14 +1792,15 @@ void manager_worker_main(Datum arg)
18221792
elog(LOG, "Started scheduler manager for '%s'", database);
18231793
SetConfigOption("application_name", buffer, PGC_USERSET, PGC_S_SESSION);
18241794

1825-
if(!checkSchedulerNamespace())
1795+
if(!checkSchedulerExtension())
18261796
{
1827-
elog(LOG, "cannot start scheduler for %s - there is no namespace", database);
1797+
elog(LOG, "cannot start scheduler for %s - there is no extention", database);
18281798
changeChildBgwState(shared, SchdManagerQuit);
18291799
dsm_detach(seg);
18301800
delete_worker_mem_ctx(NULL);
18311801
proc_exit(0);
18321802
}
1803+
set_schema(NULL, false);
18331804
SetCurrentStatementStartTimestamp();
18341805
pgstat_report_activity(STATE_RUNNING, "initialize.");
18351806

@@ -1841,8 +1812,9 @@ void manager_worker_main(Datum arg)
18411812
ctx = initialize_scheduler_manager_context(longTerm, database, seg);
18421813

18431814
START_SPI_SNAP();
1844-
reloid = RangeVarGetRelid(makeRangeVarFromNameList(
1845-
stringToQualifiedNameList("schedule.at_jobs_submitted")), NoLock, true);
1815+
reloid = RangeVarGetRelid(
1816+
makeRangeVar(get_scheduler_schema_name(), "at_jobs_submitted", -1)
1817+
, NoLock, true);
18461818
STOP_SPI_SNAP();
18471819
if(reloid == InvalidOid)
18481820
{
@@ -1854,7 +1826,6 @@ void manager_worker_main(Datum arg)
18541826
start_at_workers(ctx, shared);
18551827
clean_at_table(ctx);
18561828
set_slots_stat_report(ctx);
1857-
/* SetConfigOption("enable_seqscan", "off", PGC_USERSET, PGC_S_SESSION); */
18581829

18591830
while(!got_sigterm)
18601831
{
@@ -1867,9 +1838,13 @@ void manager_worker_main(Datum arg)
18671838
if(got_sighup)
18681839
{
18691840
got_sighup = false;
1841+
/* make read extension schema again */
1842+
scheduler_schema_oid = InvalidOid;
1843+
set_schema(NULL, false);
1844+
18701845
ProcessConfigFile(PGC_SIGHUP);
18711846
reload_db_role_config(database);
1872-
refresh_scheduler_manager_context(ctx); /* TODO */
1847+
refresh_scheduler_manager_context(ctx);
18731848
set_slots_stat_report(ctx);
18741849
}
18751850
if(!got_sigterm)

src/scheduler_manager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ typedef struct {
8484
dsm_segment *seg;
8585
} scheduler_manager_ctx_t;
8686

87-
int checkSchedulerNamespace(void);
87+
bool checkSchedulerExtension(void);
8888
extern PGDLLEXPORT void manager_worker_main(Datum arg);
8989
int get_scheduler_maxworkers(void);
9090
int get_scheduler_at_max_workers(void);

0 commit comments

Comments
 (0)