Como eu posso adicionar um sinalizador no código fonte do PostgreSQL que funciona tanto no frontend quanto no backend?

0

Estou tentando fazer algumas alterações no código-fonte do postgresql. Eu quero adicionar um sinalizador que funcione no frontend e no backend. Aqui está o que eu fiz até agora.

1- Eu criei meu arquivo de cabeçalho meu.h no qual declarei minha bandeira global da seguinte forma.

extern int CMD_FLAG;
extern void init_vars();// this function to initialize CMD_FLAG

2- Eu incluí o mine.h em pgsql / src / include / c.h, pois ele pode ser visto tanto pelo frontend quanto pelo backend.

3- no pgsql / src / port / exec.c Eu escrevi o corpo da função init_vars () que inicializa o CMD_FLAG da seguinte forma:

int CMD_FLAG;

void init_vars(){
   CMD_FLAG =-1;
}

4- Em pgsql / src / backend / main / main.c, liguei para

init_vars(); 

quando eu compilei o Postgresql, não recebi nenhum erro. No entanto, quando tentei imprimir o valor do sinalizador, ele tinha valores diferentes no backend e fronted.

Por exemplo, quando imprimi na função "HandleSlashCmds", que está no frontend, o valor era 0, enquanto deveria ser -1.

Se eu fizer qualquer alteração no sinalizador no frontend, a alteração será aplicada somente às funções do frontend. Por outro lado, se eu fizer qualquer alteração no sinalizador na parte de trás, a alteração se aplica apenas às funções de back-end.

Acho que, de alguma forma, há duas cópias da bandeira, uma para cada final. Como posso fazer as duas extremidades acessarem o mesmo valor?

    
por Dareen 18.11.2015 / 18:36

1 resposta

0

O frontend e o backend são processos diferentes, comunicando-se através de um protocolo de rede.

O mais parecido com o que você quer é uma variável GUC ("grand unified configuration"). Você pode definir um GUC personalizado no servidor backend com DefineCustomIntVariable e definir o sinalizador GUC_REPORT para que quando ele for alterado por uma instrução SET , etc., o novo valor seja relatado ao cliente usando uma notificação assíncrona no protocolo de fio. O aplicativo cliente pode detectar essa alteração e aplicar a nova configuração.

Da mesma forma, quando a variável é alterada no cliente, ela pode enviar uma consulta SET para atribuir um novo valor ao servidor.

Obviamente, há atrasos impostos por isso, especialmente porque o protocolo permite apenas SET de consultas e respostas de notificação em determinados momentos. Na prática, você verá apenas alterações nas variáveis após as consultas serem concluídas. Então não é a mesma coisa que apenas definir uma variável na memória.

Além disso, um GUC pode ter um valor separado em cada sessão de back-end no PostgreSQL, uma vez que é uma arquitetura de multiprocess shared-nothing-by-default. Portanto, se você deseja definir uma variável em todas as sessões, um GUC não é adequado e você precisa alocar uma variável na memória compartilhada usando sua extensão ... mas, nesse caso, não é possível relatar automaticamente o valor para o cliente.

O que quer que você esteja tentando fazer, eu suspeito strongmente que essa não é a maneira de fazê-lo.

A propósito, você realmente não deveria ter que consertar o PostgreSQL para isso. O _PG_init() de uma extensão pode ser executado no tempo de inicialização do servidor, se estiver listado em shared_preload_libraries . Ele pode alocar segmentos de memória compartilhada, definir GUCs, etc. naquele momento.

Se você realmente precisa garantir que exista uma variável que seja a mesma entre frontend e backend, e se o frontend e o backend forem executados no mesmo host do mesmo usuário, você poderá fazer algo usando mmap'd memória anônima e atomics. Seria difícil fazer isso certo e, no seu nível atual, envolverá um muito estudo.

    
por 19.11.2015 / 06:01

Tags