Eu havia sido chamado à empresa para resolver outra coisa mas quando eu perguntei se estava tudo bem com a máquina do Faturamento (a segunda mais importante depois do servidor) a usuária comentou sobre esse “inconveniente” que ela tinha. Ocorria apenas numa operação especifica, quando ela precisava cadastrar notas fiscais de entrada. Ela me disse que, baseando-se em uma observação que eu fizera antes sobre um diretório com mais de 15 mil arquivos XML no servidor estar atrasando o backup, achou que fosse a quantidade de XMLs no diretório dela e já tinha apagado um monte, sem resultado. Eu conferi a quantidade de arquivos: 357. Não podia ser isso.
O diálogo que tive com a usuária foi engraçado e esclarecedor:
Eu: Você obviamente não perdeu seu tempo pedindo ao suporte do sistema para ver isso.
Ela: Eu não. Tudo agora que a gente pede eles dizem que “tem que falar com o contador”.
Eu: O contador?
Ela: É, tudo deles agora é assim.
Eu: A <nome do desenvolvedor do sistema> é uma empresa de contabilidade agora?
Rodei o Process Monitor (“PM” daqui em diante) para ver se eu encontrava alguma pista e a primeira coisa que eu notei foi outro problema do sistema comercial: o programa gerenciador de notas fiscais, que estabelece comunicação com a Fazenda, disparando uma quantidade impressionante de eventos por segundo. Era impraticável fazer alguma análise com aquela avalanche de eventos atrapalhando mas por sorte se tratava de outro executável do sistema e por isso eu podia filtrá-lo. Se o problema fosse nesse programa eu não teria conseguido fazer nada porque o PM estava travando, tamanha a quantidade de eventos adicionados ao log por segundo.
Aqui cabe uma recomendação a qualquer programador que esteja lendo isso: seu programa é apenas um entre dezenas rodando na máquina. Ao checar por algo, não faça isso centenas de vezes por segundo “só porque você pode”. Não configure um timer de 100ms se 1s (ou 5s) basta. Se você acha que isso pode impactar a percepção que o cliente pode ter da velocidade do seu programa avalie deixar isso configurável pelo cliente, mas dificilmente alguém vai questionar uma pausa de 1s em operações que são espaçadas por minutos. Claro que isso pode ocorrer por acidente então uma dica: use o PM para checar se seu programa está se comportando bem.
Após configurar o PM para observar apenas os eventos de sistema de arquivo do programa que estava travando por 45s, uma coisa me chamou logo a atenção: havia referências ao antigo servidor de arquivos da empresa, que fora desativado meses atrás, obviamente seguidas do erro “PATH NOT FOUND”. Um desses erros aparecia justamente após um intervalo de 15s sem qualquer evento ser registrado.
Isso fazia sentido e era rápido checar. Eu já tenho uma instalação do Virtualbox pronta para isso no servidor. Renomeei uma VM com o nome do antigo servidor e recriei o compartilhamento que estava sendo procurado. Com essa VM rodando e o compartilhamento acessível via rede eu repeti a operação no sistema. A abertura do diretório local da usuária foi feita quase instantaneamente.
Fiz uma rápida pesquisa sobre como fazer essa “emulação” de um modo mais “light”, sem precisar manter uma VM rodando para isso e vi algumas dicas interessantes, usando HOSTS, LMHOSTS, DNS, etc. Mas nada funcionou no tempo que eu tinha disponível e de qualquer forma o melhor jeito de mostrar a usuária e eventualmente ao suporte do sistema que o problema era esse era usar uma VM mesmo.
Eu fiquei pensando que outros problemas estariam ocorrendo diariamente na empresa por causa disso e os usuários não reclamam ao suporte do sistema porque sabem que não adianta. Se a configuração do sistema fosse em um INI ou no Registro eu mesmo tentaria resolver, mas eles guardam as configurações no banco de dados.
Jeff, usando o comando do dos SUBST não dá pra emular a unidade?
O programa está procurando um caminho UNC (\\maquina\compartilhamento). Até onde consigo me lembrar o SUBST não suporta UNC.
a burrada foi tão grande, que demorei a responder, de vergonha :s
o comando melhor seria net use; o meu pensamento era que o caminho not found estivesse
mapeado como unidade de rede, daí criar um novo mapeamento conseguiria enganar o programa.
Se já existe coisas como emulador de drive de cd/dvd, talvez tenha algum soft que emule
isso sem precisar ser uma máquina virtual. Vou pesquisar.