Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 190a205

Browse files
author
Vladimir Ershov
committed
gde-to portitsia context
1 parent 3d41157 commit 190a205

File tree

2 files changed

+118
-28
lines changed

2 files changed

+118
-28
lines changed

src/pgpro_scheduler.c

Lines changed: 116 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -323,56 +323,111 @@ char *get_scheduler_nodename(MemoryContext mem)
323323

324324
/** END of SOME UTILS **/
325325

326+
const char *check_multimaster_database(void)
327+
{
328+
char_array_t *split_libs, *conns;
329+
const char *libs = NULL;
330+
bool mtm_present = false;
331+
static char buffer[256];
332+
char *dbbeg;
333+
int mtm_id, i, j = 0;
334+
const char *mtm_id_str, *mtm_cstring;
335+
336+
/* at first need to parse shared_preload_libraries */
337+
libs = GetConfigOption("shared_preload_libraries", true, false);
338+
if(!libs) return NULL;
339+
split_libs = _split_string_to_char_array((char *)libs);
340+
if(split_libs->n == 0)
341+
{
342+
destroyCharArray(split_libs);
343+
return NULL;
344+
}
345+
for(i=0; i< split_libs->n; i++)
346+
{
347+
if(strcmp(split_libs->data[i], "multimaster") == 0)
348+
{
349+
mtm_present = true;
350+
break;
351+
}
352+
}
353+
destroyCharArray(split_libs);
354+
if(0 && !mtm_present) return NULL;
355+
356+
/* now check id multimaster.node_id set */
357+
mtm_id_str = GetConfigOption("multimaster.node_id", true, false);
358+
if(!mtm_id_str) return NULL;
359+
mtm_id = atoi(mtm_id_str);
360+
if(mtm_id == 0) return NULL;
361+
elog(LOG, "got mtm_id %d", mtm_id);
362+
363+
/* find proper connection string from mtm_id */
364+
mtm_cstring = GetConfigOption("multimaster.conn_strings", true, false);
365+
if(!mtm_cstring) return NULL;
366+
elog(LOG, "got mtm_connstring");
367+
368+
conns = _split_string_to_char_array((char *)mtm_cstring);
369+
if(conns->n < mtm_id)
370+
{
371+
destroyCharArray(conns);
372+
return NULL;
373+
}
374+
dbbeg = strstr(conns->data[mtm_id-1], "dbname=");
375+
if(dbbeg == NULL)
376+
{
377+
destroyCharArray(conns);
378+
return NULL;
379+
}
380+
elog(LOG, "GOT BEGIN");
326381

382+
memset(buffer, 0, 256);
383+
for(i=7; dbbeg[i] != 0 || i < 249; i++)
384+
{
385+
if(dbbeg[i] != ' ')
386+
{
387+
buffer[j++] = dbbeg[i];
388+
}
389+
else
390+
{
391+
break;
392+
}
393+
}
394+
destroyCharArray(conns);
395+
elog(LOG, "Almost ready %s", buffer);
396+
if(j > 0) return buffer;
397+
return NULL;
398+
}
327399

328-
char_array_t *readBasesToCheck(void)
400+
char_array_t *_split_string_to_char_array(char *str)
329401
{
330-
const char *value;
331-
int value_len = 0;
332-
int nnames = 0;
333-
char_array_t *names;
334-
char_array_t *result;
402+
int str_len, cv_len=0, i;
335403
char *clean_value;
336-
int i;
337-
int cv_len = 0;
338-
StringInfoData sql;
339-
int ret;
404+
char_array_t *names;
340405
int start_pos = 0;
341-
int processed;
342406
char *ptr = NULL;
407+
int nnames = 1;
343408

344-
345-
pgstat_report_activity(STATE_RUNNING, "read configuration");
346-
result = makeCharArray();
347-
348-
value = GetConfigOption("schedule.database", true, false);
349-
if(!value || strlen(value) == 0)
350-
{
351-
return result;
352-
}
353-
value_len = strlen(value);
354-
clean_value = worker_alloc(sizeof(char)*(value_len+1));
355-
nnames = 1;
356-
for(i=0; i < value_len; i++)
409+
str_len = strlen(str);
410+
clean_value = worker_alloc(sizeof(char)*(str_len+1));
411+
for(i=0; i < str_len; i++)
357412
{
358-
if(value[i] != ' ')
413+
if(str[i] != ' ')
359414
{
360-
if(value[i] == ',')
415+
if(str[i] == ',')
361416
{
362417
nnames++;
363418
clean_value[cv_len++] = 0;
364419
}
365420
else
366421
{
367-
clean_value[cv_len++] = value[i];
422+
clean_value[cv_len++] = str[i];
368423
}
369424
}
370425
}
371426
clean_value[cv_len] = 0;
372427
if(cv_len == 0 || nnames == cv_len)
373428
{
374429
pfree(clean_value);
375-
return result;
430+
return NULL;
376431
}
377432
names = makeCharArray();
378433
for(i=0; i < cv_len + 1; i++)
@@ -385,6 +440,39 @@ char_array_t *readBasesToCheck(void)
385440
}
386441
}
387442
pfree(clean_value);
443+
444+
return names;
445+
}
446+
447+
448+
449+
char_array_t *readBasesToCheck(void)
450+
{
451+
const char *value = NULL;
452+
char_array_t *names;
453+
char_array_t *result;
454+
char *clean_value = NULL;
455+
int i;
456+
StringInfoData sql;
457+
int ret;
458+
int processed;
459+
460+
461+
pgstat_report_activity(STATE_RUNNING, "read configuration");
462+
result = makeCharArray();
463+
464+
value = check_multimaster_database();
465+
elog(LOG, "From mm: %s", value);
466+
467+
if(!value)
468+
value = GetConfigOption("schedule.database", true, false);
469+
470+
if(!value || strlen(value) == 0)
471+
{
472+
return result;
473+
}
474+
475+
names = _split_string_to_char_array((char *)value);
388476
if(names->n == 0)
389477
{
390478
destroyCharArray(names);

src/pgpro_scheduler.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,7 @@ bool is_scheduler_enabled(void);
4747
char *set_schema(const char *name, bool get_old);
4848
char *get_scheduler_schema_name(void);
4949
char *get_scheduler_nodename(MemoryContext mem);
50+
char_array_t *_split_string_to_char_array(char *str);
51+
const char *check_multimaster_database(void);
5052

5153
#endif

0 commit comments

Comments
 (0)