VirtualBox

Changeset 21787 in vbox


Ignore:
Timestamp:
Jul 24, 2009 12:51:44 PM (16 years ago)
Author:
vboxsync
Message:

SSMR3ValidateFile/ConsoleImpl.cpp: Don't waste lots of time checksumming the file before creating the VM and calling VMMR3Load.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/ssm.h

    r21217 r21787  
    436436VMMR3DECL(int) SSMR3Save(PVM pVM, const char *pszFilename, SSMAFTER enmAfter, PFNVMPROGRESS pfnProgress, void *pvUser);
    437437VMMR3DECL(int) SSMR3Load(PVM pVM, const char *pszFilename, SSMAFTER enmAfter, PFNVMPROGRESS pfnProgress, void *pvUser);
    438 VMMR3DECL(int) SSMR3ValidateFile(const char *pszFilename);
     438VMMR3DECL(int) SSMR3ValidateFile(const char *pszFilename, bool fChecksumIt);
    439439VMMR3DECL(int) SSMR3Open(const char *pszFilename, unsigned fFlags, PSSMHANDLE *ppSSM);
    440440VMMR3DECL(int) SSMR3Close(PSSMHANDLE pSSM);
  • trunk/src/VBox/Main/ConsoleImpl.cpp

    r21779 r21787  
    47284728
    47294729    /*
    4730      * Saved VMs will have to prove that their saved states are kosher.
     4730     * Saved VMs will have to prove that their saved states seem kosher.
    47314731     */
    47324732    if (mMachineState == MachineState_Saved)
     
    47354735        CheckComRCReturnRC (rc);
    47364736        ComAssertRet (!!savedStateFile, E_FAIL);
    4737         int vrc = SSMR3ValidateFile (Utf8Str (savedStateFile));
     4737        int vrc = SSMR3ValidateFile (Utf8Str (savedStateFile), false /* fChecksumIt */);
    47384738        if (VBOX_FAILURE (vrc))
    47394739            return setError (VBOX_E_FILE_ERROR,
  • trunk/src/VBox/VMM/SSM.cpp

    r21773 r21787  
    375375static int                  ssmR3CalcChecksum(RTFILE File, uint64_t cbFile, uint32_t *pu32CRC);
    376376static void                 ssmR3Progress(PSSMHANDLE pSSM, uint64_t cbAdvance);
    377 static int                  ssmR3Validate(RTFILE File, PSSMFILEHDR pHdr, size_t *pcbFileHdr);
     377static int                  ssmR3ValidateFile(RTFILE File, bool fChecksumIt, PSSMFILEHDR pHdr, size_t *pcbFileHdr);
    378378static PSSMUNIT             ssmR3Find(PVM pVM, const char *pszName, uint32_t u32Instance);
    379379static int                  ssmR3WriteFinish(PSSMHANDLE pSSM);
     
    14251425 * @param   File        File to validate.
    14261426 *                      The file position is undefined on return.
     1427 * @param   fChecksumIt Whether to checksum the file or not.
    14271428 * @param   pHdr        Where to store the file header.
    14281429 * @param   pcbFileHdr  Where to store the file header size.
    14291430 */
    1430 static int ssmR3Validate(RTFILE File, PSSMFILEHDR pHdr, size_t *pcbFileHdr)
     1431static int ssmR3ValidateFile(RTFILE File, bool fChecksumIt, PSSMFILEHDR pHdr, size_t *pcbFileHdr)
    14311432{
    14321433    /*
     
    15521553
    15531554    /*
    1554      * Verify the checksum.
    1555      */
    1556     rc = RTFileSeek(File, offCrc32, RTFILE_SEEK_BEGIN, NULL);
    1557     if (RT_FAILURE(rc))
    1558     {
    1559         Log(("SSM: Failed to seek to crc start. rc=%Rrc\n", rc));
    1560         return rc;
    1561     }
    1562     uint32_t u32CRC;
    1563     rc = ssmR3CalcChecksum(File, pHdr->cbFile - *pcbFileHdr, &u32CRC);
    1564     if (RT_FAILURE(rc))
    1565         return rc;
    1566     if (u32CRC != pHdr->u32CRC)
    1567     {
    1568         Log(("SSM: Invalid CRC! Calculated %#08x, in header %#08x\n", u32CRC, pHdr->u32CRC));
    1569         return VERR_SSM_INTEGRITY_CRC;
     1555     * Verify the checksum if requested.
     1556     */
     1557    if (fChecksumIt)
     1558    {
     1559        rc = RTFileSeek(File, offCrc32, RTFILE_SEEK_BEGIN, NULL);
     1560        if (RT_FAILURE(rc))
     1561        {
     1562            Log(("SSM: Failed to seek to crc start. rc=%Rrc\n", rc));
     1563            return rc;
     1564        }
     1565        uint32_t u32CRC;
     1566        rc = ssmR3CalcChecksum(File, pHdr->cbFile - *pcbFileHdr, &u32CRC);
     1567        if (RT_FAILURE(rc))
     1568            return rc;
     1569        if (u32CRC != pHdr->u32CRC)
     1570        {
     1571            Log(("SSM: Invalid CRC! Calculated %#08x, in header %#08x\n", u32CRC, pHdr->u32CRC));
     1572            return VERR_SSM_INTEGRITY_CRC;
     1573        }
    15701574    }
    15711575
     
    16791683     */
    16801684    SSMFILEHDR Hdr;
    1681     rc = ssmR3Validate(Handle.File, &Hdr, &Handle.cbFileHdr);
     1685    rc = ssmR3ValidateFile(Handle.File, true /* fChecksumIt */, &Hdr, &Handle.cbFileHdr);
    16821686    if (RT_SUCCESS(rc))
    16831687    {
     
    20522056 *
    20532057 * @param   pszFilename     The path to the file to validate.
     2058 * @param   fChecksumIt     Whether to checksum the file or not.
    20542059 *
    20552060 * @thread  Any.
    20562061 */
    2057 VMMR3DECL(int) SSMR3ValidateFile(const char *pszFilename)
    2058 {
    2059     LogFlow(("SSMR3ValidateFile: pszFilename=%p:{%s}\n", pszFilename, pszFilename));
     2062VMMR3DECL(int) SSMR3ValidateFile(const char *pszFilename, bool fChecksumIt)
     2063{
     2064    LogFlow(("SSMR3ValidateFile: pszFilename=%p:{%s} fChecksumIt=%RTbool\n", pszFilename, pszFilename, fChecksumIt));
    20602065
    20612066    /*
     
    20682073        size_t cbFileHdr;
    20692074        SSMFILEHDR Hdr;
    2070         rc = ssmR3Validate(File, &Hdr, &cbFileHdr);
     2075        rc = ssmR3ValidateFile(File, fChecksumIt, &Hdr, &cbFileHdr);
    20712076        RTFileClose(File);
    20722077    }
     
    21132118        SSMFILEHDR Hdr;
    21142119        size_t cbFileHdr;
    2115         rc = ssmR3Validate(pSSM->File, &Hdr, &cbFileHdr);
     2120        rc = ssmR3ValidateFile(pSSM->File, true /* fChecksumIt */, &Hdr, &cbFileHdr);
    21162121        if (RT_SUCCESS(rc))
    21172122        {
  • trunk/src/VBox/VMM/testcase/tstSSM.cpp

    r20864 r21787  
    154154
    155155    uint64_t u64Elapsed = RTTimeNanoTS() - u64Start;
    156     RTPrintf("tstSSM: Saved 1st item in %RI64 ns\n", u64Elapsed);
     156    RTPrintf("tstSSM: Saved 1st item in %'RI64 ns\n", u64Elapsed);
    157157    return 0;
    158158}
     
    302302
    303303    uint64_t u64Elapsed = RTTimeNanoTS() - u64Start;
    304     RTPrintf("tstSSM: Saved 2nd item in %RI64 ns\n", u64Elapsed);
     304    RTPrintf("tstSSM: Saved 2nd item in %'RI64 ns\n", u64Elapsed);
    305305    return 0;
    306306}
     
    408408
    409409    uint64_t u64Elapsed = RTTimeNanoTS() - u64Start;
    410     RTPrintf("tstSSM: Saved 3rd item in %RI64 ns\n", u64Elapsed);
     410    RTPrintf("tstSSM: Saved 3rd item in %'RI64 ns\n", u64Elapsed);
    411411    return 0;
    412412}
     
    506506
    507507    uint64_t u64Elapsed = RTTimeNanoTS() - u64Start;
    508     RTPrintf("tstSSM: Saved 4th item in %RI64 ns\n", u64Elapsed);
     508    RTPrintf("tstSSM: Saved 4th item in %'RI64 ns\n", u64Elapsed);
    509509    return 0;
    510510}
     
    698698    }
    699699    uint64_t u64Elapsed = RTTimeNanoTS() - u64Start;
    700     RTPrintf("tstSSM: Saved in %RI64 ns\n", u64Elapsed);
     700    RTPrintf("tstSSM: Saved in %'RI64 ns\n", u64Elapsed);
    701701
    702702    RTFSOBJINFO Info;
     
    720720    }
    721721    u64Elapsed = RTTimeNanoTS() - u64Start;
    722     RTPrintf("tstSSM: Loaded in %RI64 ns\n", u64Elapsed);
     722    RTPrintf("tstSSM: Loaded in %'RI64 ns\n", u64Elapsed);
    723723
    724724    /*
     
    726726     */
    727727    u64Start = RTTimeNanoTS();
    728     rc = SSMR3ValidateFile(pszFilename);
     728    rc = SSMR3ValidateFile(pszFilename, false /* fChecksumIt*/ );
    729729    if (RT_FAILURE(rc))
    730730    {
     
    733733    }
    734734    u64Elapsed = RTTimeNanoTS() - u64Start;
    735     RTPrintf("tstSSM: Validated in %RI64 ns\n", u64Elapsed);
     735    RTPrintf("tstSSM: Validated without checksumming in %'RI64 ns\n", u64Elapsed);
     736
     737    u64Start = RTTimeNanoTS();
     738    rc = SSMR3ValidateFile(pszFilename, true /* fChecksumIt */);
     739    if (RT_FAILURE(rc))
     740    {
     741        RTPrintf("SSMR3ValidateFile #1 -> %Rrc\n", rc);
     742        return 1;
     743    }
     744    u64Elapsed = RTTimeNanoTS() - u64Start;
     745    RTPrintf("tstSSM: Validated and checksummed in %'RI64 ns\n", u64Elapsed);
    736746
    737747    /*
     
    747757    }
    748758    u64Elapsed = RTTimeNanoTS() - u64Start;
    749     RTPrintf("tstSSM: Opened in %RI64 ns\n", u64Elapsed);
     759    RTPrintf("tstSSM: Opened in %'RI64 ns\n", u64Elapsed);
    750760
    751761    /* negative */
     
    758768    }
    759769    u64Elapsed = RTTimeNanoTS() - u64Start;
    760     RTPrintf("tstSSM: Failed seek in %RI64 ns\n", u64Elapsed);
     770    RTPrintf("tstSSM: Failed seek in %'RI64 ns\n", u64Elapsed);
    761771
    762772    /* 2nd unit */
     
    782792    }
    783793    u64Elapsed = RTTimeNanoTS() - u64Start;
    784     RTPrintf("tstSSM: Loaded 2nd item in %RI64 ns\n", u64Elapsed);
     794    RTPrintf("tstSSM: Loaded 2nd item in %'RI64 ns\n", u64Elapsed);
    785795
    786796    /* 1st unit */
     
    800810    }
    801811    u64Elapsed = RTTimeNanoTS() - u64Start;
    802     RTPrintf("tstSSM: Loaded 1st item in %RI64 ns\n", u64Elapsed);
     812    RTPrintf("tstSSM: Loaded 1st item in %'RI64 ns\n", u64Elapsed);
    803813
    804814    /* 3st unit */
     
    818828    }
    819829    u64Elapsed = RTTimeNanoTS() - u64Start;
    820     RTPrintf("tstSSM: Loaded 3rd item in %RI64 ns\n", u64Elapsed);
     830    RTPrintf("tstSSM: Loaded 3rd item in %'RI64 ns\n", u64Elapsed);
    821831
    822832    /* close */
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