1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-21 14:50:08 +03:00

Merge branch 'juanmont-bug-1412'

This commit is contained in:
Ruben S. Montero 2018-01-25 12:05:26 +01:00
commit ebc038d88f
5 changed files with 54 additions and 20 deletions

View File

@ -94,18 +94,20 @@ public:
* Try to acquire an image from the repository for a VM.
* @param image_id id of image
* @param error string describing the error
* @param attach true if attaching the image to a VM
* @return pointer to the image or 0 if could not be acquired
*/
Image * acquire_image(int vm_id, int image_id, string& error);
Image * acquire_image(int vm_id, int image_id, bool attach, string& error);
/**
* Try to acquire an image from the repository for a VM.
* @param name of the image
* @param id of owner
* @param error string describing the error
* @param attach true if attaching the image to a VM
* @return pointer to the image or 0 if could not be acquired
*/
Image * acquire_image(int vm_id, const string& name, int uid, string& error);
Image * acquire_image(int vm_id, const string& name, int uid, bool attach, string& error);
/**
* Releases an image and triggers any needed operations in the repo
@ -358,9 +360,10 @@ private:
/**
* Acquires an image updating its state.
* @param image pointer to image, it should be locked
* @param attach true if attaching the image to a VM
* @return 0 on success
*/
int acquire_image(int vm_id, Image *img, string& error);
int acquire_image(int vm_id, Image *img, bool attach, string& error);
/**
* Moves a file to an image in the repository

View File

@ -154,6 +154,7 @@ public:
* @param uid of VM owner (to look for the image id within its images)
* @param image_id on success returns the acquired image id
* @param snaps list of snapshots associated to this image
* @param attach true if attaching the image to a VM
* @param error_str string describing the error
*
* @return 0 on success, -1 otherwise
@ -166,6 +167,7 @@ public:
int uid,
int& image_id,
Snapshots ** snaps,
bool attach,
string& error_str);
/**
* Generates a DISK attribute for VM templates using the Image metadata

View File

@ -25,7 +25,8 @@
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
Image * ImageManager::acquire_image(int vm_id, int image_id, string& error)
Image * ImageManager::acquire_image(int vm_id, int image_id, bool attach,
string& error)
{
Image * img;
int rc;
@ -41,7 +42,7 @@ Image * ImageManager::acquire_image(int vm_id, int image_id, string& error)
return 0;
}
rc = acquire_image(vm_id, img, error);
rc = acquire_image(vm_id, img, attach, error);
if ( rc != 0 )
{
@ -54,7 +55,8 @@ Image * ImageManager::acquire_image(int vm_id, int image_id, string& error)
/* -------------------------------------------------------------------------- */
Image * ImageManager::acquire_image(int vm_id, const string& name, int uid, string& error)
Image * ImageManager::acquire_image(int vm_id, const string& name, int uid,
bool attach, string& error)
{
Image * img;
int rc;
@ -71,7 +73,7 @@ Image * ImageManager::acquire_image(int vm_id, const string& name, int uid, stri
return 0;
}
rc = acquire_image(vm_id, img, error);
rc = acquire_image(vm_id, img, attach, error);
if ( rc != 0 )
{
@ -84,7 +86,7 @@ Image * ImageManager::acquire_image(int vm_id, const string& name, int uid, stri
/* -------------------------------------------------------------------------- */
int ImageManager::acquire_image(int vm_id, Image *img, string& error)
int ImageManager::acquire_image(int vm_id, Image *img, bool attach, string& error)
{
int rc = 0;
@ -126,18 +128,29 @@ int ImageManager::acquire_image(int vm_id, Image *img, string& error)
break;
case Image::LOCKED:
img->inc_running(vm_id);
if ( img->is_persistent() )
if (attach)
{
img->set_state(Image::LOCKED_USED_PERS);
oss << "Cannot acquire image " << img->get_oid()
<< ", it is locked";
error = oss.str();
rc = -1;
}
else
{
img->set_state(Image::LOCKED_USED);
}
img->inc_running(vm_id);
ipool->update(img);
if ( img->is_persistent() )
{
img->set_state(Image::LOCKED_USED_PERS);
}
else
{
img->set_state(Image::LOCKED_USED);
}
ipool->update(img);
}
break;
case Image::USED_PERS:
@ -150,11 +163,26 @@ int ImageManager::acquire_image(int vm_id, Image *img, string& error)
break;
case Image::USED:
case Image::LOCKED_USED:
img->inc_running(vm_id);
ipool->update(img);
break;
case Image::LOCKED_USED:
if (attach)
{
oss << "Cannot acquire image " << img->get_oid()
<< ", it is locked";
error = oss.str();
rc = -1;
}
else
{
img->inc_running(vm_id);
ipool->update(img);
}
break;
case Image::INIT:
case Image::DISABLED:
case Image::ERROR:

View File

@ -297,6 +297,7 @@ int ImagePool::acquire_disk(int vm_id,
int uid,
int& image_id,
Snapshots ** snap,
bool attach,
string& error_str)
{
string source;
@ -314,7 +315,7 @@ int ImagePool::acquire_disk(int vm_id,
if ( disk->vector_value("IMAGE_ID", iid) == 0 )
{
img = imagem->acquire_image(vm_id, iid, error_str);
img = imagem->acquire_image(vm_id, iid, attach, error_str);
if ( img == 0 )
{
@ -336,7 +337,7 @@ int ImagePool::acquire_disk(int vm_id,
return -1;
}
img = imagem->acquire_image(vm_id, source, uiid, error_str);
img = imagem->acquire_image(vm_id, source, uiid, attach, error_str);
if ( img == 0 )
{

View File

@ -751,7 +751,7 @@ int VirtualMachineDisks::get_images(int vm_id, int uid, const std::string& tsys,
}
if ( ipool->acquire_disk(vm_id, disk, disk_id, image_type, dev_prefix,
uid, image_id, &snapshots, error_str) != 0 )
uid, image_id, &snapshots, false, error_str) != 0 )
{
oss << "DISK " << disk_id << ": " << error_str;
error_str = oss.str();
@ -1076,7 +1076,7 @@ VirtualMachineDisk * VirtualMachineDisks::set_up_attach(int vmid, int uid,
VirtualMachineDisk * disk = new VirtualMachineDisk(vdisk, max_disk_id + 1);
int rc = ipool->acquire_disk(vmid, disk, max_disk_id + 1, img_type,
dev_prefix, uid, image_id, &snap, error);
dev_prefix, uid, image_id, &snap, true, error);
if ( rc != 0 )
{
return 0;