xHarbour Linux, corrupção Indices CDX

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

dopi
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 23 Out 2004 12:29
Localização: Tatuí - SP
Contato:

xHarbour Linux, corrupção Indices CDX

Mensagem por dopi »

Olá Pessoal,

A alguns meses migramos nossos programas CLIPPER para xHarbour Linux, e estamos usando acesso ao Servidor por SSH... Realmente é "outro mundo" o desempenho do xHarbour no Linux... No entanto, em clientes "maiores" e com maior movimentação de dados, estamos enfrentando problemas de corrupção de índices... Em alguns casos é necessário re-criar os indices 3 vezes ao dia !!

Os problemas são em relação a confiabilidade do índice... ou seja, o programa não é abortado, ou retorna algum erro... Mas os índices ficam "erroneos" ou inoperantes, não encontrando registros que sabidamente estão presentes na base de dados... Após uma re-indexação, tudo volta ao normal... pelo menos a re-indexação é extremamente rápida no xHarour Linux... mas é desgastante "parar" toda a empresa para uma re-indexação

Varri a NET a procura de dicas sobre possíveis problemas e soluções com o RDD CDX no Linux e encontrei algumas dicas que já apliquei sem sucesso... Gostaria ajuda da comunidade xHabrour para a busca da solução desse problema...

Minha rotina de inicialização do RDD está assim:

Código: Selecionar todos

REQUEST DBFCDX                      // Causes DBFNTX RDD to be linked in
rddSetDefault( "DBFCDX" )           // Set up DBFNTX as default driver
 
#ifdef __XHARBOUR__
   if CP
      REQUEST HB_CODEPAGE_PLMAZ        // Ajustando a tela
      REQUEST HB_CODEPAGE_HR437
      hb_settermcp("HR437","PLMAZ",.t.)
   endif

   set(_SET_EOL,chr(13)+chr(10))    // Ajustando o fim de Linha para DOS/WIN

   request hb_lang_pt               // Ajustando para Portugues
   set(_SET_LANGUAGE,'PT')

//   SET DBFLOCKSCHEME TO 1           // Mantem compatibilidade de Travamento com CLIPPER 5.2
#else
   FreeTSlice(20)                   // Apenas CLIPPER. Evita consumo excessivo de CPU
#endif

#IFDEF __PLATFORM__Linux
   set(_SET_FILECASE,"LOWER")       // Cria arquivos sempre em Minusculas
   set(_SET_DIRCASE,"LOWER")
   set(_SET_TRIMFILENAME,.t.)       // Remove espacos em Branco do Nome de Arq.
   
   set(_SET_DIRSEPARATOR,"/")       // Inverte a Barra de diretorios

 //umask(2)                         // Grava sempre arquivos como -rw-rw-r--
   umask(6)                         // Grava sempre arquivos como -rw-rw----
#ENDIF

set exclusive (EXCL)
- Já experimentei remover SET DBFLOCKSCHEME TO 1 (pois agora não tenho mais nenhum caso de uso conjunto xHarbour e Clipper)

- Na chamada do programa, estou definindo as váriaveis TMP e TMPDIR, para evitar os erro: (hb_cdxSortWritePage: Can't create temporary file.)

Código: Selecionar todos

#!/bin/bash

export TMPDIR=/tmp/
export TMP=/tmp/

cd /opt/djsystem
./djsystem $1 $2 $3 
Duvidas:

- As funções abaixo afetam a indexação de arquivos ? (seriam a causa do problema ?)
REQUEST HB_CODEPAGE_PLMAZ // Ajustando a tela
REQUEST HB_CODEPAGE_HR437
hb_settermcp("HR437","PLMAZ",.t.)

- O Unlock vem antes ou depois de dbcommit() ? Estou usando:
dbcommit()
unlock


- É necessário REQUEST DBFFPT ? Atualmente não estou usando... porém meus arquivos DBF/FPT estão sendo encontrados / abertos sem problemas

- Li em alguns tópicos que as funções: set(_SET_FILECASE,"LOWER") e set(_SET_DIRCASE,"LOWER") poderiam causar problemas na criação de índices CDX... Isso é verdade ?

- Como usamos SSH, programamos o Servidor SSH para "matar" as seções que foram derrubadas (Cliente SSH (Putty) encerrado) para evitar que o programa continue rodando no servidor... Isso é feito ajustando o /etc/ssh/sshd_config com:
ClientAliveInterval 15
ClientAliveCountMax 2

O que ocorre com os programas que são "mortos" dessa maneira ? O binário gerado no xHarbour ao receber um KILL, encerra corretamente ? Ou seja, todos os arquivos são fechados e "commitados" na base dados antes do programa finalizar ?


- Estava usando a versão do xHarbour do CVS, e voltei para a versão estável 0.99.60... Notei que houve várias mudanças nos fontes da DBFCDX na versão do CVS... E usando a versão do CVS nosso problema era MAIS GRAVE... em alguns momentos, TODO o arquivo era misteriosamente TRAVADO... e nenhum terminal conseguia incluir / alterar nenhum registro... E isso acontecia com uma frequencia de até 8 vezes ao dia !!!
Alguem teve problemas semelhantes com a versão do CVS ?


Obrigado pela ajuda de todos...
[]s Daniel

Conheça o projeto Automação Comercial Brasil
http://acbr.sourceforge.net/
Luiz
Usuário Nível 2
Usuário Nível 2
Mensagens: 61
Registrado em: 05 Set 2006 07:30
Localização: Vila Velha - ES

Mensagem por Luiz »

Olá, não tenho muito conhecimento sobre linux, mas já passei por muito problema de corrupção e posso tentar ajudar.

Como seu caso, ja enfrentei uma apoca em que ocorriam varios corruptions durante o dia, mas eles pararam depois que eu adicionei commit em todas as operações que envolviam qualquer tipo de alteração dos arquivos.

Tambem de uma revisada nos indices.

[]s
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

Mensagem por Daniel »

eu também tive este erros com cdx passei a usar uso ntx os erro sumirão, de uma olhada nos códigos se vi não esta criando os index mais de um lugar ou esquecendo de abril alguns index
Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Re: xHarbour Linux, corrupção Indices CDX

Mensagem por Stanis Luksys »

dopi escreveu: - As funções abaixo afetam a indexação de arquivos ? (seriam a causa do problema ?)

REQUEST HB_CODEPAGE_PLMAZ // Ajustando a tela
REQUEST HB_CODEPAGE_HR437
hb_settermcp("HR437","PLMAZ",.t.)
Realmente não, apenas 'ajusta' a tela, como bem está comentado.
dopi escreveu: - O Unlock vem antes ou depois de dbcommit() ? Estou usando:
dbcommit()
unlock
Está certo assim, vem depois.

dopi escreveu: - É necessário REQUEST DBFFPT ? Atualmente não estou usando... porém meus arquivos DBF/FPT estão sendo encontrados / abertos sem problemas.
Teoricamente seria necessário, mas se no seu caso os arquivos já estão sendo abertos corretamente, não deve ter ligação com a corrupção dos índices.
dopi escreveu: - Li em alguns tópicos que as funções: set(_SET_FILECASE,"LOWER") e set(_SET_DIRCASE,"LOWER") poderiam causar problemas na criação de índices CDX... Isso é verdade ?
Isso não posso afirmar com certeza, mas é provável que sim, pois talvez as funções acima não estejam fazendo o tratamento ideal do nome das TAGs dentro de cada índice, e sim apenas do arquivo CDX em sí. Neste caso o ideal seria avaliar a possibilidade de alterar em todas as rotinas de criação de índice o nome das TAGs para minúsculas, ou para maiúsculas, desde que quando requisitadas sigam o mesmo padrão.
dopi escreveu: O que ocorre com os programas que são "mortos" dessa maneira ? O binário gerado no xHarbour ao receber um KILL, encerra corretamente ? Ou seja, todos os arquivos são fechados e "commitados" na base dados antes do programa finalizar ?
Hehe, muito provavelmente não, os arquivos não são commitados visto que desta maneira você não fecha o aplicativo, e sim, como o próprio nome diz, mata. Como se fosse um finalizar processo no Windows. Operações pendentes são perdidas.



Eu também estou usando CDX no Linux, embora apenas em fase de testes. Não tenho nenhum programa rodando em larga escala como no seu caso. Não estou usando nenhuma destas funções e sets que você mencionou, e por enquanto tudo rodando normal... Para avaliar definitivamente mesmo só com uma base grande de dados.


Bom, boa sorte aí.

Se achar solução posta aqui para nos precavermos de passar pelo mesmo problema.

Valeu!
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
dopi
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 23 Out 2004 12:29
Localização: Tatuí - SP
Contato:

Mensagem por dopi »

Olá Pessoal,

Muito obrigado pelas respostas... Essas informações estão sendo de grande ajuda...

@Luiz
Meu sistema era em CLIPPER e já roda a algum tempo, sem problemas de corrupção (a não ser as causadas por panes nos terminais)... Todas as rotinas de gravação são procedidas por uma chamada a função DESTRAVA() que executa
dbcommit()
unlock


@Daniel
Pensei em realmente usar outro RDD... Mas o CDX tem tantas vantagens sobre o NTX... Além do mais, acho que o problema é realmente alguma "peculiaridade" no meu programa... Pois muita gente usa o CDX e não tem problemas...

@Stanis
Providenciei as seguintes modificações:
- Todas as TAGS em minusculas
- Na rotina de DESTRAVA()
dbcommit()
unlock
skip 0

- Adicionei REQUEST DBFFPT

Mas acredito que o problema seja realmente as seções "mortas" pelo servidor SSH... Imaginei que o xHabrour Linux fechasse todos os arquivos abertos quando recebesse um sinal KILL, mas parece que não...

Estou estudando alguma maneira de forçar a execução de uma Procedure de finalização quando um sinal KILL for recebido... Recebi a dica de "Exit Procedure" mas pelos meus testes o Programa não executa ela ao receber um KILL...
[]s Daniel

Conheça o projeto Automação Comercial Brasil
http://acbr.sourceforge.net/
dopi
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 23 Out 2004 12:29
Localização: Tatuí - SP
Contato:

Mensagem por dopi »

Olá Pessoal,

Recebi a dica abaixo de Marco Bernardi na lista news.xharbour.org

Ele cria duas novas funções para o xHarbour LINUX,

HB_LASTSIGNAL() -> Retorna o numero do ultimo sinal recebido... Para ver o significado de cada sinal, veja esse link

HB_SETSIGNALS() -> Modifica o fluxo de execução da VM do xHarbour para executar a sua EXIT PROCEDURE quando algum dos sinais SIGTERM, SIGHUP, SIGQUIT, SIGINT for recebido... (Insira uma chama a essa função no inicio do seu MAIN() )

Código: Selecionar todos

#pragma begindump
#include "hbvm.h"
#include <signal.h>

static int iQuitRequested = 0;
static int iLastSignal = 0;

static void sig_handler( int iSigNo )
{
   iLastSignal = iSigNo;
   hb_vmRequestQuit();
   return;
}

HB_FUNC( HB_LASTSIGNAL )
{
   hb_retni( iLastSignal );
}

HB_FUNC( HB_SETSIGNALS )
{
   struct sigaction act;
   int iSignals[] = { SIGTERM, SIGHUP, SIGQUIT, SIGINT, 0 }, i;

   /* Ignore SIGPIPEs so they don't kill us. */
   signal(SIGPIPE, SIG_IGN);

   for( i = 0; iSignals[i]; ++i )
   {
      sigaction( iSignals[i], 0, &act );
      act.sa_handler = sig_handler;
      act.sa_flags = SA_RESTART;
      sigaction( iSignals[i], &act, 0);
   }
}
#pragma enddump
Exemplo de EXIT PROCEDURE

Código: Selecionar todos

exit proc exit_myprg()
local nSig := HB_LASTSIGNAL(),obj

? 'EXITING, Sinal=',nSig
?
close all

if nSig # 0
   obj:=getactive()
   if obj#NIL
      obj:undo()
   endif

   ? 'KILL'
   ?

// here I put other tasks useful only for my program... like free user session etc... also depending from the signal no.
endif

? 'FIM'
?

return
Nos meus testes, a EXIT PROCEDURE foi executada com sucesso nas seguintes operações...

- kill "PID" (PID -> processo do programa)
- Fechando a janela do Putty
- Encerrando o Putty com CTRL-ALT-DEL
- Resetando o terminal. Nesse caso é necessário que o Servidor SSH esteja configurado para derrubar as seções SSH que não estejam respondendo... Veja: ClientAliveInterval 15 e ClientAliveCountMax 2 no Inicio desse Tópico

Executando kill -9 "PID" obviamente a EXIT PROCEDURE não é executada ;)
[]s Daniel

Conheça o projeto Automação Comercial Brasil
http://acbr.sourceforge.net/
Responder