tripleo-image-elements/elements/use-ephemeral
Alexis Lee ac5279a265 Symlink to backup dir until ephemeral storage available
Currently, when you call `register-state-path --leave-symlink /a`, a
symlink is left at /a pointing to /mnt/state/a. However, /mnt/state
doesn't point at ephemeral storage until the instance has booted. So if
another element tries to write through the symlink, it goes wrong.

This patch defers moving content (and leaving a symlink if required) to the
backup dir until finalise.d runs.

Change-Id: Id5bc25965db1fdf27f2bcb947c518f6f4566fd2f
Co-Author: Nicholas Randon
2014-09-24 10:34:32 +00:00
..
bin Symlink to backup dir until ephemeral storage available 2014-09-24 10:34:32 +00:00
finalise.d Symlink to backup dir until ephemeral storage available 2014-09-24 10:34:32 +00:00
os-refresh-config/pre-configure.d Symlink to backup dir until ephemeral storage available 2014-09-24 10:34:32 +00:00
README.md Introduce support for persistent state in /mnt. 2013-10-22 09:25:24 +13:00
element-deps Introduce support for persistent state in /mnt. 2013-10-22 09:25:24 +13:00

README.md

Provides tools to aid in relocating state to /mnt/state

In a cloud instance /mnt/state is on the cloud ephemeral device when one exists, or the root when one doesn't.

The pattern for having state on /mnt/state is:

  • The service/daemon can make its own state files on startup (as /mnt is always empty on first-boot).

  • Alternatively os-refresh-config can be used to populate any initial state so that the daemon/service works (so until the first os-refresh-config run that daemon/service will be broken).

  • If the state needs migrating (e.g. PostgreSQL 9.1 to 9.2) then a migration script should be added to os-refresh-config's migrations.d tree to perform that migration that state (if the migration can be done after the service starts) or to configure.d if the service cannot start without the migration being done).

  • state should live in /mnt/state/original-path e.g. /mnt/state/etc/ssh/ssh_host_dsa_key.

  • where there are hardcoded specific paths, we leave symlinks in that path pointing into /mnt/state - e.g. /etc/ssh/ss_host_dsa_key will be a symlink to /mnt/state/etc/ssh/ssh_host_dsa_key.

To factor out common code elements can invoke register-state-path during install.d to request that a particular path be registered as a stateful path.

  • If there is content at the path at registration time, it will be moved to /var/lib/use-ephemeral/original-path.

  • If --leave-symlink is passed, a symlink will be created at that path pointing to /mnt/state/original-path.

  • Stateful paths are listed in /var/lib/use-ephemeral/stateful-paths, one path per line - e.g. /etc/ssh/ssh_host_dsa_key.

Once registered:

  • During pre-configure.d the parent directories leading up to the path will be asserted on startup.

  • If there is a content at /var/lib/use-ephemeral/original-path during pre-configure.d, and the new path does not exist in /mnt/state then an rsync -a will be made into /mnt/state/original-path reinstating a pristine copy of what was preserved. This is only done when the path does not exist to avoid corrupting evolved or migrated state.