VirtualBox

Changeset 40709 in vbox


Ignore:
Timestamp:
Mar 29, 2012 2:16:21 PM (13 years ago)
Author:
vboxsync
Message:

Storage/tstVDIo: Add file access statistics and parameters for the ignore flush flag

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Storage/testcase/tstVDIo.cpp

    r40628 r40709  
    5353    /** Flag whether the file is write locked. */
    5454    bool           fWriteLock;
     55    /** Statistics: Number of reads. */
     56    unsigned       cReads;
     57    /** Statistics: Number of writes. */
     58    unsigned       cWrites;
     59    /** Statistics: Number of flushes. */
     60    unsigned       cFlushes;
     61    /** Statistics: Number of async reads. */
     62    unsigned       cAsyncReads;
     63    /** Statistics: Number of async writes. */
     64    unsigned       cAsyncWrites;
     65    /** Statistics: Number of async flushes. */
     66    unsigned       cAsyncFlushes;
    5567} VDFILE, *PVDFILE;
    5668
     
    315327static DECLCALLBACK(int) vdScriptHandlerDumpDiskInfo(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
    316328static DECLCALLBACK(int) vdScriptHandlerPrintMsg(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
     329static DECLCALLBACK(int) vdScriptHandlerShowStatistics(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
     330static DECLCALLBACK(int) vdScriptHandlerResetStatistics(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
    317331
    318332/* create action */
     
    320334{
    321335    /* pcszName    chId enmType                          fFlags */
    322     {"disk",       'd', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
    323     {"mode",       'm', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
    324     {"name",       'n', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
    325     {"type",       't', VDSCRIPTARGTYPE_STRING,          0},
    326     {"backend",    'b', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
    327     {"size",       's', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY | VDSCRIPTARGDESC_FLAG_SIZE_SUFFIX}
     336    {"disk",        'd', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
     337    {"mode",        'm', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
     338    {"name",        'n', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
     339    {"type",        't', VDSCRIPTARGTYPE_STRING,          0},
     340    {"backend",     'b', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
     341    {"size",        's', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY | VDSCRIPTARGDESC_FLAG_SIZE_SUFFIX},
     342    {"ignoreflush", 'f', VDSCRIPTARGTYPE_BOOL,            0}
    328343};
    329344
     
    332347{
    333348    /* pcszName    chId enmType                          fFlags */
    334     {"disk",       'd', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
    335     {"name",       'n', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
    336     {"backend",    'b', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
    337     {"async",      'a', VDSCRIPTARGTYPE_BOOL,            0},
    338     {"shareable",  's', VDSCRIPTARGTYPE_BOOL,            0},
    339     {"readonly",   'r', VDSCRIPTARGTYPE_BOOL,            0},
    340     {"discard",    'i', VDSCRIPTARGTYPE_BOOL,            0},
     349    {"disk",        'd', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
     350    {"name",        'n', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
     351    {"backend",     'b', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
     352    {"async",       'a', VDSCRIPTARGTYPE_BOOL,            0},
     353    {"shareable",   's', VDSCRIPTARGTYPE_BOOL,            0},
     354    {"readonly",    'r', VDSCRIPTARGTYPE_BOOL,            0},
     355    {"discard",     'i', VDSCRIPTARGTYPE_BOOL,            0},
     356    {"ignoreflush", 'f', VDSCRIPTARGTYPE_BOOL,            0},
    341357};
    342358
     
    513529    /* pcszName    chId enmType                          fFlags */
    514530    {"msg",        'm', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
     531};
     532
     533/* Show statistics */
     534const VDSCRIPTARGDESC g_aArgShowStatistics[] =
     535{
     536    /* pcszName    chId enmType                          fFlags */
     537    {"file",       'f', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
     538};
     539
     540/* Reset statistics */
     541const VDSCRIPTARGDESC g_aArgResetStatistics[] =
     542{
     543    /* pcszName    chId enmType                          fFlags */
     544    {"file",       'f', VDSCRIPTARGTYPE_STRING,          VDSCRIPTARGDESC_FLAG_MANDATORY},
    515545};
    516546
     
    540570    {"comparedisks",               g_aArgCompareDisks,                RT_ELEMENTS(g_aArgCompareDisks),               vdScriptHandlerCompareDisks},
    541571    {"dumpdiskinfo",               g_aArgDumpDiskInfo,                RT_ELEMENTS(g_aArgDumpDiskInfo),               vdScriptHandlerDumpDiskInfo},
    542     {"print",                      g_aArgPrintMsg,                    RT_ELEMENTS(g_aArgPrintMsg),                   vdScriptHandlerPrintMsg}
     572    {"print",                      g_aArgPrintMsg,                    RT_ELEMENTS(g_aArgPrintMsg),                   vdScriptHandlerPrintMsg},
     573    {"showstatistics",             g_aArgShowStatistics,              RT_ELEMENTS(g_aArgShowStatistics),             vdScriptHandlerShowStatistics},
     574    {"resetstatistics",            g_aArgResetStatistics,             RT_ELEMENTS(g_aArgResetStatistics),            vdScriptHandlerResetStatistics}
    543575};
    544576
     
    584616    bool fBase = false;
    585617    bool fDynamic = true;
     618    bool fIgnoreFlush = false;
    586619
    587620    for (unsigned i = 0; i < cScriptArgs; i++)
     
    635668                break;
    636669            }
     670            case 'f':
     671            {
     672                fIgnoreFlush = true;
     673                break;
     674            }
    637675            default:
    638676                AssertMsgFailed(("Invalid argument given!\n"));
     
    648686        if (pDisk)
    649687        {
     688            unsigned fOpenFlags = VD_OPEN_FLAGS_ASYNC_IO;
    650689            unsigned fImageFlags = VD_IMAGE_FLAGS_NONE;
    651690
    652691            if (!fDynamic)
    653692                fImageFlags |= VD_IMAGE_FLAGS_FIXED;
     693
     694            if (fIgnoreFlush)
     695                fOpenFlags |= VD_OPEN_FLAGS_IGNORE_FLUSH;
    654696
    655697            if (fBase)
    656698                rc = VDCreateBase(pDisk->pVD, pcszBackend, pcszImage, cbSize, fImageFlags, NULL,
    657699                                  &pDisk->PhysGeom, &pDisk->LogicalGeom,
    658                                   NULL, VD_OPEN_FLAGS_ASYNC_IO, pGlob->pInterfacesImages, NULL);
     700                                  NULL, fOpenFlags, pGlob->pInterfacesImages, NULL);
    659701            else
    660702                rc = VDCreateDiff(pDisk->pVD, pcszBackend, pcszImage, fImageFlags, NULL, NULL, NULL, VD_OPEN_FLAGS_ASYNC_IO,
     
    679721    bool fAsyncIo  = true;
    680722    bool fDiscard  = false;
     723    bool fIgnoreFlush = false;
    681724
    682725    for (unsigned i = 0; i < cScriptArgs; i++)
     
    742785            if (fDiscard)
    743786                fOpenFlags |= VD_OPEN_FLAGS_DISCARD;
     787            if (fIgnoreFlush)
     788                fOpenFlags |= VD_OPEN_FLAGS_IGNORE_FLUSH;
    744789
    745790            rc = VDOpen(pDisk->pVD, pcszBackend, pcszImage, fOpenFlags, pGlob->pInterfacesImages);
     
    24122457}
    24132458
     2459static DECLCALLBACK(int) vdScriptHandlerShowStatistics(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
     2460{
     2461    int rc = VINF_SUCCESS;
     2462    const char *pcszFile = NULL;
     2463
     2464    for (unsigned i = 0; i < cScriptArgs; i++)
     2465    {
     2466        switch (paScriptArgs[i].chId)
     2467        {
     2468            case 'f':
     2469            {
     2470                pcszFile = paScriptArgs[i].u.pcszString;
     2471                break;
     2472            }
     2473            default:
     2474                AssertMsgFailed(("Invalid argument given!\n"));
     2475        }
     2476    }
     2477
     2478    /* Check for the file. */
     2479    PVDFILE pIt = NULL;
     2480    bool fFound = false;
     2481    RTListForEach(&pGlob->ListFiles, pIt, VDFILE, Node)
     2482    {
     2483        if (!RTStrCmp(pIt->pszName, pcszFile))
     2484        {
     2485            fFound = true;
     2486            break;
     2487        }
     2488    }
     2489
     2490    if (fFound)
     2491    {
     2492        RTPrintf("Statistics %s: \n"
     2493                 "               sync  reads=%u writes=%u flushes=%u\n"
     2494                 "               async reads=%u writes=%u flushes=%u\n",
     2495                 pcszFile,
     2496                 pIt->cReads, pIt->cWrites, pIt->cFlushes,
     2497                 pIt->cAsyncReads, pIt->cAsyncWrites, pIt->cAsyncFlushes);
     2498    }
     2499    else
     2500        rc = VERR_FILE_NOT_FOUND;
     2501
     2502    return rc;
     2503}
     2504
     2505static DECLCALLBACK(int) vdScriptHandlerResetStatistics(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
     2506{
     2507    int rc = VINF_SUCCESS;
     2508    const char *pcszFile = NULL;
     2509
     2510    for (unsigned i = 0; i < cScriptArgs; i++)
     2511    {
     2512        switch (paScriptArgs[i].chId)
     2513        {
     2514            case 'f':
     2515            {
     2516                pcszFile = paScriptArgs[i].u.pcszString;
     2517                break;
     2518            }
     2519            default:
     2520                AssertMsgFailed(("Invalid argument given!\n"));
     2521        }
     2522    }
     2523
     2524    /* Check for the file. */
     2525    PVDFILE pIt = NULL;
     2526    bool fFound = false;
     2527    RTListForEach(&pGlob->ListFiles, pIt, VDFILE, Node)
     2528    {
     2529        if (!RTStrCmp(pIt->pszName, pcszFile))
     2530        {
     2531            fFound = true;
     2532            break;
     2533        }
     2534    }
     2535
     2536    if (fFound)
     2537    {
     2538        pIt->cReads   = 0;
     2539        pIt->cWrites  = 0;
     2540        pIt->cFlushes = 0;
     2541
     2542        pIt->cAsyncReads   = 0;
     2543        pIt->cAsyncWrites  = 0;
     2544        pIt->cAsyncFlushes = 0;
     2545    }
     2546    else
     2547        rc = VERR_FILE_NOT_FOUND;
     2548
     2549    return rc;
     2550}
     2551
    24142552static DECLCALLBACK(int) tstVDIoFileOpen(void *pvUser, const char *pszLocation,
    24152553                                         uint32_t fOpen,
     
    26242762    rc = VDMemDiskWrite(pIoStorage->pFile->pMemDisk, uOffset, cbBuffer, &SgBuf);
    26252763    if (RT_SUCCESS(rc) && pcbWritten)
     2764    {
     2765        pIoStorage->pFile->cWrites++;
    26262766        *pcbWritten = cbBuffer;
     2767    }
    26272768
    26282769    return rc;
     
    26432784    rc = VDMemDiskRead(pIoStorage->pFile->pMemDisk, uOffset, cbBuffer, &SgBuf);
    26442785    if (RT_SUCCESS(rc) && pcbRead)
     2786    {
     2787        pIoStorage->pFile->cReads++;
    26452788        *pcbRead = cbBuffer;
     2789    }
    26462790
    26472791    return rc;
     
    26502794static DECLCALLBACK(int) tstVDIoFileFlushSync(void *pvUser, void *pStorage)
    26512795{
    2652     /* nothing to do. */
     2796    PVDSTORAGE pIoStorage = (PVDSTORAGE)pStorage;
     2797    pIoStorage->pFile->cFlushes++;
    26532798    return VINF_SUCCESS;
    26542799}
     
    26662811                                cbRead, paSegments, cSegments, pIoStorage->pfnComplete, pvCompletion);
    26672812    if (RT_SUCCESS(rc))
     2813    {
     2814        pIoStorage->pFile->cAsyncReads++;
    26682815        rc = VERR_VD_ASYNC_IO_IN_PROGRESS;
     2816    }
    26692817
    26702818    return rc;
     
    26832831                                cbWrite, paSegments, cSegments, pIoStorage->pfnComplete, pvCompletion);
    26842832    if (RT_SUCCESS(rc))
     2833    {
     2834        pIoStorage->pFile->cAsyncWrites++;
    26852835        rc = VERR_VD_ASYNC_IO_IN_PROGRESS;
     2836    }
    26862837
    26872838    return rc;
     
    26982849                                0, NULL, 0, pIoStorage->pfnComplete, pvCompletion);
    26992850    if (RT_SUCCESS(rc))
     2851    {
     2852        pIoStorage->pFile->cAsyncFlushes++;
    27002853        rc = VERR_VD_ASYNC_IO_IN_PROGRESS;
     2854    }
    27012855
    27022856    return rc;
     
    28262980
    28272981                Assert(idx != -1);
    2828                 pIoReq->off = idx * pIoTest->cbBlkIo;
     2982                pIoReq->off = (uint64_t)idx * pIoTest->cbBlkIo;
    28292983                pIoTest->u.Rnd.cBlocksLeft--;
    28302984                if (!pIoTest->u.Rnd.cBlocksLeft)
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