Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Erro ao acessar o Badger no inicio da segunda etapa do transform #253

Closed
silvioes opened this issue Oct 28, 2024 · 22 comments · Fixed by #256
Closed

Erro ao acessar o Badger no inicio da segunda etapa do transform #253

silvioes opened this issue Oct 28, 2024 · 22 comments · Fixed by #256
Labels
bug Something isn't working

Comments

@silvioes
Copy link

Estou com o seguinte erro durante o transform :

docker compose run --rm minha-receita transform -d /mnt/data // ou com /mnt/data/sample o erro persistia

Error: could not create badger storage: error creating badger key-value object: Cannot acquire directory lock on "/tmp/minha-receita-badger--202410280015481995141590".  Another process is using this Badger database. error: resource temporarily unavailable
Usage:
  minha-receita transform [flags]

Flags:
  [...]

could not create badger storage: error test creating badger key-value object: Cannot acquire directory lock on "/tmp/minha-receita-badger--202410280015481995141590".  Another process is using this Badger database. error: resource temporarily unavailable

Depois de 2 dias pesquisando e entendendo um pouco melhor de como o transform funciona mesmo sabendo quase nada de GO identifiquei que o erro acontecia ao iniciar a etapa 2 conforme descrito no arquivo CONTRIBUTING.

Pelo que identifiquei quando o StepTwo ao tentar abrir a conexão com o badger ele não consegue pois o StepOne não fecha a conexão ao finalizar.

db, err := badger.Open(opt.WithLogger(&badgerLogger{}))

Então fechando a conexão ao final do StepOne (apenas copiando o comportamento do StepTwo) eu consegui rodar com os arquivos de sample sem o erro acontecer novamente e olhando o banco a única coisa que percebi de estranho foi que em todos o campo de "qsa" estava vazio, mas acredito que isso possa ser uma questão do arquivo de sample, acabei de colocar pra executar com os arquivos reais e assim que terminar também trago um feedback se necessário. Também queria saber qual o comportamento esperado do StepOne pra ele não fechar a conexão anteriormente e se eu ter adicionado esse comportamento pode ter algum impacto nos dados transformados.

func runStepOne(dir string, l lookups, isolated bool) (string, error) {
	
	tmp, err := os.MkdirTemp("", fmt.Sprintf("%s-%s", badgerFilePrefix, time.Now().Format("20060102150405")))
	
	if err != nil {
		return "", fmt.Errorf("error creating temporary key-value storage: %w", err)
	}
	
	kv, err := newBadgerStorage(tmp)
	
	if err != nil {
		return "", fmt.Errorf("could not create badger storage: %w", err)
	}
	
	if err := kv.load(dir, &l); err != nil {
		return "", fmt.Errorf("error loading data to badger: %w", err)
	}
	
	if isolated {
		fmt.Println(kv.path)
	}
	
	if !isolated {
		defer kv.close()
	}
	
	return kv.path, nil
}

Dados da máquina:
VM com ubuntu-server 24.04
Ram 16gb
Armazenamento 250gb
Executei o projeto apenas usando Docker, mas também tinha testado usando GO 1.23 antes de testar a questão de fechar a conexão mas tive o mesmo erro e voltei a usar o Docker.

@silvioes silvioes changed the title Erro ao acessar o Badger no iniciao da segunda etapa do transform Erro ao acessar o Badger no inicio da segunda etapa do transform Oct 28, 2024
@silvioes
Copy link
Author

Finalizou durante a madrugada sem erros.

Aparentemente está faltando apenas as informações do quadro societário, porte, razão social, capital social, natureza jurídica e alguns nem nome fantasia trás, exatamente como estava com os dados de sample.

Exemples:
02007384000108 (sem nome fantasia também)
01496787000197 (sem nome fantasia também)
85014793000150 (sem nome fantasia também)
19694672000172
23274194001514
05253499000162
29178132000190
00718528005593

Como inicialmente não são dados que eu preciso vou seguir com esse banco por hora, mas gostaria de uma ajuda para identificar o pq desses dados não terem sido preenchidos.

Também precisei criar o index pra procurar por id na tabela cnpj, não sei se é um comportamento esperado ele não criar esse index por padrão já que sem ele cada select era uns 13 minutos.

@cuducos
Copy link
Owner

cuducos commented Oct 28, 2024

Obrigada por reportar. Realmente parece quebrada, vou investigar.

Apenas algumas dicas:

Como inicialmente não são dados que eu preciso vou seguir com esse banco por hora

Você pode baixar o repositório um commit anterior e não terá essa função que está dando problema 2ae1f78

Também precisei criar o index pra procurar por id na tabela cnpj

Não precisa. Provavelmente teu processo teve outro erro, pois os índices são criados automaticamente.

Aparentemente está faltando apenas as informações do quadro societário, porte, razão social, capital social, natureza jurídica e alguns nem nome fantasia trás, exatamente como estava com os dados de sample.

Provavelmente você causou esse erro localmente assim:

Então fechando a conexão ao final do StepOne (apenas copiando o comportamento do StepTwo)

Digo isso pois o fim do segundo passo exclui os dados do Badger no kv.close() que você mencionou: )

@cuducos
Copy link
Owner

cuducos commented Oct 28, 2024

Você tem como testar com a branch do #256 para ver se resolve?

@silvioes
Copy link
Author

Tentei aqui mas ao buildar com Docker Compose tive esse erro:

 => ERROR [minha-receita build 7/7] RUN go build -o /usr/bin/minha-receita                                                                                           86.6s
------
 > [minha-receita build 7/7] RUN go build -o /usr/bin/minha-receita:
85.79 # github.com/cuducos/minha-receita/transform
85.79 transform/transform.go:103:47: cannot use kv (variable of type *badgerStorage) as kvStorage value in argument to createJSONRecordsTask: *badgerStorage does not implement kvStorage (wrong type for method close)
85.79           have close(bool) error
85.79           want close() error
------
failed to solve: process "/bin/sh -c go build -o /usr/bin/minha-receita" did not complete successfully: exit code: 1

@cuducos
Copy link
Owner

cuducos commented Oct 28, 2024

Opa, falha minha. Esqueci de comitar e subir uma parte 🤦 Feito agora.

@silvioes
Copy link
Author

Rodei com o sample e não tive nenhum erro, mas os dados que mencionei anteriormente seguem vazios.

{
    "uf": "SP",
    "cep": "19064772",
    "qsa": [],
    "cnpj": "42916560000130",
    "pais": null,
    "email": "",
    "porte": null,
    "bairro": "JARDIM NOVO PRUDENTINO",
    "numero": "855",
    "ddd_fax": "",
    "municipio": "PRESIDENTE PRUDENTE",
    "logradouro": "KENITI FUKUHARA",
    "cnae_fiscal": 5620104,
    "codigo_pais": null,
    "complemento": "",
    "codigo_porte": null,
    "razao_social": "",
    "nome_fantasia": "",
    "capital_social": null,
    "ddd_telefone_1": "1897938490",
    "ddd_telefone_2": "",
    "opcao_pelo_mei": null,
    "descricao_porte": "",
    "codigo_municipio": 6929,
    "cnaes_secundarios": [
        {
            "codigo": 0,
            "descricao": ""
        }
    ],
    "natureza_juridica": null,
    "situacao_especial": "",
    "opcao_pelo_simples": null,
    "situacao_cadastral": 2,
    "data_opcao_pelo_mei": null,
    "data_exclusao_do_mei": null,
    "cnae_fiscal_descricao": "Fornecimento de alimentos preparados preponderantemente para consumo domiciliar",
    "codigo_municipio_ibge": 3541406,
    "data_inicio_atividade": "2021-07-29",
    "data_situacao_especial": null,
    "data_opcao_pelo_simples": null,
    "data_situacao_cadastral": "2021-07-29",
    "nome_cidade_no_exterior": "",
    "codigo_natureza_juridica": null,
    "data_exclusao_do_simples": null,
    "motivo_situacao_cadastral": 0,
    "ente_federativo_responsavel": "",
    "identificador_matriz_filial": 1,
    "qualificacao_do_responsavel": null,
    "descricao_situacao_cadastral": "ATIVA",
    "descricao_tipo_de_logradouro": "AVENIDA",
    "descricao_motivo_situacao_cadastral": "SEM MOTIVO",
    "descricao_identificador_matriz_filial": "MATRIZ"
}

@cuducos
Copy link
Owner

cuducos commented Oct 28, 2024

Isso pode ser efeito do sample (que pega as primeiras x linahs de cada arquivo, sem garantia de que vá ter algo relevante para os estabelecimentos). Você pode:

  • deixar rodando com o banco de dados completo
  • ou manualmente verificar se tem alguma dado do CNPJ 42.916.560/0001-30 na tua amostra

@silvioes
Copy link
Author

Entendi, vou refazer o download aqui pra garantir e rodar o transform com o banco completo.

Assim que finalizar eu atualizo o status aqui, mas já te agradeço pelo projeto e sua disposição para nos ajudar.

@silvioes
Copy link
Author

Bom dia, finalizou ontem por volta de 19h mas só parei pra ver agora.

Finalizou sem erro mas os dados que mencionei interiormente seguem vazios e a tabela ficou com 102gb, única coisa que notei é que os logs da função saveUpdatedAt não aparecem no terminal quando roda pra gerar o banco completo e a tabela meta fica vazia, apenas quando rodo com as amostras tenho o log Saving the updated at date to the database… e algum retorno no /updated.

Confirmei que a tabela de cnpj ficou com as 62.983.669 linhas e apenas esse índice foi criado:
CREATE UNIQUE INDEX cnpj_pkey ON public.cnpj USING btree (tmp_pk)

O que eu to criando é esse, pq sem esse ele não retorna nenhuma query ou requisição em menos de 10 minutos:
CREATE INDEX cnpj_id_idx ON public.cnpj (id);

func saveUpdatedAt(db database, dir string) error {
	log.Output(1, "Saving the updated at date to the database…")
	p := filepath.Join(dir, download.FederalRevenueUpdatedAt)
	v, err := os.ReadFile(p)
	if err != nil {
		return fmt.Errorf("error reading %s: %w", p, err)

	}
	return db.MetaSave("updated-at", string(v))
}

Amostras:

docker compose run --rm minha-receita transform -d /mnt/data/sample -c --no-privacy
2024/10/28 13:46:26 Dropping table public.cnpj…
2024/10/28 13:46:32 Creating table public.cnpj…
2024/10/28 13:46:32 Loading Simples files…
2024/10/28 13:46:32 Loading Socios files…
2024/10/28 13:46:32 Loading Empresas files…
Processing base CNPJ, partners and taxes 100% |█████████████████████████████████████████████████████████████████████████████████████████████████████████| (210000/210000, 23411 it/s)
2024/10/28 13:46:41 Loading Estabelecimentos files…
Creating the JSON data for each CNPJ 100% |█████████████████████████████████████████████████████████████████████████████████████████████████████████████| (100000/100000, 12572 it/s)
2024/10/28 13:46:51 Saving the updated at date to the database…

Banco completo:

docker compose run --rm minha-receita transform -d /mnt/data -c --no-privacy
2024/10/28 14:47:04 Dropping table public.cnpj…
2024/10/28 14:47:04 Creating table public.cnpj…
2024/10/28 14:47:04 Loading Simples files…
2024/10/28 14:47:04 Loading Empresas files…
2024/10/28 14:47:04 Loading Socios files…
Processing base CNPJ, partners and taxes 100% |█████████████████████████████████████████████████████████████████████████████████████████████| (125539251/125539251, 17528 it/s)
2024/10/28 16:47:15 Loading Estabelecimentos files…
Creating the JSON data for each CNPJ 100% |████████████████████████████████████████████████████████████████████████████████████████████████████| (62983669/62983669, 11773 it/s)

client_loop: send disconnect: Broken pipe

Então se a saveUpdatedAt não ta rodando imagino que possa ser algum erro na etapa 2 que não é capturado. Não acredito que seja algum erro no download pq já fiz o download dos arquivos umas 5x sempre rodando o check e o download com a flag -x depois, já até apaguei a pasta de data e recriei pra rodar o download de novo.

@cuducos
Copy link
Owner

cuducos commented Oct 29, 2024

