¿Debo preocuparme por las condiciones de carrera con transferencia/procesamiento SFTP?

¿Debo preocuparme por las condiciones de carrera con transferencia/procesamiento SFTP?

Guión:

Estoy usando SFTP para transferir archivos automáticamente entre dos sistemas, A y B.

El sistema A ejecuta un servidor SFTP. El sistema A sondeará periódicamente (digamos una vez por minuto) su directorio SFTP local para detectar la existencia de archivos *.dat y, si los encuentra, los importará y eliminará.

El Sistema B genera archivos *.dat y, a medida que se generan, los envía al Sistema A conectándose a ese host SFTP y cargándolos.

Preguntas:

  1. ¿Es posible que el Sistema A vea y comience a procesar un archivo antes de que el Sistema B termine de cargarlo? ¿O SFTP evitará esto de alguna manera, como no depositar archivos en la carpeta hasta que finalice la transferencia de red?

  2. ¿Es razonable/recomendable que el Sistema B cargue con otro nombre de archivo como *.locked o *.part, y luego cambie el nombre a *.dat una vez completada la transferencia de red? ¿O hay una mejor manera de manejar esto?

Respuesta1

No es una condición de carrera por definición; sin embargo, es posible que un archivo, parcialmente cargado, se abra para que el Sistema A lo lea y, por lo tanto, contenga datos no válidos. El sistema A podría verificar la coherencia del archivo, podría probar un tamaño fijo si corresponde, podría probar ciertos permisos de archivo (que usted establece después de la carga) y, en cualquier caso, posponer la apertura del archivo en caso de que no se cumplan las condiciones. haciéndolo en la siguiente iteración.

Lo subiría a un nombre de archivo o ubicación temporal y luego cambiaría el nombre/me movería a la carpeta/extensión correcta para su programa. es decir, cárguelo en filename.part y luego cambie el nombre a filename.dat o cárguelo en pendiente/filename.dat y luego salga de la carpeta pendiente. Eso resolverá estos problemas. En los sistemas UNIX/Linux y Windows, una operación de movimiento (o operación de cambio de nombre) será atómica y nunca obtendrá un archivo parcial.

No existe una forma mejor de manejar esto. Debe comunicar al Sistema A que el archivo no está completo y que no tiene ninguna comunicación entre procesos configurada entre los sistemas. Sus opciones son usar un archivo de bloqueo para evitar que su programa abra el archivo (y luego eliminarlo), usar un archivo temporal (y luego cambiar el nombre/mover su archivo al nombre apropiado) o hacer algún tipo de verificación de integridad (que probablemente sea un desperdicio de recursos).

También podría considerar, dependiendo de la frecuencia con la que esto ocurra, activar el Sistema A desde el Sistema B. Si hay un archivo allí el 99% de las veces, la forma que ya propone (con un bloqueo) es probablemente la más eficiente. Por otro lado, si solo encuentra datos ocasionalmente, puede ser un desperdicio de recursos (y requerir un programa de larga ejecución o activado por cron). Si tiene SFTP, es posible que tenga acceso SSH. En tal caso, configure certificados entre el sistema (para evitar la necesidad de contraseñas, consulte ssh-copy-id) y ejecute alguna versión modificada de

ssh system_a.tudominio.com 'archivo de proceso /home/user/data/*.dat'

información relacionada