Página 1 de 2

Alternativas al uso de tie

NotaPublicado: 2009-06-24 10:04 @461
por thiseyramo
Hola a todos, tengo un pequeño problema con el uso de tie()... Resulta que necesito que dos procesos diferentes accedan al mismo tiempo a ficheros de serialización que se han creado con tie(), pero buscando en Internet me encontré con que esto no es posible...

Lo que quisiera saber es si existe otro módulo que haga lo mismo que tie(), pero que sí me permita acceso simultáneo al fichero. O que al menos en determinado momento me permita "clonar" o copiar ese fichero en otra ubicación para que otro proceso lo pueda usar sin que el actual deje de funcionar en ningún momento.

Les agradezco de antemano cualquier colaboración...

Saludos

NotaPublicado: 2009-06-24 11:27 @518
por explorer
Bienvenido a los foros de Perl en Español, thiseyramo.

¿No te funciona lo comentado en el apartado flock() del módulo Tie::File?

NotaPublicado: 2009-06-24 11:40 @528
por thiseyramo
Hola, gracias por responder tan pronto...

¿Lo que me sugieres entonces es bloquear el fichero mientras hago la copia a la otra ubicación?

No la veo muy clara... disculpa mi ignorancia, pero es que soy realmente nuevo con Perl...

Saludos

NotaPublicado: 2009-06-24 14:18 @637
por explorer
Según la documentación, sirve para eso.

Quizás otra opción sea usar un sistema de base de datos, en lugar de tie(). Pero yo probaría con el flock(), claro, por ver si con eso me vale.

Como pone en la documentación, hay que hacer los tie(), flock() y untie() de forma rápida, para dar oportunidad al resto de procesos el que puedan acceder al fichero.

NotaPublicado: 2009-06-24 14:22 @640
por explorer
Un momento... acabo de darme cuenta de un detalle...

Estás hablando de copiar el fichero entero a otro sitio...

A ver... si adoptas la política de que no te importa que otro proceso esté leyendo el fichero mientras lo estás moviendo, eso es factible hacerlo en sistema Unix/Linux. Si estás en Windows, sí que tienes un problema.

Una opción sería: cámbiale de nombre al principio, para que el resto de procesos, si intentan leerlo, no lo puedan encontrar. Haces luego el proceso de movimiento.

Humm... quizás hacen falta más detalles de lo que quieres hacer...

NotaPublicado: 2009-06-24 15:09 @673
por thiseyramo
Bueno, te comento... lo que tengo es lo siguiente... 2 máquinas que acceden a un medio físico compartido, específicamente un NAS.

Inicialmente cada máquina escribe su serialización en un directorio aparte dentro de ese medio compartido, digamos: Serialize1 y Serialize2 correspondientemente; hasta ahí no hay problema.

Atendiendo peticiones solo va a estar una máquina a la vez y ya tenemos resuelto el tema de que esas dos serializaciones se sincronicen; mi problema empieza cuando una de las dos máquinas falla, momento en el cual no tengo manera de mantener actualizada su serialización en relación con la de la máquina que sigue viva, de manera que en el momento en que esta máquina que falló vuelva a entrar en servicio no tendrá la serialización correcta. Por eso había pensado en copiar la serialización que está actualizada a la otra máquina para que las dos queden con los datos correctos.

El tie() se está empleando de la siguiente manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
tie(%hash, "DB_file", 'archivo.db', O_CREAT|O_RDWR, 0755)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Espero que con eso se puedan hacer mejor a una idea de mi problemita..

Saludos,

NotaPublicado: 2009-06-24 17:56 @789
por explorer
¿Y el programa, al arrancar, no puede darse cuenta de que está su correspondiente fichero desincronizado y hacer en ese momento una copia?

Mirando las fechas de los ficheros, se podría hacer... y con flock() te aseguras que no es actualizado el fichero mientras es copiado. Lo que no sé es si funcionará en un sistema de ficheros remoto (porque supongo que los programas se ejecutan en el entorno local de cada máquina).

NotaPublicado: 2009-06-25 08:52 @411
por thiseyramo
Correcto; cada programa se ejecuta en el entorno local de su máquina... pero creo que la opción que me dices puede servir, tendría que enviarle un comando a la máquina que está con vida para que haga al flock() mientras se hace la copia.

Voy a hacer un par de pruebas y luego comento los resultados...

Saludos.

NotaPublicado: 2009-06-25 09:01 @417
por explorer
Humm... más bien el flock() debería hacerlo el fichero que necesita obtener la última copia... para evitar que el que estaba vivo lo modifique mientras.

NotaPublicado: 2009-06-27 07:39 @361
por Jenda
tie() no tiene nada que ver con ficheros. Lo único que tie() hace es atar un hash con algún objeto. Y es el objeto que escribe en ficheros o bases de datos o computa algo o ...

Así que sin saber a qué clase tie() el hash, no podemos ayudar con nada. Ahora, cuando sabemos que es DB_File podemos aconsejarte a leer la documentación del DB_File. Especialmente las secciones "Locking: The Trouble with fd" y "Safe ways to lock a database".

Parece que debes usar BerkeleyDB en vez de DB_File. Ver su documentación.