回滚快照但空间不足

时间:2018-03-14 15:32:29

标签: rollback snapshot zfs

我有一个1TB zpool和一个700GB的卷,有一个干净的快照,例如:

zpool1
zpool1/volume1
zpool1/volume1@snap1

在将500GB数据写入数量后,其书面属性也增长到500GB。

然后我试图回滚到快照,我得到错误"空间不足"。

zpool是否需要额外的空间来回滚具有大写入值的快照?或者任何人都可以解释为什么会失败?

2 个答案:

答案 0 :(得分:2)

搜索zfs源代码(dsl_dataset.c)后,我发现dsl_dataset_rollback_check()的最后一部分可以解释这个限制:

 * When we do the clone swap, we will temporarily use more space
 * due to the refreservation (the head will no longer have any
 * unique space, so the entire amount of the refreservation will need
 * to be free).  We will immediately destroy the clone, freeing
 * this space, but the freeing happens over many txg's.
 *
unused_refres_delta = (int64_t)MIN(ds->ds_reserved,
    dsl_dataset_phys(ds)->ds_unique_bytes);

if (unused_refres_delta > 0 &&
    unused_refres_delta >
    dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE)) {
    dsl_dataset_rele(ds, FTAG);
    return (SET_ERROR(ENOSPC));
}

因此,音量"可用"必须比" refreserv"更长。执行回滚。 只有轻量级才能通过此检查。

答案 1 :(得分:1)

回滚到快照需要一点空间(用于更新元数据),但这非常小。

根据您的描述,我预计您在同一个池/配额组中编写的几乎任何内容都会在ENOSPC处失败。如果你运行zpool status,我打赌你会发现整个游泳池几乎已经满了,或者如果你正在使用配额,也许你已经吃掉了它适用的所有配额组。如果这不是您所期望的,则可能是您正在使用镜像或RAID-Z,这会导致写入重复的字节(以允许损坏恢复)。您可以通过查看used中的written物理字节(而不是zfs list逻辑字节)来判断这一点。

快照之后添加的大多数数据都可以在回滚完成后删除,但不能在此之前删除(因此回滚必须保留该数据直到完成)。