From edcf680b95023b8fc49205bc1e0859fee350e3fb Mon Sep 17 00:00:00 2001 From: localhorst Date: Mon, 22 Aug 2022 18:35:27 +0200 Subject: [PATCH] update shred metric in main thread instead of shred thread --- include/drive.h | 1 + include/reHDD.h | 2 ++ src/reHDD.cpp | 32 ++++++++++++++++++++++++++++++++ src/shred.cpp | 12 ++---------- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/include/drive.h b/include/drive.h index 6d08433..a4e0771 100644 --- a/include/drive.h +++ b/include/drive.h @@ -27,6 +27,7 @@ public: time_t u32ShredTimeDelta; std::chrono::time_point chronoShredTimestamp; unsigned long ulWrittenBytes; + unsigned long ulSpeedMetricBytesWritten; } sShredSpeed; bool bWasShredded = false; diff --git a/include/reHDD.h b/include/reHDD.h index 47dc8bd..0dbbda2 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -15,6 +15,7 @@ #define WORSE_POWERUP 10000 //mark drive if at this limit or beyond #define SHRED_ITERATIONS 3U #define FROZEN_TIMEOUT 10 //After this timeout (minutes) the drive will be marked as frozen +#define METRIC_THRESHOLD 3UL*1000UL*1000UL*1000UL //calc shred speed with this minimum of time delta // Logger Settings #define LOG_PATH "./reHDD.log" @@ -84,6 +85,7 @@ private: static void searchDrives(list * plistDrives); static void printDrives(list * plistDrives); static void startShredAllDrives(list * plistDrives); + static void updateShredMetrics(list * plistDrives); static void filterIgnoredDrives(list * plistDrives); static void filterNewDrives(list * plistOldDrives, list * plistNewDrives); static void addSMARTData(list * plistDrives); diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 265b091..d462d8d 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -71,9 +71,14 @@ void reHDD::app_logic(void) { char dummy; read (fdShredInformPipe[0],&dummy,1); + updateShredMetrics(&listDrives); #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("got progress signal from a shred task"); #endif + + + + } ui->updateTUI(&listDrives, u8SelectedEntry); } //endless loop @@ -445,6 +450,33 @@ void reHDD::printDrives(list * plistDrives) #endif } +/** + * \brief update shred metrics for all drives + * \param pointer of list * plistDrives + * \return void + */ +void reHDD::updateShredMetrics(list * plistDrives) +{ + list ::iterator it; + for (it = plistDrives->begin(); it != plistDrives->end(); ++it) + { + if(it->state == Drive::SHRED_ACTIVE) + { + Drive* pTmpDrive = iterator_to_pointer::iterator > (it); + //set metrics for calculating shred speed + std::chrono::time_point chronoCurrentTimestamp = std::chrono::system_clock::now(); + time_t u32ShredTimeDelta = (chronoCurrentTimestamp - pTmpDrive->sShredSpeed.chronoShredTimestamp).count(); + if(u32ShredTimeDelta > METRIC_THRESHOLD) + { + pTmpDrive->sShredSpeed.u32ShredTimeDelta = u32ShredTimeDelta; + pTmpDrive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); + pTmpDrive->sShredSpeed.ulWrittenBytes = pTmpDrive->sShredSpeed.ulSpeedMetricBytesWritten; + pTmpDrive->sShredSpeed.ulSpeedMetricBytesWritten = 0U; + } + } + } +} + /** * \brief add S.M.A.R.T data from SMART * \param pointer of list * plistDrives diff --git a/src/shred.cpp b/src/shred.cpp index 4eeb2b3..0734030 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -90,7 +90,7 @@ 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 + drive->sShredSpeed.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()); @@ -139,7 +139,7 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) ulDriveByteCounter += iByteShredded; ulDriveByteOverallCount += iByteShredded; d32Percent = this->calcProgress(); - ulSpeedMetricBytesWritten += iByteShredded; + drive->sShredSpeed.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()); @@ -149,14 +149,6 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) //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); }