Duas coisas:

  1. O processo não terminou com sucesso, terminou com erro; client_loop: send disconnect: Broken pipe diz que teve algo na conexão com o Postgres — você vai ter que descobrir o que aconteceu para causar isso
  2. Você pode mandar o resultado de ls -laGh do diretório de dados?

@silvioes
Copy link
Author

1:
Estou rodando o projeto em um servidor remoto que me conecto por ssh de um windows com wsl, o erro client_loop: send disconnect: Broken pipe é referente a queda da conexão ssh por inatividade com o host depois de finalizar o processo

19h quando sai do pc ele estava assim:

docker compose run --rm minha-receita transform -d /mnt/data -c --no-privacy
2024/10/28 14:47:04 Dropping table public.cnpj…
2024/10/28 14:47:04 Creating table public.cnpj…
2024/10/28 14:47:04 Loading Simples files…
2024/10/28 14:47:04 Loading Empresas files…
2024/10/28 14:47:04 Loading Socios files…
Processing base CNPJ, partners and taxes 100% |█████████████████████████████████████████████████████████████████████████████████████████████| (125539251/125539251, 17528 it/s)
2024/10/28 16:47:15 Loading Estabelecimentos files…
Creating the JSON data for each CNPJ 100% |████████████████████████████████████████████████████████████████████████████████████████████████████| (62983669/62983669, 11773 it/s)

Depois de ter terminar o Creating the JSON data for each CNPJ ele quebrou a linha e ficou só com a linha vazia por mais ou menos 1h até eu sair e deixar ele finalizar, mas deixei um vídeo no youtube de 24h rodando pra minha máquina não hibernar durante o processo.

2:

ls -laGh

total 6.2G
drwxrwxr-x  4 administrator 4.0K Oct 27 23:02 .
drwxrwxr-x 17 administrator 4.0K Oct 27 22:23 ..
-rw-r--r--  1 root           22K Oct 28 14:16 Cnaes.zip
-rw-r--r--  1 root          360M Oct 28 14:16 Empresas0.zip
-rw-r--r--  1 root           75M Oct 28 14:18 Empresas1.zip
-rw-r--r--  1 root           76M Oct 28 14:15 Empresas2.zip
-rw-r--r--  1 root           82M Oct 28 14:21 Empresas3.zip
-rw-r--r--  1 root           87M Oct 28 14:27 Empresas4.zip
-rw-r--r--  1 root           94M Oct 28 14:27 Empresas5.zip
-rw-r--r--  1 root           91M Oct 28 14:29 Empresas6.zip
-rw-r--r--  1 root           95M Oct 28 14:30 Empresas7.zip
-rw-r--r--  1 root           95M Oct 28 14:28 Empresas8.zip
-rw-r--r--  1 root           91M Oct 28 14:29 Empresas9.zip
-rw-r--r--  1 root          1.4G Oct 28 14:32 Estabelecimentos0.zip
-rw-r--r--  1 root          324M Oct 28 14:42 Estabelecimentos1.zip
-rw-r--r--  1 root          321M Oct 28 14:42 Estabelecimentos2.zip
-rw-r--r--  1 root          322M Oct 28 14:42 Estabelecimentos3.zip
-rw-r--r--  1 root          348M Oct 28 14:42 Estabelecimentos4.zip
-rw-r--r--  1 root          326M Oct 28 14:42 Estabelecimentos5.zip
-rw-r--r--  1 root          322M Oct 28 14:42 Estabelecimentos6.zip
-rw-r--r--  1 root          322M Oct 28 14:42 Estabelecimentos7.zip
-rw-r--r--  1 root          346M Oct 28 14:29 Estabelecimentos8.zip
-rw-r--r--  1 root          328M Oct 28 14:29 Estabelecimentos9.zip
-rw-rw-r--  1 administrator    0 Oct 27 22:22 .gitkeep
-rw-r--r--  1 root          1.2K Oct 28 14:18 Motivos.zip
-rw-r--r--  1 root           43K Oct 28 14:20 Municipios.zip
-rw-r--r--  1 root          1.5K Oct 28 14:17 Naturezas.zip
-rw-r--r--  1 root          2.7K Oct 28 14:19 Paises.zip
drwx------ 19           999 4.0K Oct 28 09:26 postgres
-rw-r--r--  1 root           980 Oct 28 14:20 Qualificacoes.zip
drwxr-xr-x  2 root          4.0K Oct 27 23:02 sample
-rw-r--r--  1 root          228M Oct 28 14:42 Simples.zip
-rw-r--r--  1 root          155M Oct 28 14:42 Socios0.zip
-rw-r--r--  1 root           48M Oct 28 14:41 Socios1.zip
-rw-r--r--  1 root           47M Oct 28 14:41 Socios2.zip
-rw-r--r--  1 root           47M Oct 28 14:41 Socios3.zip
-rw-r--r--  1 root           47M Oct 28 14:41 Socios4.zip
-rw-r--r--  1 root           47M Oct 28 14:41 Socios5.zip
-rw-r--r--  1 root           48M Oct 28 14:42 Socios6.zip
-rw-r--r--  1 root           47M Oct 28 14:42 Socios7.zip
-rw-r--r--  1 root           47M Oct 28 14:42 Socios8.zip
-rw-r--r--  1 root           47M Oct 28 14:42 Socios9.zip
-rw-r--r--  1 root          426K Oct 28 14:14 TABMUN.CSV
-rw-r--r--  1 root            10 Oct 28 14:42 updated_at.txt

