| 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 |