Hi, after a snapshot is taken currently many write operations are quite slow due to - refcount updates (decrement old and increment new ) - cluster allocation and file expansion - read-modify-write on partial clusters
I found 2 way to improve refcount performance Method 1 - Lazy count Mainly do not take into account count for current snapshot, that is current snapshot counts as 0. This would require to add a current_snapshot in header and update refcount when current is changed. So for these operation - creating snapshot, performance are the same, just increment for old snapshot instead of the new one - normal write operations. As current snaphot counts as 0 there is not operations here so do not write any data - changing current snapshot, this is the worst case, you have to increment for the current snapshot and decrement for the new so it will take twice - deleting snapshot, if is the current just set current_snapshot to a dummy not existing value, if is not the current just decrement counters, no performance changes Method 2 - Read-only parent Here parents are readonly, instead of storing a refcount store a numeric id of the owner. If the owner is not current copy the cluster and change it. Considering this situation A --- B --- C B cannot be changed so in order to "change" B you have to create a new snapshot A --- B --- C \--- D and change D. It can take more space cause you have in this case an additional snapshot. Operations: - creating snapshot, really fast as you don't have to change any ownership - normal write operations. If owner is not the same allocate a new cluster and just store a new owner for new cluster. Also ownership for past-to-end cluster could be set all to current owner in order to collapse allocations - changing current snapshot, no changes required for owners - deleting snapshot. Only possible if you have no child or a single child. Will require to scan all l2 tables and merge and update owner. Same performance Regards Frediano Ziglio