| Introduction |
| ============ |
| |
| dm-era is a target that behaves similar to the linear target. In |
| addition it keeps track of which blocks were written within a user |
| defined period of time called an 'era'. Each era target instance |
| maintains the current era as a monotonically increasing 32-bit |
| counter. |
| |
| Use cases include tracking changed blocks for backup software, and |
| partially invalidating the contents of a cache to restore cache |
| coherency after rolling back a vendor snapshot. |
| |
| Constructor |
| =========== |
| |
| era <metadata dev> <origin dev> <block size> |
| |
| metadata dev : fast device holding the persistent metadata |
| origin dev : device holding data blocks that may change |
| block size : block size of origin data device, granularity that is |
| tracked by the target |
| |
| Messages |
| ======== |
| |
| None of the dm messages take any arguments. |
| |
| checkpoint |
| ---------- |
| |
| Possibly move to a new era. You shouldn't assume the era has |
| incremented. After sending this message, you should check the |
| current era via the status line. |
| |
| take_metadata_snap |
| ------------------ |
| |
| Create a clone of the metadata, to allow a userland process to read it. |
| |
| drop_metadata_snap |
| ------------------ |
| |
| Drop the metadata snapshot. |
| |
| Status |
| ====== |
| |
| <metadata block size> <#used metadata blocks>/<#total metadata blocks> |
| <current era> <held metadata root | '-'> |
| |
| metadata block size : Fixed block size for each metadata block in |
| sectors |
| #used metadata blocks : Number of metadata blocks used |
| #total metadata blocks : Total number of metadata blocks |
| current era : The current era |
| held metadata root : The location, in blocks, of the metadata root |
| that has been 'held' for userspace read |
| access. '-' indicates there is no held root |
| |
| Detailed use case |
| ================= |
| |
| The scenario of invalidating a cache when rolling back a vendor |
| snapshot was the primary use case when developing this target: |
| |
| Taking a vendor snapshot |
| ------------------------ |
| |
| - Send a checkpoint message to the era target |
| - Make a note of the current era in its status line |
| - Take vendor snapshot (the era and snapshot should be forever |
| associated now). |
| |
| Rolling back to an vendor snapshot |
| ---------------------------------- |
| |
| - Cache enters passthrough mode (see: dm-cache's docs in cache.txt) |
| - Rollback vendor storage |
| - Take metadata snapshot |
| - Ascertain which blocks have been written since the snapshot was taken |
| by checking each block's era |
| - Invalidate those blocks in the caching software |
| - Cache returns to writeback/writethrough mode |
| |
| Memory usage |
| ============ |
| |
| The target uses a bitset to record writes in the current era. It also |
| has a spare bitset ready for switching over to a new era. Other than |
| that it uses a few 4k blocks for updating metadata. |
| |
| (4 * nr_blocks) bytes + buffers |
| |
| Resilience |
| ========== |
| |
| Metadata is updated on disk before a write to a previously unwritten |
| block is performed. As such dm-era should not be effected by a hard |
| crash such as power failure. |
| |
| Userland tools |
| ============== |
| |
| Userland tools are found in the increasingly poorly named |
| thin-provisioning-tools project: |
| |
| https://github.com/jthornber/thin-provisioning-tools |