chapzin / parse-efd-fiscal

Projeto voltado para fazer o mapeamento e parse do sped fiscal para dentro do banco de dados
MIT License
63 stars 16 forks source link

race condition #6

Open crgimenes opened 7 years ago

crgimenes commented 7 years ago

Possível race condition no SpedRead.go

https://github.com/chapzin/parse-efd-fiscal/blob/master/SpedRead/SpedRead.go#L57 Precisamos ver a melhor forma de limitar goroutines, da forma que estamos fazendo hoje pode causar uma race condition, poderíamos simplesmente usar mutex e resolver esse caso rapidamente mas também podemos reescrever esse limitador usando canais.

danielfireman commented 6 years ago

disclaimer .. apenas dei uma lida no código para tentar dar uma ajuda aqui.

Um possível problema que pode acontecer é o wait() terminar antes dessa go routine terminar. Como vocês passam um apontador para a variável r, na próxima iteração esse ponteiro pode ser modificado, causando algum tipo de corrupção.

Em resumo, talvez o fix para essa race condition seja tão simples tão simples quanto passar a variável r por valor aqui. Claro que envolve uma mudança na função InsertSped.

crgimenes commented 6 years ago

Nesse caso não tem como acontecer porque o decremento da variável id acontece no fim da InsertSped, o problema de data race eu explico como corrigir aqui: http://crg.eti.br/post/go-previnindo-data-race/ achei que o @chapzin tinha feito no sistema dele também.

danielfireman commented 6 years ago

Opa @crgimenes, obrigado pela explicação. Entendi sim e parabéns pelo post!

Realmente a quantidade de ferramentas desse tipo em go é bem grande. Só acrescentando um pouca, outra forma de atingir o mesmo objetivo (com performance similar) do exemplo do post é usando o pacote sync/atomic.