This commit is contained in:
parent
bd48bb1a35
commit
e55280b21c
@ -30,7 +30,7 @@ class i_provider;
|
|||||||
|
|
||||||
class lock_data final {
|
class lock_data final {
|
||||||
public:
|
public:
|
||||||
explicit lock_data(const provider_type &prov, std::string unique_id);
|
lock_data(provider_type prov, std::string_view unique_id);
|
||||||
|
|
||||||
lock_data(const lock_data &) = delete;
|
lock_data(const lock_data &) = delete;
|
||||||
lock_data(lock_data &&) = delete;
|
lock_data(lock_data &&) = delete;
|
||||||
@ -42,19 +42,21 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
std::string mutex_id_;
|
std::string mutex_id_;
|
||||||
int lock_fd_;
|
|
||||||
|
private:
|
||||||
|
int handle_{};
|
||||||
int lock_status_{EWOULDBLOCK};
|
int lock_status_{EWOULDBLOCK};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
[[nodiscard]] static auto get_state_directory() -> std::string;
|
[[nodiscard]] static auto get_state_directory() -> std::string;
|
||||||
|
|
||||||
[[nodiscard]] static auto get_lock_data_file() -> std::string;
|
[[nodiscard]] auto get_lock_data_file() const -> std::string;
|
||||||
|
|
||||||
[[nodiscard]] auto get_lock_file() -> std::string;
|
[[nodiscard]] auto get_lock_file() const -> std::string;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
[[nodiscard]] static auto wait_for_lock(int fd,
|
[[nodiscard]] static auto wait_for_lock(int handle,
|
||||||
std::uint8_t retry_count = 30u)
|
std::uint8_t retry_count = 30U)
|
||||||
-> int;
|
-> int;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#include "platform/platform.hpp"
|
#include "platform/platform.hpp"
|
||||||
|
|
||||||
#include "app_config.hpp"
|
|
||||||
#include "events/event_system.hpp"
|
#include "events/event_system.hpp"
|
||||||
#include "events/types/filesystem_item_added.hpp"
|
#include "events/types/filesystem_item_added.hpp"
|
||||||
#include "providers/i_provider.hpp"
|
#include "providers/i_provider.hpp"
|
||||||
@ -36,14 +35,14 @@
|
|||||||
#include "utils/unix.hpp"
|
#include "utils/unix.hpp"
|
||||||
|
|
||||||
namespace repertory {
|
namespace repertory {
|
||||||
lock_data::lock_data(const provider_type &prov, std::string unique_id)
|
lock_data::lock_data(provider_type prov, std::string_view unique_id)
|
||||||
: mutex_id_(create_lock_id(prov, unique_id)) {
|
: mutex_id_(create_lock_id(prov, unique_id)) {
|
||||||
lock_fd_ = open(get_lock_file().c_str(), O_CREAT | O_RDWR, S_IWUSR | S_IRUSR);
|
handle_ = open(get_lock_file().c_str(), O_CREAT | O_RDWR, S_IWUSR | S_IRUSR);
|
||||||
}
|
}
|
||||||
|
|
||||||
lock_data::~lock_data() { release(); }
|
lock_data::~lock_data() { release(); }
|
||||||
|
|
||||||
auto lock_data::get_lock_data_file() -> std::string {
|
auto lock_data::get_lock_data_file() const -> std::string {
|
||||||
auto dir = get_state_directory();
|
auto dir = get_state_directory();
|
||||||
if (not utils::file::directory(dir).create_directory()) {
|
if (not utils::file::directory(dir).create_directory()) {
|
||||||
throw startup_exception("failed to create directory|sp|" + dir + "|err|" +
|
throw startup_exception("failed to create directory|sp|" + dir + "|err|" +
|
||||||
@ -56,7 +55,7 @@ auto lock_data::get_lock_data_file() -> std::string {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
auto lock_data::get_lock_file() -> std::string {
|
auto lock_data::get_lock_file() const -> std::string {
|
||||||
auto dir = get_state_directory();
|
auto dir = get_state_directory();
|
||||||
if (not utils::file::directory(dir).create_directory()) {
|
if (not utils::file::directory(dir).create_directory()) {
|
||||||
throw startup_exception("failed to create directory|sp|" + dir + "|err|" +
|
throw startup_exception("failed to create directory|sp|" + dir + "|err|" +
|
||||||
@ -70,19 +69,19 @@ auto lock_data::get_lock_file() -> std::string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto lock_data::get_mount_state(json &mount_state) -> bool {
|
auto lock_data::get_mount_state(json &mount_state) -> bool {
|
||||||
auto fd =
|
auto handle =
|
||||||
open(get_lock_data_file().c_str(), O_CREAT | O_RDWR, S_IWUSR | S_IRUSR);
|
open(get_lock_data_file().c_str(), O_CREAT | O_RDWR, S_IWUSR | S_IRUSR);
|
||||||
if (fd == -1) {
|
if (handle == -1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto ret{false};
|
auto ret{false};
|
||||||
if (wait_for_lock(fd) == 0) {
|
if (wait_for_lock(handle) == 0) {
|
||||||
ret = utils::file::read_json_file(get_lock_data_file(), mount_state);
|
ret = utils::file::read_json_file(get_lock_data_file(), mount_state);
|
||||||
flock(fd, LOCK_UN);
|
flock(handle, LOCK_UN);
|
||||||
}
|
}
|
||||||
|
|
||||||
close(fd);
|
close(handle);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,11 +96,11 @@ auto lock_data::get_state_directory() -> std::string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto lock_data::grab_lock(std::uint8_t retry_count) -> lock_result {
|
auto lock_data::grab_lock(std::uint8_t retry_count) -> lock_result {
|
||||||
if (lock_fd_ == -1) {
|
if (handle_ == -1) {
|
||||||
return lock_result::failure;
|
return lock_result::failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
lock_status_ = wait_for_lock(lock_fd_, retry_count);
|
lock_status_ = wait_for_lock(handle_, retry_count);
|
||||||
switch (lock_status_) {
|
switch (lock_status_) {
|
||||||
case 0:
|
case 0:
|
||||||
return lock_result::success;
|
return lock_result::success;
|
||||||
@ -113,20 +112,20 @@ auto lock_data::grab_lock(std::uint8_t retry_count) -> lock_result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void lock_data::release() {
|
void lock_data::release() {
|
||||||
if (lock_fd_ == -1) {
|
if (handle_ == -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lock_status_ == 0) {
|
if (lock_status_ == 0) {
|
||||||
utils::file::file{get_lock_file()}.delete();
|
[[maybe_unused]] auto success{utils::file::file{get_lock_file()}.remove()};
|
||||||
flock(lock_fd_, LOCK_UN);
|
flock(handle_, LOCK_UN);
|
||||||
}
|
}
|
||||||
|
|
||||||
close(lock_fd_);
|
close(handle_);
|
||||||
lock_fd_ = -1;
|
handle_ = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto lock_data::set_mount_state(bool active, const std::string &mount_location,
|
auto lock_data::set_mount_state(bool active, std::string_view mount_location,
|
||||||
int pid) -> bool {
|
int pid) -> bool {
|
||||||
REPERTORY_USES_FUNCTION_NAME();
|
REPERTORY_USES_FUNCTION_NAME();
|
||||||
|
|
||||||
@ -150,7 +149,7 @@ auto lock_data::set_mount_state(bool active, const std::string &mount_location,
|
|||||||
((mount_state.find("Location") == mount_state.end()) ||
|
((mount_state.find("Location") == mount_state.end()) ||
|
||||||
(mount_state["Location"].get<std::string>() != mount_location)))) {
|
(mount_state["Location"].get<std::string>() != mount_location)))) {
|
||||||
if (mount_location.empty() && not active) {
|
if (mount_location.empty() && not active) {
|
||||||
ret = utils::file::file{get_lock_data_file()}.delete();
|
ret = utils::file::file{get_lock_data_file()}.remove();
|
||||||
} else {
|
} else {
|
||||||
ret = utils::file::write_json_file(
|
ret = utils::file::write_json_file(
|
||||||
get_lock_data_file(),
|
get_lock_data_file(),
|
||||||
@ -171,13 +170,13 @@ auto lock_data::set_mount_state(bool active, const std::string &mount_location,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto lock_data::wait_for_lock(int fd, std::uint8_t retry_count) -> int {
|
auto lock_data::wait_for_lock(int handle, std::uint8_t retry_count) -> int {
|
||||||
static constexpr const std::uint32_t max_sleep{100U};
|
static constexpr const std::uint32_t max_sleep{100U};
|
||||||
|
|
||||||
auto lock_status{EWOULDBLOCK};
|
auto lock_status{EWOULDBLOCK};
|
||||||
auto remain{static_cast<std::uint32_t>(retry_count * max_sleep)};
|
auto remain{static_cast<std::uint32_t>(retry_count * max_sleep)};
|
||||||
while ((remain > 0) && (lock_status == EWOULDBLOCK)) {
|
while ((remain > 0) && (lock_status == EWOULDBLOCK)) {
|
||||||
lock_status = flock(fd, LOCK_EX | LOCK_NB);
|
lock_status = flock(handle, LOCK_EX | LOCK_NB);
|
||||||
if (lock_status == -1) {
|
if (lock_status == -1) {
|
||||||
lock_status = errno;
|
lock_status = errno;
|
||||||
if (lock_status == EWOULDBLOCK) {
|
if (lock_status == EWOULDBLOCK) {
|
||||||
@ -232,7 +231,7 @@ auto provider_meta_handler(i_provider &provider, bool directory,
|
|||||||
file.changed_date, file.creation_date, directory, getgid(), file.key,
|
file.changed_date, file.creation_date, directory, getgid(), file.key,
|
||||||
directory ? S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR
|
directory ? S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR
|
||||||
: S_IFREG | S_IRUSR | S_IWUSR,
|
: S_IFREG | S_IRUSR | S_IWUSR,
|
||||||
file.modified_date, 0u, 0u, file.file_size, file.source_path, getuid(),
|
file.modified_date, 0U, 0U, file.file_size, file.source_path, getuid(),
|
||||||
file.modified_date);
|
file.modified_date);
|
||||||
auto res = provider.set_item_meta(file.api_path, meta);
|
auto res = provider.set_item_meta(file.api_path, meta);
|
||||||
if (res == api_error::success) {
|
if (res == api_error::success) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user