Node:Mis envíos (commits) parecen tener lugar a trozos y no atómicamente, Next:, Previous:El método pserver SIGUE sin funcionar, Up:Algunos Problemas de la Vida Real (con Soluciones)



Mis envíos (commits) parecen tener lugar a trozos y no atómicamente

Esto es porque CVS hace los envíos a trozos, y no atómicamente. :-)

Más específicamente, las operaciones de CVS tienen lugar directorio a directorio. Cuando hacemos un commit (o update o cualquier cosa) afectando a varios directorio, CVS bloquea cada directorio mientras hace la operación en él, desbloqueándolo antes de pasar al siguiente.

Para proyectos pequeños o medianos, raramente será esto un problema, ni notaremos que la operación no es atómica. Sin embargo, en proyectos grandes, se pueden dar escenarios como el siguiente (imaginemos que el proyecto tiene al menos dos directorios A y B, con muchos ficheros):

  1. El usuario pperez inicia un envío (commit), afectando a ficheros de ambos directorios. CVS envía los ficheros de B en primer lugar (porque el usuario lo especificó en ese orden).
  2. El usuario jsuerte inicia una actualización (update). Por alguna razón, supongamos que ésta se inicia copiando el directorio A (CVS no garantiza ningún orden por su cuenta). Obsérvse que no hay bloqueo aun porque pperez aun no está activo en A.
  3. Ahora, el envío de pperez finaliza B, se va a A y finaliza A.
  4. Finalmente, la actualización de jsuerte se va a B y finaliza.

Claramente, cuando todo acaba, la copia de trabajo de jsuerte refleja los cambios de pperez en B pero no en A. Aunque pperez intentase hacerlo atómicamente, no hay forma. Ahora la copia de jsuerte está en un estado que desconoce pperez.

La solución, por supuesto, es que jsuerte haga de nuevo el cvs update.

El fallo de no permitir transacciones atómicas es considerado ampliamente como un error de CVS. La única razón por la que los cerrojos no se establecen en la raíz del repositorio es porque esto resultaría inaceptable para grandes proyectos con múltiples desarrolladores. Para mitigar este problema, en CVS se escogió bloquear a nivel de cada directorio, reduciendo así la contención. Alguna vez alguien podría modificar CVS para acelerar sus operaciones, de manera que se mejore esta situación.

Para más información, véase el nodo Concurrency del manual de Cederqvist.