2.0.0-rc (#9)
Some checks failed
BlockStorage/repertory_osx/pipeline/head This commit looks good
BlockStorage/repertory_windows/pipeline/head This commit looks good
BlockStorage/repertory/pipeline/head There was a failure building this commit
BlockStorage/repertory_linux_builds/pipeline/head This commit looks good
BlockStorage/repertory_osx_builds/pipeline/head There was a failure building this commit

### Issues

* \#1 \[bug\] Unable to mount S3 due to 'item_not_found' exception
* \#2 Require bucket name for S3 mounts
* \#3 \[bug\] File size is not being updated in S3 mount
* \#4 Upgrade to libfuse-3.x.x
* \#5 Switch to renterd for Sia support
* \#6 Switch to cpp-httplib to further reduce dependencies
* \#7 Remove global_data and calculate used disk space per provider
* \#8 Switch to libcurl for S3 mount support

### Changes from v1.x.x

* Added read-only encrypt provider
  * Pass-through mount point that transparently encrypts source data using `XChaCha20-Poly1305`
* Added S3 encryption support via `XChaCha20-Poly1305`
* Added replay protection to remote mounts
* Added support base64 writes in remote FUSE
* Created static linked Linux binaries for `amd64` and `aarch64` using `musl-libc`
* Removed legacy Sia renter support
* Removed Skynet support
* Fixed multiple remote mount WinFSP API issues on \*NIX servers
* Implemented chunked read and write
  * Writes for non-cached files are performed in chunks of 8Mib
* Removed `repertory-ui` support
* Removed `FreeBSD` support
* Switched to `libsodium` over `CryptoPP`
* Switched to `XChaCha20-Poly1305` for remote mounts
* Updated `GoogleTest` to v1.14.0
* Updated `JSON for Modern C++` to v3.11.2
* Updated `OpenSSL` to v1.1.1w
* Updated `RocksDB` to v8.5.3
* Updated `WinFSP` to 2023
* Updated `boost` to v1.78.0
* Updated `cURL` to v8.3.0
* Updated `zlib` to v1.3
* Use `upload_manager` for all providers
  * Adds a delay to uploads to prevent excessive API calls
  * Supports re-upload after mount restart for incomplete uploads
  * NOTE: Uploads for all providers are full file (no resume support)
    * Multipart upload support is planned for S3

Reviewed-on: #9
This commit is contained in:
2023-10-29 06:55:59 +00:00
parent 3ff46723b8
commit f43c41f88a
839 changed files with 98214 additions and 92959 deletions

View File

@ -1,25 +1,27 @@
/*
Copyright <2018-2022> <scott.e.graves@protonmail.com>
Copyright <2018-2023> <scott.e.graves@protonmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#ifndef INCLUDE_DB_DIRECTORY_DB_HPP_
#define INCLUDE_DB_DIRECTORY_DB_HPP_
#include "common.hpp"
#include "app_config.hpp"
#include "types/repertory.hpp"
#include "utils/rocksdb_utils.hpp"
@ -29,22 +31,25 @@ class directory_db final {
private:
class directory_tree final {
private:
std::unordered_map<std::string, std::vector<std::string>> sub_directory_lookup_;
std::unordered_map<std::string, std::vector<std::string>>
sub_directory_lookup_;
public:
void add_path(const std::string &api_path, const std::vector<std::string> &files,
rocksdb::DB &db);
void add_path(const std::string &api_path,
const std::vector<std::string> &files, rocksdb::DB &db);
std::size_t get_count(const std::string &api_path) const;
[[nodiscard]] auto get_count(const std::string &api_path) const
-> std::size_t;
std::vector<std::string> get_directories() const;
[[nodiscard]] auto get_directories() const -> std::vector<std::string>;
std::vector<std::string> get_sub_directories(const std::string &api_path) const;
[[nodiscard]] auto get_sub_directories(const std::string &api_path) const
-> std::vector<std::string>;
bool is_directory(const std::string &api_path) const;
[[nodiscard]] auto is_directory(const std::string &api_path) const -> bool;
bool remove_directory(const std::string &api_path, rocksdb::DB &db,
const bool &allow_remove_root = false);
void remove_directory(const std::string &api_path, rocksdb::DB &db,
bool allow_remove_root = false);
};
public:
@ -60,41 +65,52 @@ private:
const std::string DIRDB_NAME = "directory_db";
private:
json get_directory_data(const std::string &api_path) const;
[[nodiscard]] auto get_directory_data(const std::string &api_path) const
-> json;
public:
api_error create_directory(const std::string &api_path, const bool &create_always = false);
[[nodiscard]] auto create_directory(const std::string &api_path,
bool create_always = false) -> api_error;
api_error create_file(const std::string &api_path);
[[nodiscard]] auto create_file(const std::string &api_path) -> api_error;
std::uint64_t get_directory_item_count(const std::string &api_path) const;
[[nodiscard]] auto get_directory_item_count(const std::string &api_path) const
-> std::uint64_t;
api_error get_file(const std::string &api_path, api_file &file,
api_file_provider_callback api_file_provider) const;
[[nodiscard]] auto
get_file(const std::string &api_path, api_file &file,
api_file_provider_callback api_file_provider) const -> api_error;
api_error get_file_list(api_file_list &list, api_file_provider_callback api_file_provider) const;
[[nodiscard]] auto
get_file_list(api_file_list &list,
api_file_provider_callback api_file_provider) const
-> api_error;
std::size_t get_sub_directory_count(const std::string &api_path) const;
[[nodiscard]] auto get_sub_directory_count(const std::string &api_path) const
-> std::size_t;
std::uint64_t get_total_item_count() const;
[[nodiscard]] auto get_total_item_count() const -> std::uint64_t;
bool is_directory(const std::string &api_path) const;
[[nodiscard]] auto is_directory(const std::string &api_path) const -> bool;
bool is_file(const std::string &api_path) const;
[[nodiscard]] auto is_file(const std::string &api_path) const -> bool;
void populate_directory_files(const std::string &api_path,
const meta_provider_callback &meta_provider,
meta_provider_callback meta_provider,
directory_item_list &list) const;
void populate_sub_directories(const std::string &api_path,
const meta_provider_callback &meta_provider,
meta_provider_callback meta_provider,
directory_item_list &list) const;
api_error remove_directory(const std::string &api_path, const bool &allow_remove_root = false);
[[nodiscard]] auto remove_directory(const std::string &api_path,
bool allow_remove_root = false)
-> api_error;
bool remove_file(const std::string &api_path);
[[nodiscard]] auto remove_file(const std::string &api_path) -> bool;
api_error rename_file(const std::string &from_api_path, const std::string &to_api_path);
[[nodiscard]] auto rename_file(const std::string &from_api_path,
const std::string &to_api_path) -> api_error;
};
} // namespace repertory

View File

@ -1,25 +1,27 @@
/*
Copyright <2018-2022> <scott.e.graves@protonmail.com>
Copyright <2018-2023> <scott.e.graves@protonmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#ifndef INCLUDE_DB_META_DB_HPP_
#define INCLUDE_DB_META_DB_HPP_
#include "common.hpp"
#include "app_config.hpp"
#include "types/repertory.hpp"
#include "utils/rocksdb_utils.hpp"
@ -34,47 +36,73 @@ public:
private:
std::unique_ptr<rocksdb::DB> db_;
std::unique_ptr<rocksdb::ColumnFamilyHandle> default_family_;
std::unique_ptr<rocksdb::ColumnFamilyHandle> source_family_;
std::unique_ptr<rocksdb::ColumnFamilyHandle> keys_family_;
rocksdb::ColumnFamilyHandle *default_family_{};
rocksdb::ColumnFamilyHandle *source_family_{};
rocksdb::ColumnFamilyHandle *keys_family_{};
const std::string METADB_NAME = "meta_db";
private:
api_error get_item_meta_json(const std::string &api_path, json &json_data) const;
[[nodiscard]] auto
perform_action(const std::string &function_name,
const std::function<rocksdb::Status()> &action) const
-> api_error;
void release_resources();
[[nodiscard]] auto get_item_meta_json(const std::string &api_path,
json &json_data) const -> api_error;
[[nodiscard]] auto store_item_meta(const std::string &api_path,
const std::string &key,
const std::string &value) -> api_error;
public:
std::shared_ptr<rocksdb::Iterator> create_iterator(const bool &source_family);
[[nodiscard]] auto create_iterator(bool source_family) const
-> std::shared_ptr<rocksdb::Iterator>;
api_error get_api_path_from_key(const std::string &key, std::string &api_path) const;
[[nodiscard]] auto get_api_path_from_key(const std::string &key,
std::string &api_path) const
-> api_error;
api_error get_api_path_from_source(const std::string &source_path, std::string &api_path) const;
[[nodiscard]] auto get_api_path_from_source(const std::string &source_path,
std::string &api_path) const
-> api_error;
api_error get_item_meta(const std::string &api_path, api_meta_map &meta) const;
[[nodiscard]] auto get_item_meta(const std::string &api_path,
api_meta_map &meta) const -> api_error;
api_error get_item_meta(const std::string &api_path, const std::string &key,
std::string &value) const;
[[nodiscard]] auto get_item_meta(const std::string &api_path,
const std::string &key,
std::string &value) const -> api_error;
bool get_item_meta_exists(const std::string &api_path) const;
[[nodiscard]] auto get_item_meta_exists(const std::string &api_path) const
-> bool;
std::vector<std::string> get_pinned_files() const;
[[nodiscard]] auto get_total_item_count() const -> std::uint64_t;
bool get_source_path_exists(const std::string &source_path) const;
[[nodiscard]] auto get_pinned_files() const -> std::vector<std::string>;
void remove_item_meta(const std::string &api_path);
[[nodiscard]] auto
get_source_path_exists(const std::string &source_path) const -> bool;
api_error remove_item_meta(const std::string &api_path, const std::string &key);
[[nodiscard]] auto remove_item_meta(const std::string &api_path) -> api_error;
api_error rename_item_meta(const std::string &source_path, const std::string &from_api_path,
const std::string &to_api_path);
[[nodiscard]] auto remove_item_meta(const std::string &api_path,
const std::string &key) -> api_error;
api_error set_item_meta(const std::string &api_path, const std::string &key,
const std::string &value);
[[nodiscard]] auto rename_item_meta(const std::string &source_path,
const std::string &from_api_path,
const std::string &to_api_path)
-> api_error;
api_error set_item_meta(const std::string &api_path, const api_meta_map &meta);
[[nodiscard]] auto set_item_meta(const std::string &api_path,
const std::string &key,
const std::string &value) -> api_error;
api_error set_source_path(const std::string &api_path, const std::string &source_path);
[[nodiscard]] auto set_item_meta(const std::string &api_path,
const api_meta_map &meta) -> api_error;
[[nodiscard]] auto set_source_path(const std::string &api_path,
const std::string &source_path)
-> api_error;
};
} // namespace repertory

View File

@ -1,63 +0,0 @@
/*
Copyright <2018-2022> <scott.e.graves@protonmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef INCLUDE_DB_RETRY_DB_HPP_
#define INCLUDE_DB_RETRY_DB_HPP_
#include "common.hpp"
#include "app_config.hpp"
#include "events/events.hpp"
#include "events/event_system.hpp"
#include "types/repertory.hpp"
#include "utils/path_utils.hpp"
#include "utils/rocksdb_utils.hpp"
namespace repertory {
class retry_db final {
public:
typedef std::function<bool(const std::string &api_path)> process_callback;
public:
explicit retry_db(const app_config &config);
~retry_db();
private:
std::unique_ptr<rocksdb::DB> db_;
bool paused_ = false;
std::mutex processing_mutex_;
const std::string ROCKS_DB_NAME = "retry_db";
public:
bool exists(const std::string &api_path) const;
void pause();
bool process_all(const process_callback &process);
void remove(const std::string &api_path);
void rename(const std::string &from_api_path, const std::string &to_api_path);
void resume();
void set(const std::string &api_path);
};
} // namespace repertory
#endif // INCLUDE_DB_RETRY_DB_HPP_