@cuducos
Copy link
Owner

cuducos commented Oct 29, 2024

referente a queda da conexão ssh por inatividade com o host depois de finalizar o processo

É referente à queda de conexão, mas não é “depois de finalizar o processo”, é antes — dado que faltam saídas no log/terminal como essa, por exemplo.

ls -laGh

Vejo algumas diferenças mínimas nos tamanhos dos arquivos — de qual mês/ano são? O comando check diz estar tudo certo?

@silvioes
Copy link
Author

silvioes commented Oct 29, 2024

Acabei de configurar meu ssh pra nunca desconectar por inatividade, vou usar dessa forma para o próximo teste.

updated_at.txt:

cat data/updated_at.txt
2024-10-12

Comando check:

administrator@receita:~/minha-receita$ docker compose run --rm minha-receita check -d /mnt/data
2024/10/29 13:09:01 Checking 37 files…
administrator@receita:~/minha-receita$

Edit: Sempre baixo direto do servidor oficial, se quiser posso testar também especificando o mirror.

@cuducos
Copy link
Owner

cuducos commented Oct 29, 2024

De fato (ainda) tem um bug. Consegui reproduzir aqui. Vou trabalhar nisso… te aviso aqui quando tiver novidade.

Monitorando o diretório do Badger, ele vai ganhando tamanho:

$ du -hd1 /var/folders/zb/0n9ntv254vq9zfhsvyq2g7680000gn/T/minha-receita-badger--20241029132503830925799
803M	/var/folders/zb/0n9ntv254vq9zfhsvyq2g7680000gn/T/minha-receita-badger--20241029132503830925799

Assim que passa do passo um para o dois, o tamanho é quase zerado:

$ du -hd1 /var/folders/zb/0n9ntv254vq9zfhsvyq2g7680000gn/T/minha-receita-badger--20241029132503830925799
 12K	/var/folders/zb/0n9ntv254vq9zfhsvyq2g7680000gn/T/minha-receita-badger--20241029132503830925799

Tentei comitar manualmente as escritas, mas não mudou nada. Então ainda não sei o que é…

@cuducos
Copy link
Owner

cuducos commented Oct 29, 2024

Acabei de refatorar uma parte e aqui funcionou com QSA e os outros dados. Podes testar mais uma vez para ver se aei vai também? Só confira se estais com o commit mais recente da branch do PR: 6628490

@iagoleao

This comment was marked as off-topic.

@cuducos

This comment was marked as off-topic.

@silvioes
Copy link
Author

silvioes commented Nov 1, 2024

Update

Ainda não tinha conseguido testar com esse novo commit e acabei colocando a transformação de dados pra rodar só agora pq pra fazer o teste limpo eu limpei a pasta de data pra fazer um novo download e passei a ter esse erro toda vez que tentava:

docker compose run --rm minha-receita download -d /mnt/data/

