A system and method for remote asynchronous replication or mirroring of changes
in a source file system snapshot in a destination replica file system using a scan
(via a scanner) of the blocks that make up two versions of a snapshot of the source
file system, which identifies changed blocks in the respective snapshot files based
upon differences in volume block numbers identified in a scan of the logical file
block index of each snapshot. Trees of blocks associated with the files are traversed,
bypassing unchanged pointers between versions and walking down to identify the
changes in the hierarchy of the tree. These changes are transmitted to the destination
mirror or replicated snapshot. This technique allows regular files, directories,
inodes and any other hierarchical structure to be efficiently scanned to determine
differences between versions thereof. The changes in the files and directories
are transmitted over the network for update of the replicated destination snapshot
in an asynchronous (lazy write) manner. The changes are described in an extensible,
system-independent data stream format layered under a network transport protocol.
At the destination, source changes are used to update the destination snapshot.
Any deleted or modified inodes already on the destination are moved to a temporary
or "purgatory" directory and, if reused, are relinked to the rebuilt replicated
snapshot directory. The source file system snapshots can be representative of a
volume sub-organization, such as a qtree.