mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-16 22:50:10 +03:00
development: Check lock value, prevent memory leak on lock serialization
This commit is contained in:
parent
69db2923d9
commit
5afdaf4e74
@ -593,6 +593,11 @@ bool PoolObjectSQL::name_is_valid(const string& obj_name,
|
||||
|
||||
int PoolObjectSQL::lock_db(const int owner, const int req_id, const int level)
|
||||
{
|
||||
if ( level < ST_NONE || level > ST_ADMIN )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
locked = static_cast<LockStates>(level);
|
||||
lock_time = time(0);
|
||||
lock_owner = owner;
|
||||
@ -626,18 +631,23 @@ int PoolObjectSQL::unlock_db(const int owner, const int req_id)
|
||||
|
||||
string& PoolObjectSQL::lock_db_to_xml(string& xml) const
|
||||
{
|
||||
ostringstream oss;
|
||||
if (locked != LockStates::ST_NONE)
|
||||
if (locked == LockStates::ST_NONE)
|
||||
{
|
||||
oss << "<LOCK>"
|
||||
<< "<LOCKED>" << static_cast<int>(locked) << "</LOCKED>"
|
||||
<< "<OWNER>" << lock_owner << "</OWNER>"
|
||||
<< "<TIME>" << lock_time << "</TIME>"
|
||||
<< "<REQ_ID>" << lock_req_id << "</REQ_ID>"
|
||||
<< "</LOCK>";
|
||||
xml.clear();
|
||||
return xml;
|
||||
}
|
||||
|
||||
ostringstream oss;
|
||||
|
||||
oss << "<LOCK>"
|
||||
<< "<LOCKED>" << static_cast<int>(locked) << "</LOCKED>"
|
||||
<< "<OWNER>" << lock_owner << "</OWNER>"
|
||||
<< "<TIME>" << lock_time << "</TIME>"
|
||||
<< "<REQ_ID>" << lock_req_id << "</REQ_ID>"
|
||||
<< "</LOCK>";
|
||||
|
||||
xml = oss.str();
|
||||
|
||||
return xml;
|
||||
}
|
||||
|
||||
@ -648,17 +658,25 @@ int PoolObjectSQL::lock_db_from_xml()
|
||||
{
|
||||
int rc = 0;
|
||||
int locked_int;
|
||||
|
||||
vector<xmlNodePtr> content;
|
||||
|
||||
if (ObjectXML::get_nodes("/*/LOCK/LOCKED", content) > 0)
|
||||
{
|
||||
rc += xpath(locked_int, "/*/LOCK/LOCKED", 0);
|
||||
rc += xpath(lock_req_id, "/*/LOCK/REQ_ID", -1);
|
||||
rc += xpath(lock_owner, "/*/LOCK/OWNER", -1);
|
||||
xpath<time_t>(lock_time, "/*/LOCK/TIME", time(0));
|
||||
ObjectXML::get_nodes("/*/LOCK/LOCKED", content);
|
||||
|
||||
locked = static_cast<LockStates>(locked_int);
|
||||
if ( content.empty() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
rc += xpath(locked_int, "/*/LOCK/LOCKED", 0);
|
||||
rc += xpath(lock_req_id, "/*/LOCK/REQ_ID", -1);
|
||||
rc += xpath(lock_owner, "/*/LOCK/OWNER", -1);
|
||||
|
||||
xpath<time_t>(lock_time, "/*/LOCK/TIME", time(0));
|
||||
|
||||
locked = static_cast<LockStates>(locked_int);
|
||||
|
||||
ObjectXML::free_nodes(content);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user