2024/11/01 11:51:51 Downloading file(s) from the National Treasure…
2024/11/01 11:51:52 Downloading files from the Federal Revenue…
Error: error gathering resources for download: error getting urls: could not read https://dadosabertos.rfb.gov.br/CNPJ/dados_abertos_cnpj response body: error getting https://dadosabertos.rfb.gov.br/CNPJ/dados_abertos_cnpj: https://dadosabertos.rfb.gov.br/CNPJ/dados_abertos_cnpj responded with 404 Not Found
Usage:
  minha-receita download [flags]

Flags:
  -c, --chunk-size int     max length of the bytes range for each HTTP request (default 1048576)
  -d, --directory string   directory of the downloaded files (default "data")
  -h, --help               help for download
  -m, --mirror string      download from the mirror, not from the original source (YYYY-MM-DD)
  -p, --parallel int       maximum parallel downloads (default 16)
  -e, --restart            restart all downloads from the beginning
  -r, --retries uint       maximum retries per download (default 32)
  -x, --skip               skip the download of existing files
  -t, --timeout string     timeout for each download (default "3m0s")

error gathering resources for download: error getting urls: could not read https://dadosabertos.rfb.gov.br/CNPJ/dados_abertos_cnpj response body: error getting https://dadosabertos.rfb.gov.br/CNPJ/dados_abertos_cnpj: https://dadosabertos.rfb.gov.br/CNPJ/dados_abertos_cnpj responded with 404 Not Found

Aparentemente o site da receita só está em manutenção faz 3 dias mesmo mas fiquei esperando com esperança que ia voltar, tentando baixar pelo mirror com o -m ficava bem lento então acabei precisando baixar manualmente no mirror e transferir os arquivos pro servidor via scp e replicar as permissões baseado na ultima saída do comando ls -laGh que mandei aqui anteriormente e o check não retornou nenhum erro.

Mas basicamente é isso, só consegui testar a transformação de dados agora então quando finalizar eu te atualizo e por fim acho bom avisar que quando você baixa manualmente do mirror o arquivo Estabelecimentos0.zip ele vem com apenas 1kb e corrompido, acabei conseguindo aqui pq eu tinha uma cópia de alguns arquivos ainda e ele tava entre eles mas pode ser que isso afete outras pessoas.

@iagoleao

This comment was marked as off-topic.

@cuducos
Copy link
Owner

cuducos commented Nov 1, 2024

Eu também estou com dificuldade de fazer o download.

Não tem nada que eu possa fazer com o orçamento atual, como documentado.

No mais, peço para manter essa issue no assunto — “Erro ao acessar o Badger no inicio da segunda etapa do transform” como diz o título — mas se quiserem falar sobre o download, mais do que feliz em tratar em outra issue, só abrir ; )

@silvioes
Copy link
Author

silvioes commented Nov 2, 2024

Terminou de rodar ontem por volta de 15h mas acabei não tendo tempo de vir aqui trazer uma atualização..

Mas aparentemente tudo certo dessa vez, trouxe os campos que não estava trazendo antes e já consigo fazer as queries no banco sem precisar adicionar o index como estava fazendo anteriormente, único problema que tive foi a questão do arquivo Estabelecimentos0.zip que mencionei anteriormente já que preencheu o banco com 42 milhões de registros imagino que o arquivo que eu tinha aqui não estava tão integro quanto eu imaginava que estaria, mas ae eu me viro aqui.

Vou baixar o do mirror anterior, esperar o site da receita voltar ou se tiver ele ae e puder me mandar me ajudaria, mas referente ao tema do badger o issue pode ser fechado que o problema que eu estava tendo foi solucionado.

Agora só pra finalizar eu to estudando bastante Go recentemente e me interessei demais por esse projeto aqui, provavelmente em breve eu tente fazer algumas contribuições, principalmente quanto ao tema de inscrições estaduais discutido em outro issue que me interessa e venho pesquisando bastante alternativas de consulta unificada.

@cuducos
Copy link
Owner

cuducos commented Nov 2, 2024

Perfeito : ) Querendo conversar sobre o projeto, só dar um alô, posso te ajudar a entender a base etc…

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants