VirtualBox

Changeset 32294 in vbox


Ignore:
Timestamp:
Sep 7, 2010 3:26:36 PM (14 years ago)
Author:
vboxsync
Message:

FT updates

Location:
trunk/src/VBox/VMM
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/FTM.cpp

    r32291 r32294  
    115115    pVM->ftm.s.fIsStandbyNode           = false;
    116116    pVM->ftm.s.standby.hServer          = NIL_RTTCPSERVER;
    117     pVM->ftm.s.master.hShutdownEvent    = NIL_RTSEMEVENT;
     117    pVM->ftm.s.hShutdownEvent           = NIL_RTSEMEVENT;
    118118    pVM->ftm.s.hSocket                  = NIL_RTSOCKET;
    119119
     
    153153VMMR3DECL(int) FTMR3Term(PVM pVM)
    154154{
    155     if (pVM->ftm.s.master.hShutdownEvent != NIL_RTSEMEVENT)
    156     {
    157         RTSemEventDestroy(pVM->ftm.s.master.hShutdownEvent);
    158         pVM->ftm.s.master.hShutdownEvent = NIL_RTSEMEVENT;
     155    if (pVM->ftm.s.hShutdownEvent != NIL_RTSEMEVENT)
     156    {
     157        RTSemEventDestroy(pVM->ftm.s.hShutdownEvent);
     158        pVM->ftm.s.hShutdownEvent = NIL_RTSEMEVENT;
    159159    }
    160160    if (pVM->ftm.s.hSocket != NIL_RTSOCKET)
     
    742742            return VINF_SUCCESS;
    743743        }
    744         rc = RTSemEventWait(pVM->ftm.s.master.hShutdownEvent, 1000 /* 1 second */);
     744        rc = RTSemEventWait(pVM->ftm.s.hShutdownEvent, 1000 /* 1 second */);
    745745        if (rc != VERR_TIMEOUT)
    746746            return VINF_SUCCESS;    /* told to quit */           
     
    759759    for (;;)
    760760    {
    761         rc = RTSemEventWait(pVM->ftm.s.master.hShutdownEvent, pVM->ftm.s.uInterval);
     761        rc = RTSemEventWait(pVM->ftm.s.hShutdownEvent, pVM->ftm.s.uInterval);
    762762        if (rc != VERR_TIMEOUT)
    763763            break;    /* told to quit */
     
    890890}
    891891
     892/**
     893 * Thread function which monitors the health of the master VM
     894 *
     895 * @param   Thread      The thread id.
     896 * @param   pvUser      Not used
     897 * @return  VINF_SUCCESS (ignored).
     898 *
     899 */
     900static DECLCALLBACK(int) ftmR3StandbyThread(RTTHREAD Thread, void *pvUser)
     901{
     902    PVM pVM = (PVM)pvUser;
     903
     904    for (;;)
     905    {
     906        uint64_t u64TimeNow;
     907
     908        int rc = RTSemEventWait(pVM->ftm.s.hShutdownEvent, pVM->ftm.s.uInterval);
     909        if (rc != VERR_TIMEOUT)
     910            break;    /* told to quit */
     911
     912        if (pVM->ftm.s.standby.u64LastHeartbeat)
     913        {
     914            u64TimeNow = RTTimeMilliTS();
     915
     916            if (u64TimeNow > pVM->ftm.s.standby.u64LastHeartbeat + pVM->ftm.s.uInterval * 4)
     917            {
     918                /* Timeout; prepare to fallover. */
     919                LogRel(("FTM: TIMEOUT (%RX64 vs %RX64): activate standby VM!\n", u64TimeNow, pVM->ftm.s.standby.u64LastHeartbeat + pVM->ftm.s.uInterval * 2));
     920
     921                pVM->ftm.s.fActivateStandby = true;
     922                /** todo: prevent split-brain. */
     923                break;
     924            }
     925        }
     926    }
     927
     928    return VINF_SUCCESS;
     929}
     930
    892931
    893932/**
     
    9691008            break;
    9701009
     1010        pVM->ftm.s.standby.u64LastHeartbeat = RTTimeMilliTS();
    9711011        if (!strcmp(szCmd, "mem-sync"))
    9721012        {
     
    10741114    if (pszPassword)
    10751115        pVM->ftm.s.pszPassword  = RTStrDup(pszPassword);
     1116
     1117    rc = RTSemEventCreate(&pVM->ftm.s.hShutdownEvent);
     1118    if (RT_FAILURE(rc))
     1119        return rc;
     1120
    10761121    if (fMaster)
    10771122    {
    1078         rc = RTSemEventCreate(&pVM->ftm.s.master.hShutdownEvent);
    1079         if (RT_FAILURE(rc))
    1080             return rc;
    1081 
    10821123        rc = RTThreadCreate(NULL, ftmR3MasterThread, pVM,
    10831124                            0, RTTHREADTYPE_IO /* higher than normal priority */, 0, "ftmMaster");
     
    10991140    {
    11001141        /* standby */
     1142        rc = RTThreadCreate(NULL, ftmR3StandbyThread, pVM,
     1143                            0, RTTHREADTYPE_DEFAULT, 0, "ftmStandby");
     1144        if (RT_FAILURE(rc))
     1145            return rc;
     1146
    11011147        rc = RTTcpServerCreateEx(pszAddress, uPort, &pVM->ftm.s.standby.hServer);
    11021148        if (RT_FAILURE(rc))
     
    11061152        rc = RTTcpServerListen(pVM->ftm.s.standby.hServer, ftmR3StandbyServeConnection, pVM);
    11071153        /** @todo deal with the exit code to check if we should activate this standby VM. */
     1154        if (pVM->ftm.s.fActivateStandby)
     1155        {
     1156            /** @todo fallover. */
     1157        }
    11081158
    11091159        if (pVM->ftm.s.standby.hServer)
  • trunk/src/VBox/VMM/FTMInternal.h

    r32289 r32294  
    6161    /** Set when VM save/restore should only include changed pages. */
    6262    bool                fDeltaLoadSaveActive;
    63     bool                fAlignment[5];
     63    /** Fallover to the standby VM. */
     64    bool                fActivateStandby;
     65    bool                fAlignment[4];
    6466
    6567    /** Current active socket. */
     
    8183        R3PTRTYPE(PRTTCPSERVER)    hServer;
    8284        R3PTRTYPE(AVLGCPHYSTREE)   pPhysPageTree;
     85        uint64_t                   u64LastHeartbeat;
    8386    } standby;
    8487
     88    /*
    8589    struct
    8690    {
    87         RTSEMEVENT      hShutdownEvent;
    8891    } master;
     92    */
     93
     94    RTSEMEVENT          hShutdownEvent;
    8995
    9096    /** FTM critical section.
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