Don't create lock file in internal data folders

PR #23279.
This commit is contained in:
Vladimir Golovnev
2025-09-22 20:09:21 +03:00
committed by GitHub
parent 3b744c3dba
commit 3de2a9f486
2 changed files with 4 additions and 51 deletions

View File

@@ -1,6 +1,6 @@
/* /*
* Bittorrent Client using Qt and libtorrent. * Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2017-2024 Vladimir Golovnev <glassez@yandex.ru> * Copyright (C) 2017-2025 Vladimir Golovnev <glassez@yandex.ru>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@@ -34,53 +34,16 @@
#include "base/utils/fs.h" #include "base/utils/fs.h"
#include "base/utils/io.h" #include "base/utils/io.h"
QHash<Path, std::weak_ptr<QFile>> AsyncFileStorage::m_reservedPaths;
QReadWriteLock AsyncFileStorage::m_reservedPathsLock;
AsyncFileStorage::AsyncFileStorage(const Path &storageFolderPath, QObject *parent) AsyncFileStorage::AsyncFileStorage(const Path &storageFolderPath, QObject *parent)
: QObject(parent) : QObject(parent)
, m_storageDir(storageFolderPath) , m_storageDir(storageFolderPath)
{ {
Q_ASSERT(m_storageDir.isAbsolute()); Q_ASSERT(m_storageDir.isAbsolute());
const Path lockFilePath = m_storageDir / Path(u"storage.lock"_s); if (!Utils::Fs::mkpath(m_storageDir))
throw AsyncFileStorageError(tr("Could not create directory '%1'.").arg(m_storageDir.toString()));
{
const QReadLocker readLocker {&m_reservedPathsLock};
m_lockFile = m_reservedPaths.value(lockFilePath).lock();
}
if (!m_lockFile)
{
const QWriteLocker writeLocker {&m_reservedPathsLock};
if (std::weak_ptr<QFile> &lockFile = m_reservedPaths[lockFilePath]; lockFile.expired()) [[likely]]
{
if (!Utils::Fs::mkpath(m_storageDir))
throw AsyncFileStorageError(tr("Could not create directory '%1'.").arg(m_storageDir.toString()));
auto lockFileDeleter = [](QFile *file)
{
file->close();
file->remove();
delete file;
};
m_lockFile = std::shared_ptr<QFile>(new QFile(lockFilePath.data()), std::move(lockFileDeleter));
// TODO: This folder locking approach does not work for UNIX systems. Implement it.
if (!m_lockFile->open(QFile::WriteOnly))
throw AsyncFileStorageError(m_lockFile->errorString());
lockFile = m_lockFile;
}
else
{
m_lockFile = lockFile.lock();
}
}
} }
AsyncFileStorage::~AsyncFileStorage() = default;
void AsyncFileStorage::store(const Path &filePath, const QByteArray &data) void AsyncFileStorage::store(const Path &filePath, const QByteArray &data)
{ {
QMetaObject::invokeMethod(this, [this, data, filePath] { store_impl(filePath, data); }, Qt::QueuedConnection); QMetaObject::invokeMethod(this, [this, data, filePath] { store_impl(filePath, data); }, Qt::QueuedConnection);

View File

@@ -1,6 +1,6 @@
/* /*
* Bittorrent Client using Qt and libtorrent. * Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2017-2024 Vladimir Golovnev <glassez@yandex.ru> * Copyright (C) 2017-2025 Vladimir Golovnev <glassez@yandex.ru>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@@ -28,12 +28,7 @@
#pragma once #pragma once
#include <memory>
#include <QFile>
#include <QHash>
#include <QObject> #include <QObject>
#include <QReadWriteLock>
#include "base/exceptions.h" #include "base/exceptions.h"
#include "base/path.h" #include "base/path.h"
@@ -51,7 +46,6 @@ class AsyncFileStorage final : public QObject
public: public:
explicit AsyncFileStorage(const Path &storageFolderPath, QObject *parent = nullptr); explicit AsyncFileStorage(const Path &storageFolderPath, QObject *parent = nullptr);
~AsyncFileStorage() override;
void store(const Path &filePath, const QByteArray &data); void store(const Path &filePath, const QByteArray &data);
@@ -64,8 +58,4 @@ private:
Q_INVOKABLE void store_impl(const Path &fileName, const QByteArray &data); Q_INVOKABLE void store_impl(const Path &fileName, const QByteArray &data);
Path m_storageDir; Path m_storageDir;
std::shared_ptr<QFile> m_lockFile;
static QHash<Path, std::weak_ptr<QFile>> m_reservedPaths;
static QReadWriteLock m_reservedPathsLock;
}; };