[Kimchi-devel] [PATCH][Wok] Add support to timestamps in clone naming function
Rodrigo Trujillo
rodrigo.trujillo at linux.vnet.ibm.com
Tue Mar 15 04:09:24 UTC 2016
Ok, please ignore this patch.
Rodrigo
On 03/14/2016 04:02 PM, Aline Manera wrote:
>
>
> On 03/14/2016 02:54 PM, Rodrigo Trujillo wrote:
>> There is a potential race condiction issue when some plugin tries to use
>> the function get_next_clone_name(all_names, basename, name_suffix='').
>> If clone requests are done so fast, it is possible that the plugin does
>> not send all resource names in all_names parameter, then the function is
>> going to select the same name for 2 or more clones, which is going to
>> cause errors in the plugin.
>>
>> Supporting timestamps in microsecond precision, plugins can avoid this
>> type of error coding its own race condiction fix or just using the
>> timestamp function option.
>> New name will be "basename-clone-timestamp-name-suffix".
>>
>> Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>
>> ---
>> src/wok/utils.py | 33 +++++++++++++++++++++------------
>> 1 file changed, 21 insertions(+), 12 deletions(-)
>>
>> diff --git a/src/wok/utils.py b/src/wok/utils.py
>> index 7e9a928..b80a80b 100644
>> --- a/src/wok/utils.py
>> +++ b/src/wok/utils.py
>> @@ -31,6 +31,7 @@ import re
>> import sqlite3
>> import subprocess
>> import sys
>> +import time
>> import traceback
>> import xml.etree.ElementTree as ET
>>
>> @@ -391,7 +392,7 @@ def remove_old_files(globexpr, hours):
>> wok_log.error(str(e))
>>
>>
>> -def get_next_clone_name(all_names, basename, name_suffix=''):
>> +def get_next_clone_name(all_names, basename, name_suffix='', ts=False):
>
> Please, move this whole function to Kimchi. It is not related to any
> Wok feature so there is no reason to keep it here.
>
>> """Find the next available name for a cloned resource.
>>
>> If any resource named "<basename>-clone-<number><name_suffix>"
>> is found
>> @@ -406,26 +407,34 @@ def get_next_clone_name(all_names, basename,
>> name_suffix=''):
>> exist so that a resource named "foo.img" gets the name
>> "foo-clone-1.img" instead of "foo.img-clone-1". If this
>> parameter
>> is used, the suffix should not be present in "basename".
>> + ts -- use timestamp, instead of incremental numbers
>>
>> Return:
>> A UTF-8 string in the format
>> "<basename>-clone-<number><name_suffix>".
>> """
>> re_group_num = 'num'
>>
>> - re_expr = u'%s-clone-(?P<%s>\d+)' % (basename, re_group_num)
>> - if name_suffix != '':
>> - re_expr = u'%s%s' % (re_expr, name_suffix)
>> + # Use timestamps or increase clone number
>> + if ts:
>> + # Microsecond precision
>> + ts_suffix = int(time.time() * 1000000)
>> + new_name = u'%s-clone-%d' % (basename, ts_suffix)
>> + else:
>> + re_expr = u'%s-clone-(?P<%s>\d+)' % (basename, re_group_num)
>> + if name_suffix != '':
>> + re_expr = u'%s%s' % (re_expr, name_suffix)
>>
>> - max_num = 0
>> - re_compiled = re.compile(re_expr)
>> + max_num = 0
>> + re_compiled = re.compile(re_expr)
>>
>> - for n in all_names:
>> - match = re_compiled.match(n)
>> - if match is not None:
>> - max_num = max(max_num, int(match.group(re_group_num)))
>> + for n in all_names:
>> + match = re_compiled.match(n)
>> + if match is not None:
>> + max_num = max(max_num, int(match.group(re_group_num)))
>> +
>> + # increments the maximum "clone number" found
>> + new_name = u'%s-clone-%d' % (basename, max_num + 1)
>>
>> - # increments the maximum "clone number" found
>> - new_name = u'%s-clone-%d' % (basename, max_num + 1)
>> if name_suffix != '':
>> new_name = new_name + name_suffix
>>
>
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>
More information about the Kimchi-devel
mailing list