[libvirt] [PATCH] remote_daemon: Log host boot time
Michal Prívozník
mprivozn at redhat.com
Thu Dec 19 11:25:39 UTC 2019
On 12/18/19 11:07 PM, Cole Robinson wrote:
> On 12/17/19 8:25 AM, Michal Privoznik wrote:
>> This is not strictly needed, but it makes sure we initialize the
>> @bootTime global variable. Thing is, in order to validate XATTRs
>> and prune those set in some previous runs of the host, a
>> timestamp is recorded in XATTRs. The host boot time was unique
>> enough so it was chosen as the timestamp value. And to avoid
>> querying and parsing /proc/uptime every time, the query function
>> does that only once and stores the boot time in a global
>> variable. However, the only time the query function is called is
>> in a child process that does lock files and changes seclabels. So
>> effectively, we are doing exactly what we wanted to prevent from
>> happening.
>>
>> The fix is simple, call the query function whilst the daemon is
>> initializing.
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>>
>> Since this will be used by security driver only, I was tempted to put
>> this somewhere under src/security/, but especially because of split
>> daemon I didn't. Placing this into remote_daemon.c makes sure all
>> sub-daemons will have the variable initialized and won't suffer the
>> problem.
>>
>> src/remote/remote_daemon.c | 8 ++++++++
>> 1 file changed, 8 insertions(+)
>>
>> diff --git a/src/remote/remote_daemon.c b/src/remote/remote_daemon.c
>> index b400b1dd10..5debb6ce97 100644
>> --- a/src/remote/remote_daemon.c
>> +++ b/src/remote/remote_daemon.c
>> @@ -57,6 +57,7 @@
>> #include "virgettext.h"
>> #include "util/virnetdevopenvswitch.h"
>> #include "virsystemd.h"
>> +#include "virhostuptime.h"
>>
>> #include "driver.h"
>>
>> @@ -1020,6 +1021,7 @@ int main(int argc, char **argv) {
>> bool implicit_conf = false;
>> char *run_dir = NULL;
>> mode_t old_umask;
>> + unsigned long long bootTime;
>>
>> struct option opts[] = {
>> { "verbose", no_argument, &verbose, 'v'},
>> @@ -1151,6 +1153,12 @@ int main(int argc, char **argv) {
>> exit(EXIT_FAILURE);
>> }
>>
>> + if (virHostGetBootTime(&bootTime) < 0) {
>> + VIR_DEBUG("Unable to get host boot time");
>> + } else {
>> + VIR_DEBUG("host boot time: %lld", bootTime);
>> + }
>> +
>
> Please add a comment that this is initializing some global state that we
> need elsewhere, because otherwise it won't be obvious why this is here.
> With that:
>
> Reviewed-by: Cole Robinson <crobinso at redhat.com>
>
> Better IMO would be have an explicit virHostBootTimeInit function, and
> any usage of GetBootTime would fail if the init hasn't been called yet.
> It would make this case more self descriptive, and make sure any new
> users aren't doing it wrong
Agreed, patches proposed here:
https://www.redhat.com/archives/libvir-list/2019-December/msg01244.html
Michal
More information about the libvir-list
mailing list