[systemd-devel] [PATCH] Add timesync-wait tool
Lukasz Stelmach
stlman at poczta.fm
Wed Oct 29 09:50:07 PDT 2014
On 27.10.2014 15:12, Lennart Poettering wrote:
> On Fri, 24.10.14 23:13, Lukasz Stelmach (stlman at poczta.fm) wrote:
>
>> On 24.10.2014 00:28, Lennart Poettering wrote:
>>> On Thu, 23.10.14 21:24, Łukasz Stelmach (stlman at poczta.fm) wrote:
>>>
>>>> +int main(int argc, char *argv[]) {
>>>> + struct timex tbuf;
>>>> + int r;
>>>> +
>>>> + memset(&tbuf, 0, sizeof(tbuf));
>>>
>>> Please initialize this with "= {}" while declaring, instead of using
>>> memset() here.
>>>
>>>> + r = adjtimex(&tbuf);
>>>> +
>>>> + while (r != TIME_OK) {
>>>
>>> This check looks wrong. Should check for tbuf.status & STA_UNSYNC, no?
>>>
>>> Also, we already have the ntp_synced() call for doing this.
>>
>> Indeed. I can replace most of the code here with ntp_synced() leaving an
>> "if" with a break and the sleep();
>>
>>>> + sleep(1);
>>>> + /* Unfortunately there seem to be no other way than
>>>> + polling to get this information. */
>>>> + memset(&tbuf, 0, sizeof(tbuf));
>>>
>>> In this case, use zero(), it's nicer, simpler and less error prone.
>>>
>>>> + r = adjtimex(&tbuf);
>>>> + }
>>>
>>> Implementing this with a sleep loop is really ugly. Can't we at least
>>> calculate the expected sync time from the data returned by adjtimex()?
>>
>> I don't know how to do it exactly (yet). But my guess is that when the
>> system starts the information you refer are not good enough to predict
>> anything?
>
> Hmm, thinking about this some more: is STA_UNSYNC actually really what
> we should be looking for?
I can image users who would.
> I mean, what is the tool supposed to be
> waiting on: that the time is set as accurately as possible (in that
> case watching STA_UNSYNC sounds good, plus waiting for
> TFD_CANCEL_ON_SET for big jumps and guessing sleep times from
> adjtimex()'s return values for smaller jumps)?
There is no point in "guessing". Clearing STA_UNSYNC takes one
timesynced cycle (32s, see below).
> Or that the time is set
> accurately enough for adjtimex() to be used for the remaining accuracy
> (In that case, we'd actually have to make timesyncd report this
> information to us, maybe using a flag file to watch via inotify)?
This is probably what satisfies most users.
> Or
> that the time set accurately enough to be monotonic, but not more (in
> that case just ordering after systemd-timesyncd.service should be
> enough, no need for any other tool)?
timesyncd sends READY=1 quite early. I think it is before it tries to
contact time servers.
> Of these three options, I think the first one is not necessarily a
> good idea, since adjtimex() is really about making time corrections
> smooth and hence slow. Making this slow, and trying to wait for it is
> kinda contradictory, no?
Not really, that is it isn't that slow. I measured it. First I set the
current time off by less than a minute then waited
date $(date +%m%d%H%M%Y) && sleep 2 && time ./systemd-timesync-wait
and it always took one timesyncd cycle (32 seconds) to clear STA_UNSYNC.
How about waiting for either a flag-file which timesyncd creates after
a few seconds timesynced is started or, if a user chooses so, for the
"real" synchronisation?
> The third one is not a good idea either, since we already have
> functionality covering that.
>
> But if the second option is the relevant one, then I figure neither
> adjtimex() nor TFP_CANCEL_ON_SET will be useful to us, and instead we
> need to teach systemd-timesyncd some flag file stuff.
Yes, like "hey I've already received the time from an NTP server and fed
it to the kernel".
Create /run/systemd/timesyncd/synchronised here:
http://cgit.freedesktop.org/systemd/systemd/tree/src/timesync/timesyncd-manager.c?id=v217#n389
and unlink it here
http://cgit.freedesktop.org/systemd/systemd/tree/src/timesync/timesyncd-manager.c?id=v217#n293
and of upon exit. An erroneous one too.
>>> The same way as network-wait-online has a timeout this tool should
>>> probably have one too.
>>
>> If the timeout is reached the tool exits with a non-zero code. Right?
>> That makes sense. Is three minutes OK?
>
> I'd use the same default timeout as for systemd-network-wait-online,
> for whatever that is.
Are you sure there is a timeout? The service type is oneshot (timeout is
disabled according to systemd.service(5)) without any Timeout* set. Two
calls to sd_event_exit() in the code depend manager_all_configured() and
no sign of any timer.
--
Było mi bardzo miło. Twoje oczy lubią mnie
>Łukasz< i to mnie zgubi (c)SNL
REKLAMA: http://ars-fabrica.eu/ sklep z rękodziełem
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 538 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/systemd-devel/attachments/20141029/2460890e/attachment.sig>
More information about the systemd-devel
mailing list