diff options
author | Rajesh Joseph <rjoseph@redhat.com> | 2014-04-23 18:36:34 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-05-02 23:33:10 -0700 |
commit | 66f560e0071db84d430f38b996364f6b8c4f0f6d (patch) | |
tree | 3feda2f915c4f4eefc6e1e50eddf1918ff62d2a6 /xlators/mgmt/glusterd/src/glusterd-store.c | |
parent | f48656b32e328f96bda5aade55070867d5faf333 (diff) |
glusterd/snapshot: Restore cleanup
If restores fails for some reason then we should revert
the restore operation. To do so we take the backup of
vols folder before doing a restore and if the restore
fails then we revert the changes done.
Change-Id: I97f72aec3a34fc122bf137beb336e94db3a04dff
BUG: 1061685
Signed-off-by: Rajesh Joseph <rjoseph@redhat.com>
Reviewed-on: http://review.gluster.org/7548
Reviewed-by: Santosh Pradhan <spradhan@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-store.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 3993504e8b0..ab635ff943f 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -3871,6 +3871,11 @@ out: * dies after taking the backend snapshot, but before updating the * status, then when glusterd comes up, it should treat that snapshot * as a failed snapshot and clean it up. + * + * Restore operation starts by setting the status to + * GD_SNAP_STATUS_RESTORED. If the server goes down before changing + * the status the status back we need to revert the partial snapshot + * taken. */ int32_t glusterd_snap_cleanup (xlator_t *this) @@ -3893,7 +3898,15 @@ glusterd_snap_cleanup (xlator_t *this) } list_for_each_entry (snap, &priv->snapshots, snap_list) { - if (snap->snap_status != GD_SNAP_STATUS_IN_USE) { + if (snap->snap_status == GD_SNAP_STATUS_RESTORED) { + ret = glusterd_snapshot_revert_restore_from_snap (snap); + if (ret) { + gf_log (this->name, GF_LOG_WARNING, "Failed to " + "revert partially restored snapshot " + "(%s)", snap->snapname); + goto out; + } + } else if (snap->snap_status != GD_SNAP_STATUS_IN_USE) { ret = glusterd_snap_remove (dict, snap, _gf_true, _gf_true); if (ret) { |