[libvirt] [PATCH] Added timestamps to storage volumes

Hendrik Schwartke hendrik at os-t.de
Thu Jul 19 07:13:05 UTC 2012


I reconsidered the way timestamps are represented. I think that an event 
at 100.91 happened before 100.200 is misleading. So I changed that.
Furthermore I would appreciate if the timestamps are available in 
0.10.0, so I splitted the patch. The first patch doesn't use stat-time 
and the second patches the first and does use stat-time. I would be nice 
if at least the first one could be commited before the next version is 
tagged.

Thanks
Hendrik


On 13.07.2012 17:14, Eric Blake wrote:
> On 07/13/2012 08:38 AM, Hendrik Schwartke wrote:
>> !!! DON'T PUSH until stat-time lgpl 3 issue is fixed
>> !!! To tests this change lgpl version to 3 in bootstrap.conf:176
>>
>> The access, birth, modification and change times are added to
>> storage volumes and corresponding xml representations.
>> ---
>>   bootstrap.conf                |    1 +
>>   docs/formatstorage.html.in    |   13 +++++++++++++
>>   docs/schemas/storagevol.rng   |   36 ++++++++++++++++++++++++++++++++++++
>>   src/conf/storage_conf.c       |   18 ++++++++++++++++++
>>   src/conf/storage_conf.h       |   13 +++++++++++++
>>   src/storage/storage_backend.c |    6 ++++++
>>   6 files changed, 87 insertions(+)
>>
>> diff --git a/bootstrap.conf b/bootstrap.conf
>> index 9b42cbf..da0b960 100644
>> --- a/bootstrap.conf
>> +++ b/bootstrap.conf
>> @@ -115,6 +115,7 @@ vc-list-files
>>   vsnprintf
>>   waitpid
>>   warnings
>> +stat-time
>>   '
> Insert in sorted order.
>
>
>> @@ -172,6 +177,14 @@
>>           contains the MAC (eg SELinux) label string.
>>           <span class="since">Since 0.4.1</span>
>>         </dd>
>> +<dt><code>timestamps</code></dt>
>> +<dd>Provides timing information about the volume. The four sub elements
> since btime is omitted on Linux, maybe this would read better as 'Up to
> four sub-elements are present, where'
>
>> +<code>atime</code>,<code>btime</code>,<code>ctime</code>  and<code>mtime</code>
>> +        hold the access, birth, change and modification time of the volume, where known.
>> +        The used time format is<seconds>.<nanoseconds> since the beginning
>> +        of the epoch.  This is a readonly attribute and is ignored when creating
>> +        a volume.<span class="since">Since 0.10.0</span>
>
>> +<define name='timestamps'>
>> +<optional>
>> +<element name='timestamps'>
>> +<optional>
>> +<element name='atime'>
>> +<data type="string">
>> +<param name="pattern">[0-9]+\.[0-9]+</param>
>> +</data>
> It might be worth writing the regex to permit eliding the sub-second
> resolution, on file systems that only have 1 second resolution.  Given
> that we are repeating this<data>  four times, it might be worth defining
> it, for a shorter diff:
>
>    <element name='atime'>
>      <ref name='timestamp'/>
>    </element>
>
> ...
> <define name='timestamp'>
>    <data type='string'>
>      <param name='pattern'>[0-9]+(\.[0-9]+)?</param>
>    </data>
> </define>
>
>> +++ b/src/conf/storage_conf.c
>> @@ -1277,6 +1277,24 @@ virStorageVolTargetDefFormat(virStorageVolOptionsPtr options,
>>
>>       virBufferAddLit(buf,"</permissions>\n");
>>
>> +    virBufferAddLit(buf, "<timestamps>\n");
>> +    virBufferAsprintf(buf, "<atime>%llu.%ld</atime>\n",
>> +                      (unsigned long long) def->timestamps.atime.tv_sec,
>> +                      def->timestamps.atime.tv_nsec);
> Eliding a sub-second suffix when tv_nsec == 0 would be easier with a
> helper function:
>
> void
> virStorageVolTimestampFormat(virBufferPtr buf, const char *name,
>                               struct timespec *ts)
> {
>      if (ts->tv_nsec<  0)
>          return;
>      virBufferAsprintf(buf, "<%s>%llu", name,
>                        (unsigned long long) ts->tv_sec);
>      if (ts->tv_nsec)
>          virBufferAsprintf(buf, ".%ld", tv->tv_nsec);
>      virBufferAsprintf(buf, "</%s>\n", name);
> }
>
> called as:
>
> virStorageVolTimestampFormat(buf, "atime",&def->timestamps.atime);
> virStorageVolTimestampFormat(buf, "atime",&def->timestamps.btime);
>
> and so on.
>
> Actually, I'd list atime, mtime, ctime, btime - in that order - rather
> than trying to sort the names alphabetically (that is, match typical
> 'struct stat' ordering).
>
>
>> +typedef virStorageTimestamps *virStorageTimestampsPtr;
>> +struct _virStorageTimestamps {
>> +    struct timespec atime;
>> +    /* if btime.tv_sec == -1&&  btime.tv_nsec == -1 than
>> +     * birth time is unknown
> Doesn't gnulib guarantee that tv_nsec == -1 in isolation is sufficient
> to point out an unknown value?  That is, checking tv_sec == -1 is overhead.
>
> Looking nicer.  I'll have to ping upstream on gnulib about the last
> holdout on the relicensing of stat-time; and I'm also still waiting for
> the security fix in updated automake to hit Fedora.
>




More information about the libvir-list mailing list