From 9863c5591e5d5d10afc646994917b47d4f6a19f2 Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 30 Jun 2022 00:32:13 +0200 Subject: [PATCH] cal metric: shred speed --- include/drive.h | 6 ++++++ include/reHDD.h | 2 +- include/tui.h | 1 + makefile | 4 ++-- src/shred.cpp | 14 ++++++++++++++ src/tui.cpp | 15 +++++++++++++-- 6 files changed, 37 insertions(+), 5 deletions(-) diff --git a/include/drive.h b/include/drive.h index 5427eeb..6c76568 100644 --- a/include/drive.h +++ b/include/drive.h @@ -22,6 +22,12 @@ public: FROZEN } state; + struct { + time_t u32ShredTimeDelta; + std::chrono::time_point chronoShredTimestamp; + unsigned long ulWrittenBytes; + } sShredSpeed; + bool bWasShredded = false; bool bWasDeleteted = false; bool bIsOffline = false; diff --git a/include/reHDD.h b/include/reHDD.h index a6cd242..08d2ac4 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -29,7 +29,7 @@ #endif // Logic -#define DRYRUN //don´t touch the drives +//#define DRYRUN //don´t touch the drives #define FROZEN_ALERT //show alert if drive is frozen #define ZERO_CHECK_ALERT //check drive after shred if all bytes are zero, show alert if this fails diff --git a/include/tui.h b/include/tui.h index 568affd..18ad654 100644 --- a/include/tui.h +++ b/include/tui.h @@ -66,6 +66,7 @@ private: void displaySelectedDrive(Drive drive, int stdscrX, int stdscrY); string formatTimeDuration(time_t u32Duration); + string formatSpeed(time_t u32ShredTimeDelta, unsigned long ulWrittenBytes); }; #endif // TUI_H_ \ No newline at end of file diff --git a/makefile b/makefile index fe3ada5..9761a26 100644 --- a/makefile +++ b/makefile @@ -12,7 +12,7 @@ LIBS = # General compiler flags COMPILE_FLAGS = -std=c++17 -Wall -Wextra -g # Additional release-specific flags -RCOMPILE_FLAGS = -D NDEBUG +RCOMPILE_FLAGS = -D NDEBUG -O3 # Additional debug-specific flags DCOMPILE_FLAGS = -D DEBUG # Add additional include paths @@ -51,7 +51,7 @@ ifeq ($(V),true) endif # Combine compiler and linker flags -release: export CXXFLAGS := $(CXXFLAGS) $(COMPILE_FLAGS) $(RCOMPILE_FLAGS) +release: export CXXFLAGS := $(CXXFLAGS) $(COMPILE_FLAGS) $(RCOMPILE_FLAGS) release: export LDFLAGS := $(LDFLAGS) $(LINK_FLAGS) $(RLINK_FLAGS) debug: export CXXFLAGS := $(CXXFLAGS) $(COMPILE_FLAGS) $(DCOMPILE_FLAGS) debug: export LDFLAGS := $(LDFLAGS) $(LINK_FLAGS) $(DLINK_FLAGS) diff --git a/src/shred.cpp b/src/shred.cpp index 8eee2d2..8476e2d 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -64,6 +64,8 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) } this->ulDriveByteSize = getDriveSizeInBytes(driveFileDiscr); + drive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now();; //set inital timestamp for speed metric + unsigned long ulSpeedMetricBytesWritten = 0U; //uses to calculate speed metric #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("Shred-Task: Bytes-Size of Drive: " + to_string(this->ulDriveByteSize) + " - Drive: " + drive->getSerial()); @@ -73,6 +75,7 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) { unsigned long ulDriveByteCounter = 0U; //used for one shred-iteration to keep track of the current drive position uint32_t u32ChunkDimensionIndex = 0U; + if(uiShredIterationCounter == (SHRED_ITERATIONS-1)) { @@ -136,14 +139,25 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) ulDriveByteCounter += iByteShredded; ulDriveByteOverallCount += iByteShredded; d32Percent = this->calcProgress(); + ulSpeedMetricBytesWritten += iByteShredded; #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("Shred-Task: ByteCount: " + to_string(ulDriveByteCounter) + " - iteration: " + to_string((uiShredIterationCounter+1)) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial()); #endif if((d32Percent-d32TmpPercent) >= 0.01) { + //set shred percantage drive->setTaskPercentage(d32TmpPercent); d32TmpPercent = d32Percent; + + //set metrics for calculating shred speed + std::chrono::time_point chronoCurrentTimestamp = std::chrono::system_clock::now(); + drive->sShredSpeed.u32ShredTimeDelta = (chronoCurrentTimestamp - drive->sShredSpeed.chronoShredTimestamp).count(); + drive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); + drive->sShredSpeed.ulWrittenBytes = ulSpeedMetricBytesWritten; + ulSpeedMetricBytesWritten = 0U; + + //signal process in shreding write(*ipSignalFd, "A",1); } diff --git a/src/tui.cpp b/src/tui.cpp index fbbe9a0..2a02ee6 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -77,9 +77,9 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) string sModelName = it->getModelName(); string sCapacity = it->sCapacityToText(); string sState = " "; + string sSpeed = " "; string sTime = " "; - bool bSelectedEntry = false; if(u8SelectedEntry == u8Index) @@ -107,6 +107,7 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) it->calculateTaskDuration(); sTime = this->formatTimeDuration(it->getTaskDuration()); + sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes); break; case Drive::DELETE_ACTIVE: sState = "Deleting ..."; @@ -151,7 +152,7 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) break; } - WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, sModelFamily, sModelName, sCapacity, sState, sTime, "424 MB/s", bSelectedEntry); + WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, sModelFamily, sModelName, sCapacity, sState, sTime, sSpeed, bSelectedEntry); wrefresh(tmp); u8Index++; }//end loop though drives @@ -507,6 +508,16 @@ string TUI::formatTimeDuration(time_t u32Duration) return out.str(); } +string TUI::formatSpeed(time_t u32ShredTimeDelta, unsigned long ulWrittenBytes){ + std::ostringstream out; + double dDeltaSec = ((double)((u32ShredTimeDelta)/1000000000.0)); //convert nano in sec + double speed = ((ulWrittenBytes/1000000.0)/dDeltaSec); + char s[25]; + sprintf(s, "%0.2lf MB/s", speed); + out << s; + return out.str(); +} + void TUI::displaySelectedDrive(Drive drive, int stdscrX, int stdscrY) { struct MenuState menustate;