[libvirt] [PATCH] storage: Refresh pool after creating volume
Martin Kletzander
mkletzan at redhat.com
Thu Jun 6 12:03:50 UTC 2013
On 06/06/2013 12:13 PM, Daniel P. Berrange wrote:
> On Thu, Jun 06, 2013 at 11:19:18AM +0200, Guido Günther wrote:
>> On Mon, Jun 03, 2013 at 11:47:10PM +0800, Osier Yang wrote:
>>> On 01/06/13 16:05, Martin Kletzander wrote:
>>>> commit 416247880399f88ec382a16c7cebc5460d6b67ad
>>>> Author: Martin Kletzander <mkletzan at redhat.com>
>>>> Date: Fri May 31 14:25:48 2013 +0200
>>>>
>>>> test
>>>>
>>>> diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
>>>> index 1a85afc..a119fc4 100644
>>>> --- a/src/storage/storage_backend_fs.c
>>>> +++ b/src/storage/storage_backend_fs.c
>>>> @@ -1,7 +1,7 @@
>>>> /*
>>>> * storage_backend_fs.c: storage backend for FS and directory handling
>>>> *
>>>> - * Copyright (C) 2007-2012 Red Hat, Inc.
>>>> + * Copyright (C) 2007-2013 Red Hat, Inc.
>>>> * Copyright (C) 2007-2008 Daniel P. Berrange
>>>> *
>>>> * This library is free software; you can redistribute it and/or
>>>> @@ -797,6 +797,27 @@ error:
>>>> }
>>>>
>>>>
>>>> +static int
>>>> +virStorageBackendStatVFS(virStoragePoolDefPtr def)
>>>> +{
>>>> + struct statvfs sb;
>>>> +
>>>> + if (statvfs(def->target.path, &sb) < 0) {
>>>> + virReportSystemError(errno,
>>>> + _("cannot statvfs path '%s'"),
>>>> + def->target.path);
>>>> + return -1;
>>>> + }
>>>> + def->capacity = ((unsigned long long)sb.f_frsize *
>>>> + (unsigned long long)sb.f_blocks);
>>>> + def->available = ((unsigned long long)sb.f_bfree *
>>>> + (unsigned long long)sb.f_frsize);
>>>> + def->allocation = def->capacity - def->available;
>>>> +
>>>> + return 0;
>>>> +}
>>>> +
>>>
>>> Though this is only for fs backend, I could see your thought (only
>>> refresh the
>>> pool's capacity, available, and allocation, without collecting the
>>> volumes), right?
>>> This makes sense for fs backend indeed, but not for some of the other
>>> backends, for instance, scsi backend pool, it populates the pool's capacity,
>>> available, allocation while scanning the LUNs...
>>
>> This would also mean that we do heaps of pool refreshes when creating
>> lots of volumes which can be an expensive operation. Shouldn't we rather
>> only update the information from the information we have from the newly
>> created volume?
>
> Yeah, when creating a volume, we certainly shouldn't do a full pool
> refresh. We want to update the pool from the metadata that we already
> have about the volume we're creating.
>
That is what I'm trying to suggest the whole time :) One check for the
volume and one statvfs call is very reasonable (I'd say) to run when
creating a volume. And it removes similar problems with information
freshness.
Martin
More information about the libvir-list
mailing list