Changeset 72337 in vbox
- Timestamp:
- May 25, 2018 10:00:07 AM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 122793
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Storage/testcase/tstVDIo.cpp
r70777 r72337 34 34 #include <iprt/test.h> 35 35 #include <iprt/system.h> 36 37 #ifdef VBOX_TSTVDIO_WITH_LOG_REPLAY 38 # include <VBox/vddbg.h> 39 #endif 36 #include <iprt/tracelog.h> 40 37 41 38 #include "VDMemDisk.h" … … 264 261 static DECLCALLBACK(int) vdScriptHandlerSetFileBackend(PVDSCRIPTARG paScriptArgs, void *pvUser); 265 262 static DECLCALLBACK(int) vdScriptHandlerLoadPlugin(PVDSCRIPTARG paScriptArgs, void *pvUser); 266 267 #ifdef VBOX_TSTVDIO_WITH_LOG_REPLAY268 263 static DECLCALLBACK(int) vdScriptHandlerIoLogReplay(PVDSCRIPTARG paScriptArgs, void *pvUser); 269 #endif270 264 271 265 /* create action */ … … 370 364 }; 371 365 372 #ifdef VBOX_TSTVDIO_WITH_LOG_REPLAY 373 /* print file size action */ 366 /* I/O log replay action */ 374 367 const VDSCRIPTTYPE g_aArgIoLogReplay[] = 375 368 { … … 377 370 VDSCRIPTTYPE_STRING /* iolog */ 378 371 }; 379 #endif380 372 381 373 /* I/O RNG create action */ … … 493 485 {"close", VDSCRIPTTYPE_VOID, g_aArgClose, RT_ELEMENTS(g_aArgClose), vdScriptHandlerClose}, 494 486 {"printfilesize", VDSCRIPTTYPE_VOID, g_aArgPrintFileSize, RT_ELEMENTS(g_aArgPrintFileSize), vdScriptHandlerPrintFileSize}, 495 #ifdef VBOX_TSTVDIO_WITH_LOG_REPLAY496 487 {"ioreplay", VDSCRIPTTYPE_VOID, g_aArgIoLogReplay, RT_ELEMENTS(g_aArgIoLogReplay), vdScriptHandlerIoLogReplay}, 497 #endif498 488 {"merge", VDSCRIPTTYPE_VOID, g_aArgMerge, RT_ELEMENTS(g_aArgMerge), vdScriptHandlerMerge}, 499 489 {"compact", VDSCRIPTTYPE_VOID, g_aArgCompact, RT_ELEMENTS(g_aArgCompact), vdScriptHandlerCompact}, … … 1408 1398 1409 1399 1410 #ifdef VBOX_TSTVDIO_WITH_LOG_REPLAY1411 1400 static DECLCALLBACK(int) vdScriptHandlerIoLogReplay(PVDSCRIPTARG paScriptArgs, void *pvUser) 1412 1401 { … … 1416 1405 const char *pcszDisk = paScriptArgs[0].psz; 1417 1406 const char *pcszIoLog = paScriptArgs[1].psz; 1407 size_t cbBuf = 0; 1408 void *pvBuf = NULL; 1418 1409 1419 1410 pDisk = tstVDIoGetDiskByName(pGlob, pcszDisk); 1420 1411 if (pDisk) 1421 1412 { 1422 VDIOLOGGER hIoLogger;1423 1424 rc = VDDbgIoLogOpen(&hIoLogger, pcszIoLog);1413 RTTRACELOGRDR hIoLogRdr = NIL_RTTRACELOGRDR; 1414 1415 rc = RTTraceLogRdrCreateFromFile(&hIoLogRdr, pcszIoLog); 1425 1416 if (RT_SUCCESS(rc)) 1426 1417 { 1427 uint32_t fIoLogFlags; 1428 VDIOLOGEVENT enmEvent; 1429 void *pvBuf = NULL; 1430 size_t cbBuf = 0; 1431 1432 fIoLogFlags = VDDbgIoLogGetFlags(hIoLogger); 1433 1434 /* Loop through events. */ 1435 rc = VDDbgIoLogEventTypeGetNext(hIoLogger, &enmEvent); 1436 while ( RT_SUCCESS(rc) 1437 && enmEvent != VDIOLOGEVENT_END) 1418 RTTRACELOGRDRPOLLEVT enmEvt = RTTRACELOGRDRPOLLEVT_INVALID; 1419 1420 rc = RTTraceLogRdrEvtPoll(hIoLogRdr, &enmEvt, RT_INDEFINITE_WAIT); 1421 if (RT_SUCCESS(rc)) 1438 1422 { 1439 VDDBGIOLOGREQ enmReq = VDDBGIOLOGREQ_INVALID; 1440 uint64_t idEvent = 0; 1441 bool fAsync = false; 1442 uint64_t off = 0; 1443 size_t cbIo = 0; 1444 Assert(enmEvent == VDIOLOGEVENT_START); 1445 1446 rc = VDDbgIoLogReqTypeGetNext(hIoLogger, &enmReq); 1447 if (RT_FAILURE(rc)) 1448 break; 1449 1450 switch (enmReq) 1423 AssertMsg(enmEvt == RTTRACELOGRDRPOLLEVT_HDR_RECVD, ("Expected a header received event but got: %#x\n", enmEvt)); 1424 1425 /* Loop through events. */ 1426 rc = RTTraceLogRdrEvtPoll(hIoLogRdr, &enmEvt, RT_INDEFINITE_WAIT); 1427 while (RT_SUCCESS(rc)) 1451 1428 { 1452 case VDDBGIOLOGREQ_READ: 1453 { 1454 rc = VDDbgIoLogEventGetStart(hIoLogger, &idEvent, &fAsync, 1455 &off, &cbIo, 0, NULL); 1456 if ( RT_SUCCESS(rc) 1457 && cbIo > cbBuf) 1458 { 1459 pvBuf = RTMemRealloc(pvBuf, cbIo); 1460 if (pvBuf) 1461 cbBuf = cbIo; 1462 else 1463 rc = VERR_NO_MEMORY; 1464 } 1465 1466 if ( RT_SUCCESS(rc) 1467 && !fAsync) 1468 rc = VDRead(pDisk->pVD, off, pvBuf, cbIo); 1469 else if (RT_SUCCESS(rc)) 1470 rc = VERR_NOT_SUPPORTED; 1471 break; 1472 } 1473 case VDDBGIOLOGREQ_WRITE: 1474 { 1475 rc = VDDbgIoLogEventGetStart(hIoLogger, &idEvent, &fAsync, 1476 &off, &cbIo, cbBuf, pvBuf); 1477 if (rc == VERR_BUFFER_OVERFLOW) 1478 { 1479 pvBuf = RTMemRealloc(pvBuf, cbIo); 1480 if (pvBuf) 1481 { 1482 cbBuf = cbIo; 1483 rc = VDDbgIoLogEventGetStart(hIoLogger, &idEvent, &fAsync, 1484 &off, &cbIo, cbBuf, pvBuf); 1485 } 1486 else 1487 rc = VERR_NO_MEMORY; 1488 } 1489 1490 if ( RT_SUCCESS(rc) 1491 && !fAsync) 1492 rc = VDWrite(pDisk->pVD, off, pvBuf, cbIo); 1493 else if (RT_SUCCESS(rc)) 1494 rc = VERR_NOT_SUPPORTED; 1495 break; 1496 } 1497 case VDDBGIOLOGREQ_FLUSH: 1498 { 1499 rc = VDDbgIoLogEventGetStart(hIoLogger, &idEvent, &fAsync, 1500 &off, &cbIo, 0, NULL); 1501 if ( RT_SUCCESS(rc) 1502 && !fAsync) 1503 rc = VDFlush(pDisk->pVD); 1504 else if (RT_SUCCESS(rc)) 1505 rc = VERR_NOT_SUPPORTED; 1506 break; 1507 } 1508 case VDDBGIOLOGREQ_DISCARD: 1509 { 1510 PRTRANGE paRanges = NULL; 1511 unsigned cRanges = 0; 1512 1513 rc = VDDbgIoLogEventGetStartDiscard(hIoLogger, &idEvent, &fAsync, 1514 &paRanges, &cRanges); 1515 if ( RT_SUCCESS(rc) 1516 && !fAsync) 1517 { 1518 rc = VDDiscardRanges(pDisk->pVD, paRanges, cRanges); 1519 RTMemFree(paRanges); 1520 } 1521 else if (RT_SUCCESS(rc)) 1522 rc = VERR_NOT_SUPPORTED; 1523 break; 1524 } 1525 default: 1526 AssertMsgFailed(("Invalid request type %d\n", enmReq)); 1527 } 1528 1529 if (RT_SUCCESS(rc)) 1530 { 1531 /* Get matching complete event. */ 1532 rc = VDDbgIoLogEventTypeGetNext(hIoLogger, &enmEvent); 1429 AssertMsg(enmEvt == RTTRACELOGRDRPOLLEVT_TRACE_EVENT_RECVD, 1430 ("Expected a trace event received event but got: %#x\n", enmEvt)); 1431 1432 RTTRACELOGRDREVT hEvt = NIL_RTTRACELOGRDREVT; 1433 rc = RTTraceLogRdrQueryLastEvt(hIoLogRdr, &hEvt); 1434 AssertRC(rc); 1533 1435 if (RT_SUCCESS(rc)) 1534 1436 { 1535 uint64_t idEvtComplete; 1536 int rcReq; 1537 uint64_t msDuration; 1538 1539 Assert(enmEvent == VDIOLOGEVENT_COMPLETE); 1540 rc = VDDbgIoLogEventGetComplete(hIoLogger, &idEvtComplete, &rcReq, 1541 &msDuration, &cbIo, cbBuf, pvBuf); 1542 Assert(RT_FAILURE(rc) || idEvtComplete == idEvent); 1437 PCRTTRACELOGEVTDESC pEvtDesc = RTTraceLogRdrEvtGetDesc(hEvt); 1438 1439 if (!RTStrCmp(pEvtDesc->pszId, "Read")) 1440 { 1441 RTTRACELOGEVTVAL aVals[3]; 1442 unsigned cVals = 0; 1443 rc = RTTraceLogRdrEvtFillVals(hEvt, 0, &aVals[0], RT_ELEMENTS(aVals), &cVals); 1444 if ( RT_SUCCESS(rc) 1445 && cVals == 3 1446 && aVals[0].pItemDesc->enmType == RTTRACELOGTYPE_BOOL 1447 && aVals[1].pItemDesc->enmType == RTTRACELOGTYPE_UINT64 1448 && aVals[2].pItemDesc->enmType == RTTRACELOGTYPE_SIZE) 1449 { 1450 bool fAsync = aVals[0].u.f; 1451 uint64_t off = aVals[1].u.u64; 1452 size_t cbIo = (size_t)aVals[2].u.sz; 1453 1454 if (cbIo > cbBuf) 1455 { 1456 pvBuf = RTMemRealloc(pvBuf, cbIo); 1457 if (pvBuf) 1458 cbBuf = cbIo; 1459 else 1460 rc = VERR_NO_MEMORY; 1461 } 1462 1463 if ( RT_SUCCESS(rc) 1464 && !fAsync) 1465 rc = VDRead(pDisk->pVD, off, pvBuf, cbIo); 1466 else if (RT_SUCCESS(rc)) 1467 rc = VERR_NOT_SUPPORTED; 1468 } 1469 } 1470 else if (!RTStrCmp(pEvtDesc->pszId, "Write")) 1471 { 1472 RTTRACELOGEVTVAL aVals[3]; 1473 unsigned cVals = 0; 1474 rc = RTTraceLogRdrEvtFillVals(hEvt, 0, &aVals[0], RT_ELEMENTS(aVals), &cVals); 1475 if ( RT_SUCCESS(rc) 1476 && cVals == 3 1477 && aVals[0].pItemDesc->enmType == RTTRACELOGTYPE_BOOL 1478 && aVals[1].pItemDesc->enmType == RTTRACELOGTYPE_UINT64 1479 && aVals[2].pItemDesc->enmType == RTTRACELOGTYPE_SIZE) 1480 { 1481 bool fAsync = aVals[0].u.f; 1482 uint64_t off = aVals[1].u.u64; 1483 size_t cbIo = (size_t)aVals[2].u.sz; 1484 1485 if (cbIo > cbBuf) 1486 { 1487 pvBuf = RTMemRealloc(pvBuf, cbIo); 1488 if (pvBuf) 1489 cbBuf = cbIo; 1490 else 1491 rc = VERR_NO_MEMORY; 1492 } 1493 1494 if ( RT_SUCCESS(rc) 1495 && !fAsync) 1496 rc = VDWrite(pDisk->pVD, off, pvBuf, cbIo); 1497 else if (RT_SUCCESS(rc)) 1498 rc = VERR_NOT_SUPPORTED; 1499 } 1500 } 1501 else if (!RTStrCmp(pEvtDesc->pszId, "Flush")) 1502 { 1503 RTTRACELOGEVTVAL Val; 1504 unsigned cVals = 0; 1505 rc = RTTraceLogRdrEvtFillVals(hEvt, 0, &Val, 1, &cVals); 1506 if ( RT_SUCCESS(rc) 1507 && cVals == 1 1508 && Val.pItemDesc->enmType == RTTRACELOGTYPE_BOOL) 1509 { 1510 bool fAsync = Val.u.f; 1511 1512 if ( RT_SUCCESS(rc) 1513 && !fAsync) 1514 rc = VDFlush(pDisk->pVD); 1515 else if (RT_SUCCESS(rc)) 1516 rc = VERR_NOT_SUPPORTED; 1517 } 1518 } 1519 else if (!RTStrCmp(pEvtDesc->pszId, "Discard")) 1520 {} 1521 else 1522 AssertMsgFailed(("Invalid event ID: %s\n", pEvtDesc->pszId)); 1523 1524 if (RT_SUCCESS(rc)) 1525 { 1526 rc = RTTraceLogRdrEvtPoll(hIoLogRdr, &enmEvt, RT_INDEFINITE_WAIT); 1527 if (RT_SUCCESS(rc)) 1528 { 1529 AssertMsg(enmEvt == RTTRACELOGRDRPOLLEVT_TRACE_EVENT_RECVD, 1530 ("Expected a trace event received event but got: %#x\n", enmEvt)); 1531 1532 hEvt = NIL_RTTRACELOGRDREVT; 1533 rc = RTTraceLogRdrQueryLastEvt(hIoLogRdr, &hEvt); 1534 if (RT_SUCCESS(rc)) 1535 { 1536 pEvtDesc = RTTraceLogRdrEvtGetDesc(hEvt); 1537 AssertMsg(!RTStrCmp(pEvtDesc->pszId, "Complete"), 1538 ("Expected a completion event but got: %s\n", pEvtDesc->pszId)); 1539 } 1540 } 1541 } 1543 1542 } 1543 1544 if (RT_FAILURE(rc)) 1545 break; 1546 1547 rc = RTTraceLogRdrEvtPoll(hIoLogRdr, &enmEvt, RT_INDEFINITE_WAIT); 1544 1548 } 1545 1546 if (RT_SUCCESS(rc))1547 rc = VDDbgIoLogEventTypeGetNext(hIoLogger, &enmEvent);1548 1549 } 1549 1550 1550 VDDbgIoLogDestroy(hIoLogger);1551 RTTraceLogRdrDestroy(hIoLogRdr); 1551 1552 } 1552 1553 } … … 1554 1555 rc = VERR_NOT_FOUND; 1555 1556 1556 return rc; 1557 } 1558 #endif /* VBOX_TSTVDIO_WITH_LOG_REPLAY */ 1557 if (pvBuf) 1558 RTMemFree(pvBuf); 1559 1560 return rc; 1561 } 1559 1562 1560 1563
Note:
See TracChangeset
for help on using the changeset viewer.