diff --git a/src/image/ImageManagerActions.cc b/src/image/ImageManagerActions.cc index 6846353ac8..320c1596ad 100644 --- a/src/image/ImageManagerActions.cc +++ b/src/image/ImageManagerActions.cc @@ -498,6 +498,8 @@ int ImageManager::delete_image(int iid, string& error_str) ipool->update(img); } + unsigned int snap_size = (img->get_snapshots()).get_total_size(); + img->unlock(); delete drv_msg; @@ -507,7 +509,7 @@ int ImageManager::delete_image(int iid, string& error_str) Template img_usage; img_usage.add("DATASTORE", ds_id); - img_usage.add("SIZE", size); + img_usage.add("SIZE", size + snap_size); Quotas::ds_del(uid, gid, &img_usage); diff --git a/src/image/ImageManagerDriver.cc b/src/image/ImageManagerDriver.cc index 6bb6fa1aac..41bec760e8 100644 --- a/src/image/ImageManagerDriver.cc +++ b/src/image/ImageManagerDriver.cc @@ -18,6 +18,7 @@ #include "ImagePool.h" #include "NebulaLog.h" +#include "Quotas.h" #include "Nebula.h" #include @@ -692,6 +693,9 @@ static void snap_delete_action(istringstream& is, ostringstream oss; string info; + unsigned int snap_size; + int ds_id, uid, gid; + Image * image = ipool->get(id, true); if ( image == 0 ) @@ -715,6 +719,11 @@ static void snap_delete_action(istringstream& is, if ( result == "SUCCESS") { + ds_id = image->get_ds_id(); + uid = image->get_uid(); + gid = image->get_gid(); + snap_size = (image->get_snapshots()).get_snapshot_size(snap_id); + image->delete_snapshot(snap_id); } else @@ -738,6 +747,17 @@ static void snap_delete_action(istringstream& is, ipool->update(image); image->unlock(); + + if (result == "SUCCESS") + { + Template quotas; + + quotas.add("DATASTORE", ds_id); + quotas.add("SIZE", (long long) snap_size); + quotas.add("IMAGES",0 ); + + Quotas::ds_del(uid, gid, "as); + } } /* -------------------------------------------------------------------------- */ @@ -808,6 +828,9 @@ static void snap_flatten_action(istringstream& is, ostringstream oss; string info; + unsigned int snap_size; + int ds_id, uid, gid; + Image * image = ipool->get(id, true); if ( image == 0 ) @@ -817,6 +840,11 @@ static void snap_flatten_action(istringstream& is, if ( result == "SUCCESS") { + ds_id = image->get_ds_id(); + uid = image->get_uid(); + gid = image->get_gid(); + snap_size = (image->get_snapshots()).get_total_size(); + image->clear_snapshots(); } else @@ -842,6 +870,17 @@ static void snap_flatten_action(istringstream& is, ipool->update(image); image->unlock(); + + if (result == "SUCCESS") + { + Template quotas; + + quotas.add("DATASTORE", ds_id); + quotas.add("SIZE", (long long) snap_size); + quotas.add("IMAGES",0 ); + + Quotas::ds_del(uid, gid, "as); + } } /* -------------------------------------------------------------------------- */ diff --git a/src/rm/RequestManagerChown.cc b/src/rm/RequestManagerChown.cc index 6c73c1a5b1..d7b1fcc52e 100644 --- a/src/rm/RequestManagerChown.cc +++ b/src/rm/RequestManagerChown.cc @@ -60,7 +60,7 @@ PoolObjectSQL * RequestManagerChown::get_and_quota( tmpl = new Template; tmpl->add("DATASTORE", img->get_ds_id()); - tmpl->add("SIZE", img->get_size()); + tmpl->add("SIZE",img->get_size()+img->get_snapshots().get_total_size()); qtype = Quotas::DATASTORE; }