VirtualBox

Changeset 69953 in vbox


Ignore:
Timestamp:
Dec 6, 2017 11:30:48 AM (7 years ago)
Author:
vboxsync
Message:

VBoxService/TimeSync: Log radical host time change; reduce latency.

  • Don't query the session ID after the time, that adds latency. Get it first, compare it afterwards.
  • Compare the host time to the last host time we got, log it if the difference is more than 30 min.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceTimeSync.cpp

    r69500 r69953  
    503503
    504504    /*
     505     * Initialize the last host time to prevent log message.
     506     */
     507    RTTIMESPEC HostLast;
     508    if (RT_FAILURE(VbglR3GetHostTime(&HostLast)))
     509        RTTimeSpecSetNano(&HostLast, 0);
     510
     511    /*
    505512     * The Work Loop.
    506513     */
     
    513520        do
    514521        {
    515             /* query it. */
    516             RTTIMESPEC GuestNow0, GuestNow, HostNow;
     522            /*
     523             * Query the session id (first to keep lantency low) and the time.
     524             */
     525            uint64_t idNewSession = g_idTimeSyncSession;
     526            if (g_fTimeSyncSetOnRestore)
     527                VbglR3GetSessionId(&idNewSession);
     528
     529            RTTIMESPEC GuestNow0;
    517530            RTTimeNow(&GuestNow0);
     531
     532            RTTIMESPEC HostNow;
    518533            int rc2 = VbglR3GetHostTime(&HostNow);
    519534            if (RT_FAILURE(rc2))
     
    523538                break;
    524539            }
     540
     541            RTTIMESPEC GuestNow;
    525542            RTTimeNow(&GuestNow);
    526543
    527             /* calc latency and check if it's ok. */
     544            /*
     545             * Calc latency and check if it's ok.
     546             */
    528547            RTTIMESPEC GuestElapsed = GuestNow;
    529548            RTTimeSpecSub(&GuestElapsed, &GuestNow0);
     
    531550            {
    532551                /*
    533                  * Set the time once after we were restored.
    534                  * (Of course only if the drift is bigger than MinAdjust)
     552                 * If we were just restored, set the adjustment threshold to zero to force a resync.
    535553                 */
    536554                uint32_t TimeSyncSetThreshold = g_TimeSyncSetThreshold;
    537                 if (g_fTimeSyncSetOnRestore)
     555                if (   g_fTimeSyncSetOnRestore
     556                    && idNewSession != g_idTimeSyncSession)
    538557                {
    539                     uint64_t idNewSession = g_idTimeSyncSession;
    540                     VbglR3GetSessionId(&idNewSession);
    541                     if (idNewSession != g_idTimeSyncSession)
    542                     {
    543                         VGSvcVerbose(3, "vgsvcTimeSyncWorker: The VM session ID changed, forcing resync.\n");
    544                         TimeSyncSetThreshold = 0;
    545                         g_idTimeSyncSession  = idNewSession;
    546                     }
     558                    VGSvcVerbose(3, "vgsvcTimeSyncWorker: The VM session ID changed, forcing resync.\n");
     559                    g_idTimeSyncSession  = idNewSession;
     560                    TimeSyncSetThreshold = 0;
    547561                }
    548562
     
    578592                     * too big, fall back on just setting the time.
    579593                     */
    580 
    581                     if (    AbsDriftMilli > TimeSyncSetThreshold
    582                         ||  g_fTimeSyncSetNext
    583                         ||  !vgsvcTimeSyncAdjust(&Drift))
     594                    if (   AbsDriftMilli > TimeSyncSetThreshold
     595                        || g_fTimeSyncSetNext
     596                        || !vgsvcTimeSyncAdjust(&Drift))
    584597                    {
    585598                        vgsvcTimeSyncCancelAdjust();
    586599                        vgsvcTimeSyncSet(&Drift);
    587600                    }
     601
     602                    /*
     603                     * Log radical host time changes.
     604                     */
     605                    int64_t cNsHostDelta = RTTimeSpecGetNano(&HostNow) - RTTimeSpecGetNano(&HostLast);
     606                    if ((uint64_t)RT_ABS(cNsHostDelta) > RT_NS_1HOUR / 2)
     607                        VGSvcVerbose(0, "vgsvcTimeSyncWorker: Radical host time change: %'RI64ns (HostNow=%RDtimespec HostLast=%RDtimespec)\n",
     608                                     cNsHostDelta, &HostNow, &HostLast);
    588609                }
    589610                else
    590611                    vgsvcTimeSyncCancelAdjust();
     612                HostLast = HostNow;
    591613                break;
    592614            }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette