From de7e3e60cd4f712484399eead07e9087c3a52e43 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 5 Dec 2017 08:48:05 -0800 Subject: [PATCH] Add temp dir removal to asset server --- assignment-client/src/assets/AssetServer.cpp | 3 ++ libraries/shared/src/PathUtils.cpp | 47 ++++++++++++++++++++ libraries/shared/src/PathUtils.h | 2 + libraries/shared/src/SharedUtil.cpp | 20 +++++++++ libraries/shared/src/SharedUtil.h | 2 + 5 files changed, 74 insertions(+) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index ca0f222e0c..b24e38fd13 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -416,6 +416,9 @@ void AssetServer::completeSetup() { if (assetsFilesizeLimit != 0 && assetsFilesizeLimit < MAX_UPLOAD_SIZE) { _filesizeLimit = assetsFilesizeLimit * BITS_PER_MEGABITS; } + + PathUtils::removeTemporaryDirs(); + PathUtils::removeTemporaryDirs("Oven"); } void AssetServer::cleanupUnmappedFiles() { diff --git a/libraries/shared/src/PathUtils.cpp b/libraries/shared/src/PathUtils.cpp index 46613f1283..acf053aaed 100644 --- a/libraries/shared/src/PathUtils.cpp +++ b/libraries/shared/src/PathUtils.cpp @@ -19,8 +19,14 @@ #include #include #include +#include #include // std::once #include "shared/GlobalAppProperties.h" +#include "SharedUtil.h" + +// Format: AppName-PID-Timestamp +// Example: ... +QString TEMP_DIR_FORMAT { "%1-%2-%3" }; const QString& PathUtils::resourcesPath() { #ifdef Q_OS_MAC @@ -60,6 +66,7 @@ QString PathUtils::generateTemporaryDir() { QString appName = qApp->applicationName(); for (auto i = 0; i < 64; ++i) { auto now = std::chrono::system_clock::now().time_since_epoch().count(); + auto dirName = TEMP_DIR_FORMAT.arg(appName).arg(qApp->applicationPid()).arg(now); QDir tempDir = rootTempDir.filePath(appName + "-" + QString::number(now)); if (tempDir.mkpath(".")) { return tempDir.absolutePath(); @@ -68,6 +75,46 @@ QString PathUtils::generateTemporaryDir() { return ""; } +// Delete all temporary directories for an application +int PathUtils::removeTemporaryDirs(QString appName) { + if (appName.isNull()) { + appName = qApp->applicationName(); + } + + auto dirName = TEMP_DIR_FORMAT.arg(appName).arg("*").arg("*"); + qDebug() << "Dirname format is: " << dirName; + + QDir rootTempDir = QDir::tempPath(); + qDebug() << "Temp dir is: " << rootTempDir; + auto dirs = rootTempDir.entryInfoList({ dirName }, QDir::Dirs); + int removed = 0; + for (auto& dir : dirs) { + auto dirName = dir.fileName(); + auto absoluteDirPath = QDir(dir.absoluteFilePath()); + qDebug() << " Deleting: " << dirName << absoluteDirPath; + QRegularExpression re { "^" + QRegularExpression::escape(appName) + "\\-(?\\d+)\\-(?\\d+)$" }; + + auto match = re.match(dirName); + if (match.hasMatch()) { + qDebug() << " Got match"; + auto pid = match.capturedRef("pid").toLongLong(); + auto timestamp = match.capturedRef("timestamp"); + qDebug() << " Is " << pid << " running?" << processIsRunning(pid); + if (!processIsRunning(pid)) { + qDebug() << " Removing: " << absoluteDirPath; + absoluteDirPath.removeRecursively(); + removed++; + } else { + qDebug() << " Not removing (process is running): " << dir.absoluteDir(); + } + } else { + qDebug() << " NO MATCH"; + } + } + + return removed; +} + QString fileNameWithoutExtension(const QString& fileName, const QVector possibleExtensions) { QString fileNameLowered = fileName.toLower(); foreach (const QString possibleExtension, possibleExtensions) { diff --git a/libraries/shared/src/PathUtils.h b/libraries/shared/src/PathUtils.h index 8c4bcf2394..184c62ad6f 100644 --- a/libraries/shared/src/PathUtils.h +++ b/libraries/shared/src/PathUtils.h @@ -39,6 +39,8 @@ public: static QString generateTemporaryDir(); + static int removeTemporaryDirs(QString appName = QString::null); + static Qt::CaseSensitivity getFSCaseSensitivity(); static QString stripFilename(const QUrl& url); // note: this is FS-case-sensitive version of parentURL.isParentOf(childURL) diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index 38a7a3165f..294546d1f0 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -44,6 +44,11 @@ extern "C" FILE * __cdecl __iob_func(void) { #include #endif + +#if defined(Q_OS_LINUX) || defined(__APPLE__) +#include +#endif + #include #include #include @@ -1078,6 +1083,21 @@ void setMaxCores(uint8_t maxCores) { #endif } +bool processIsRunning(int64_t pid) { +#ifdef Q_OS_WIN + HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid); + if (process) { + DWORD exitCodeOut; + if (GetExitCodeProcess(process, &exitCodeOut) != 0) { + return exitCodeOut == STILL_ACTIVE; + } + } + return false; +#elif defined(Q_OS_LINUX) || defined(__APPLE__) + return kill(pid, 0) != ESRCH; +#endif +} + void quitWithParentProcess() { if (qApp) { qDebug() << "Parent process died, quitting"; diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index 25051d45ac..6cf5a4755d 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -238,6 +238,8 @@ void setMaxCores(uint8_t maxCores); const QString PARENT_PID_OPTION = "parent-pid"; void watchParentProcess(int parentPID); +bool processIsRunning(int64_t pid); + #ifdef Q_OS_WIN void* createProcessGroup();