VirtualBox

Changeset 41360 in vbox for trunk/src/VBox/Frontends


Ignore:
Timestamp:
May 21, 2012 11:01:31 AM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
78051
Message:

VBoxBalloonCtrl: Update, renamed "--apimon-trigger-timeout" to "--apimon-response-timeout".

Location:
trunk/src/VBox/Frontends/VBoxBalloonCtrl
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxBalloonCtrl/VBoxModAPIMonitor.cpp

    r41288 r41360  
    4040    GETOPTDEF_APIMON_ISLN_RESPONSE,
    4141    GETOPTDEF_APIMON_ISLN_TIMEOUT,
    42     GETOPTDEF_APIMON_TRIGGER_TIMEOUT
     42    GETOPTDEF_APIMON_RESP_TIMEOUT
    4343};
    4444
     
    5050    { "--apimon-isln-response",     GETOPTDEF_APIMON_ISLN_RESPONSE,  RTGETOPT_REQ_STRING },
    5151    { "--apimon-isln-timeout",      GETOPTDEF_APIMON_ISLN_TIMEOUT,   RTGETOPT_REQ_UINT32 },
    52     { "--apimon-trigger-timeout",   GETOPTDEF_APIMON_ISLN_TIMEOUT,   RTGETOPT_REQ_UINT32 }
     52    { "--apimon-resp-timeout",      GETOPTDEF_APIMON_RESP_TIMEOUT,   RTGETOPT_REQ_UINT32 }
    5353};
    5454
     
    5757    /** Unknown / unhandled response. */
    5858    APIMON_RESPONSE_NONE       = 0,
     59    /** Pauses the VM execution. */
     60    APIMON_RESPONSE_PAUSE      = 10,
    5961    /** Does a hard power off. */
    6062    APIMON_RESPONSE_POWEROFF   = 200,
     
    7173static unsigned long                g_ulAPIMonIslnTimeoutMS = 0;
    7274static Bstr                         g_strAPIMonIslnLastBeat;
    73 static unsigned long                g_ulAPIMonTriggerTimeoutMS = 0;
     75static unsigned long                g_ulAPIMonResponseTimeoutMS = 0;
    7476static uint64_t                     g_uAPIMonIslnLastBeatMS = 0;
    7577
     
    8082
    8183    int rc = VINF_SUCCESS;
    82     if (   !RTStrICmp(pszResponse, "poweroff")
    83         || !RTStrICmp(pszResponse, "powerdown"))
     84    if (!RTStrICmp(pszResponse, "none"))
     85    {
     86        *pResp = APIMON_RESPONSE_NONE;
     87    }
     88    else if (!RTStrICmp(pszResponse, "pause"))
     89    {
     90        *pResp = APIMON_RESPONSE_PAUSE;
     91    }
     92    else if (   !RTStrICmp(pszResponse, "poweroff")
     93             || !RTStrICmp(pszResponse, "powerdown"))
    8494    {
    8595        *pResp = APIMON_RESPONSE_POWEROFF;
     96    }
     97    else if (!RTStrICmp(pszResponse, "save"))
     98    {
     99        *pResp = APIMON_RESPONSE_SAVE;
    86100    }
    87101    else if (   !RTStrICmp(pszResponse, "shutdown")
     
    90104        *pResp = APIMON_RESPONSE_SHUTDOWN;
    91105    }
    92     else if (!RTStrICmp(pszResponse, "save"))
    93     {
    94         *pResp = APIMON_RESPONSE_SAVE;
    95     }
    96106    else
    97107    {
     
    105115static const char* apimonResponseToStr(APIMON_RESPONSE enmResp)
    106116{
    107     if (APIMON_RESPONSE_POWEROFF == enmResp)
     117    if (APIMON_RESPONSE_NONE == enmResp)
     118        return "none";
     119    else if (APIMON_RESPONSE_PAUSE == enmResp)
     120        return "pausing";
     121    else if (APIMON_RESPONSE_POWEROFF == enmResp)
    108122        return "powering off";
     123    else if (APIMON_RESPONSE_SAVE == enmResp)
     124        return "saving state";
    109125    else if (APIMON_RESPONSE_SHUTDOWN == enmResp)
    110126        return "shutting down";
    111     else if (APIMON_RESPONSE_SAVE == enmResp)
    112         return "saving state";
    113     else if (APIMON_RESPONSE_NONE == enmResp)
    114         return "none";
    115127
    116128    return "unknown";
     
    185197    CHECK_ERROR_RET(g_pVirtualBox, FindMachine(strUuid.raw(),
    186198                                               machine.asOutParam()), VERR_NOT_FOUND);
    187 
    188     /* Open a session for the VM. */
    189     CHECK_ERROR_RET(machine, LockMachine(g_pSession, LockType_Shared), VERR_ACCESS_DENIED);
    190 
    191199    do
    192200    {
    193 
    194         /* Get the associated console. */
    195         ComPtr<IConsole> console;
    196         CHECK_ERROR_BREAK(g_pSession, COMGETTER(Console)(console.asOutParam()));
    197 
    198201        /* Query the machine's state to avoid unnecessary IPC. */
    199202        MachineState_T machineState;
    200         CHECK_ERROR_BREAK(console, COMGETTER(State)(&machineState));
     203        CHECK_ERROR_BREAK(machine, COMGETTER(State)(&machineState));
     204
    201205        if (   machineState == MachineState_Running
    202206            || machineState == MachineState_Paused)
    203207        {
    204             ComPtr<IProgress> progress;
    205 
    206             switch (enmResp)
     208            /* Open a session for the VM. */
     209            CHECK_ERROR_BREAK(machine, LockMachine(g_pSession, LockType_Shared));
     210
     211            do
    207212            {
    208                 case APIMON_RESPONSE_POWEROFF:
    209                     CHECK_ERROR_BREAK(console, PowerDown(progress.asOutParam()));
    210                     serviceLogVerbose(("apimon: Waiting for powering off machine \"%ls\" ...\n",
    211                                        strUuid.raw()));
    212                     progress->WaitForCompletion(ulTimeout);
    213                     CHECK_PROGRESS_ERROR(progress, ("Failed to power off machine \"%ls\"",
    214                                          strUuid.raw()));
    215                     break;
    216 
    217                 case APIMON_RESPONSE_SAVE:
     213                /* Get the associated console. */
     214                ComPtr<IConsole> console;
     215                CHECK_ERROR_BREAK(g_pSession, COMGETTER(Console)(console.asOutParam()));
     216
     217                ComPtr<IProgress> progress;
     218
     219                switch (enmResp)
    218220                {
    219                     /* First pause so we don't trigger a live save which needs more time/resources. */
    220                     bool fPaused = false;
    221                     rc = console->Pause();
    222                     if (FAILED(rc))
     221                    case APIMON_RESPONSE_PAUSE:
     222                        if (machineState != MachineState_Paused)
     223                        {
     224                            serviceLogVerbose(("apimon: Pausing machine \"%ls\" ...\n",
     225                                               strUuid.raw()));
     226                            CHECK_ERROR_BREAK(console, Pause());
     227                        }
     228                        break;
     229
     230                    case APIMON_RESPONSE_POWEROFF:
     231                        serviceLogVerbose(("apimon: Powering off machine \"%ls\" ...\n",
     232                                           strUuid.raw()));
     233                        CHECK_ERROR_BREAK(console, PowerDown(progress.asOutParam()));
     234                        progress->WaitForCompletion(ulTimeout);
     235                        CHECK_PROGRESS_ERROR(progress, ("Failed to power off machine \"%ls\"",
     236                                             strUuid.raw()));
     237                        break;
     238
     239                    case APIMON_RESPONSE_SAVE:
    223240                    {
    224                         bool fError = true;
    225                         if (rc == VBOX_E_INVALID_VM_STATE)
     241                        serviceLogVerbose(("apimon: Saving state of machine \"%ls\" ...\n",
     242                                           strUuid.raw()));
     243
     244                        /* First pause so we don't trigger a live save which needs more time/resources. */
     245                        bool fPaused = false;
     246                        rc = console->Pause();
     247                        if (FAILED(rc))
    226248                        {
    227                             /* Check if we are already paused. */
    228                             CHECK_ERROR_BREAK(console, COMGETTER(State)(&machineState));
    229                             /* The error code was lost by the previous instruction. */
    230                             rc = VBOX_E_INVALID_VM_STATE;
    231                             if (machineState != MachineState_Paused)
     249                            bool fError = true;
     250                            if (rc == VBOX_E_INVALID_VM_STATE)
    232251                            {
    233                                 serviceLog("apimon: Machine \"%s\" in invalid state %d -- %s\n",
    234                                            strUuid.raw(), machineState, apimonMachineStateToName(machineState, false));
     252                                /* Check if we are already paused. */
     253                                CHECK_ERROR_BREAK(console, COMGETTER(State)(&machineState));
     254                                /* The error code was lost by the previous instruction. */
     255                                rc = VBOX_E_INVALID_VM_STATE;
     256                                if (machineState != MachineState_Paused)
     257                                {
     258                                    serviceLog("apimon: Machine \"%ls\" in invalid state %d -- %s\n",
     259                                               strUuid.raw(), machineState, apimonMachineStateToName(machineState, false));
     260                                }
     261                                else
     262                                {
     263                                    fError = false;
     264                                    fPaused = true;
     265                                }
    235266                            }
    236                             else
    237                             {
    238                                 fError = false;
    239                                 fPaused = true;
    240                             }
     267                            if (fError)
     268                                break;
    241269                        }
    242                         if (fError)
     270
     271                        CHECK_ERROR(console, SaveState(progress.asOutParam()));
     272                        if (FAILED(rc))
     273                        {
     274                            if (!fPaused)
     275                                console->Resume();
    243276                            break;
    244                     }
    245 
    246                     serviceLogVerbose(("apimon: Waiting for saving state of machine \"%ls\" ...\n",
    247                                        strUuid.raw()));
    248 
    249                     CHECK_ERROR(console, SaveState(progress.asOutParam()));
    250                     if (FAILED(rc))
    251                     {
    252                         if (!fPaused)
    253                             console->Resume();
     277                        }
     278
     279                        progress->WaitForCompletion(ulTimeout);
     280                        CHECK_PROGRESS_ERROR(progress, ("Failed to save machine state of machine \"%ls\"",
     281                                             strUuid.raw()));
     282                        if (FAILED(rc))
     283                        {
     284                            if (!fPaused)
     285                                console->Resume();
     286                        }
     287
    254288                        break;
    255289                    }
    256290
    257                     progress->WaitForCompletion(ulTimeout);
    258                     CHECK_PROGRESS_ERROR(progress, ("Failed to save machine state of machine \"%ls\"",
    259                                          strUuid.raw()));
    260                     if (FAILED(rc))
    261                     {
    262                         if (!fPaused)
    263                             console->Resume();
    264                     }
    265 
    266                     break;
     291                    case APIMON_RESPONSE_SHUTDOWN:
     292                        serviceLogVerbose(("apimon: Shutting down machine \"%ls\" ...\n", strUuid.raw()));
     293                        CHECK_ERROR_BREAK(console, PowerButton());
     294                        break;
     295
     296                    default:
     297                        AssertMsgFailed(("Response %d not implemented", enmResp));
     298                        break;
    267299                }
    268 
    269                 case APIMON_RESPONSE_SHUTDOWN:
    270                     CHECK_ERROR_BREAK(console, PowerButton());
    271                     serviceLogVerbose(("apimon: Waiting for shutdown of machine \"%ls\" ...\n",
    272                                        strUuid.raw()));
    273                     progress->WaitForCompletion(ulTimeout);
    274                     CHECK_PROGRESS_ERROR(progress, ("Failed to shutdown machine \"%ls\"",
    275                                          strUuid.raw()));
    276                     break;
    277 
    278                 default:
    279                     AssertMsgFailed(("Response %d not implemented", enmResp));
    280                     break;
    281             }
     300            } while (0);
     301
     302            /* Unlock the machine again. */
     303            g_pSession->UnlockMachine();
    282304        }
    283305        else
    284             serviceLog("apimon: Machine \"%s\" is in invalid state \"%s\" (%d) for triggering \"%s\"\n",
    285                        strUuid.raw(), apimonMachineStateToName(machineState, false), machineState,
    286                        apimonResponseToStr(enmResp));
     306            serviceLogVerbose(("apimon: Warning: Could not trigger \"%s\" (%d) for machine \"%ls\"; in state \"%s\" (%d) currently\n",
     307                               apimonResponseToStr(enmResp), enmResp, strUuid.raw(),
     308                               apimonMachineStateToName(machineState, false), machineState));
    287309    } while (0);
    288310
    289     /* Unlock the machine again. */
    290     g_pSession->UnlockMachine();
     311
    291312
    292313    return SUCCEEDED(rc) ? VINF_SUCCESS : VERR_COM_IPRT_ERROR;
     
    342363            {
    343364                int rc2 = apimonMachineControl(it->first /* Uuid */,
    344                                                &it->second /* Machine */, enmResp, g_ulAPIMonTriggerTimeoutMS);
     365                                               &it->second /* Machine */, enmResp, g_ulAPIMonResponseTimeoutMS);
    345366                if (RT_FAILURE(rc2))
    346                     serviceLog("apimon: Controlling machine \"%ls\" (action: %s) failed with rc=%Rrc",
     367                    serviceLog("apimon: Controlling machine \"%ls\" (response \"%s\") failed with rc=%Rrc",
    347368                               it->first.raw(), apimonResponseToStr(enmResp), rc);
    348369
     
    411432                break;
    412433
    413             case GETOPTDEF_APIMON_TRIGGER_TIMEOUT:
    414                 g_ulAPIMonTriggerTimeoutMS = ValueUnion.u32;
    415                 if (g_ulAPIMonTriggerTimeoutMS < 5000) /* Don't allow timeouts < 5s. */
    416                     g_ulAPIMonTriggerTimeoutMS = 5000;
     434            case GETOPTDEF_APIMON_RESP_TIMEOUT:
     435                g_ulAPIMonResponseTimeoutMS = ValueUnion.u32;
     436                if (g_ulAPIMonResponseTimeoutMS < 5000) /* Don't allow timeouts < 5s. */
     437                    g_ulAPIMonResponseTimeoutMS = 5000;
    417438                break;
    418439
     
    478499
    479500        /* Trigger timeout (in ms). */
    480         if (!g_ulAPIMonTriggerTimeoutMS) /* Not set by command line? */
     501        if (!g_ulAPIMonResponseTimeoutMS) /* Not set by command line? */
    481502        {
    482503            CHECK_ERROR_BREAK(g_pVirtualBox, GetExtraData(Bstr("Watchdog/APIMonitor/TriggerTimeout").raw(),
    483504                                                          strValue.asOutParam()));
    484505            if (!strValue.isEmpty())
    485                 g_ulAPIMonTriggerTimeoutMS = Utf8Str(strValue).toUInt32();
    486         }
    487         if (!g_ulAPIMonTriggerTimeoutMS) /* Still not set? Use a default. */
     506                g_ulAPIMonResponseTimeoutMS = Utf8Str(strValue).toUInt32();
     507        }
     508        if (!g_ulAPIMonResponseTimeoutMS) /* Still not set? Use a default. */
    488509        {
    489510            serviceLogVerbose(("apimon: API monitor trigger timeout not given, defaulting to 30s\n"));
    490511
    491512            /* Default is 30 seconds timeout. */
    492             g_ulAPIMonTriggerTimeoutMS = 30 * 1000;
    493         }
     513            g_ulAPIMonResponseTimeoutMS = 30 * 1000;
     514        }
     515
     516#ifdef DEBUG
     517        /* Groups. */
     518        serviceLogVerbose(("apimon: Handling %u groups:", g_vecAPIMonGroups.size()));
     519        mapGroupsIterConst itGroups = g_vecAPIMonGroups.begin();
     520        while (itGroups != g_vecAPIMonGroups.end())
     521        {
     522            serviceLogVerbose((" %s", itGroups->first.c_str()));
     523            itGroups++;
     524        }
     525        serviceLogVerbose(("\n"));
     526#endif
    494527
    495528    } while (0);
     
    603636    0 /* Not used */,
    604637    /* pszUsage. */
    605     " [--apimon-groups=<string>]\n"
     638    " [--apimon-groups=<string[,stringN]>]\n"
    606639    " [--apimon-isln-response=<cmd>] [--apimon-isln-timeout=<ms>]\n"
    607     " [--apimon-trigger-timeout=<ms>]",
     640    " [--apimon-resp-timeout=<ms>]",
    608641    /* pszOptions. */
    609     "--apimon-groups        Sets the VM groups for monitoring (none).\n"
    610     "--apimon-isln-response Sets the isolation response (shutdown VM).\n"
     642    "--apimon-groups        Sets the VM groups for monitoring (all),\n"
     643    "                       comma-separated list.\n"
     644    "--apimon-isln-response Sets the isolation response to one of:\n"
     645    "                       none, pause, poweroff, save, shutdown\n"
     646    "                       (none).\n"
    611647    "--apimon-isln-timeout  Sets the isolation timeout in ms (30s).\n"
    612     "--apimon-trigger-timeout\n"
    613     "                       Sets the trigger timeout in ms (30s).\n",
     648    "--apimon-resp-timeout  Sets the response timeout in ms (30s).\n",
    614649    /* methods. */
    615650    VBoxModAPIMonitorPreInit,
  • trunk/src/VBox/Frontends/VBoxBalloonCtrl/VBoxModBallooning.cpp

    r41286 r41360  
    491491{
    492492    PVBOXWATCHDOG_MACHINE pMachine = getMachine(strUuid);
    493     AssertPtrReturn(pMachine, VERR_INVALID_PARAMETER);
     493    /* Note: The machine state will change to "setting up" when machine gets deleted,
     494     *       so pMachine might be NULL here. */
     495    if (!pMachine)
     496        return VINF_SUCCESS;
    494497
    495498    return balloonMachineUpdate(strUuid, pMachine);
  • trunk/src/VBox/Frontends/VBoxBalloonCtrl/VBoxWatchdog.cpp

    r41287 r41360  
    387387            else
    388388                itGroups->second.push_back(strUuid);
    389             serviceLogVerbose(("Group \"%ls\" now has %ld machine(s)\n",
     389            serviceLogVerbose(("Group \"%s\" has now %ld machine(s)\n",
    390390                               itGroup->first.c_str(), itGroups->second.size()));
    391391            itGroup++;
Note: See TracChangeset for help on using the changeset viewer.

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