21 #include <unordered_map> 26 #include <experimental/filesystem> 29 #include <aws/core/utils/json/JsonSerializer.h> 32 namespace FileManagement {
42 static constexpr
const char*
kEofKey =
"eof";
62 explicit FileTokenInfo(
const std::string &file_path,
const long position,
const bool eof) :
71 explicit FileTokenInfo(std::string &&file_path,
const long position,
const bool eof) :
90 Aws::Utils::Json::JsonValue json_value;
91 const Aws::String file_path(
file_path_.c_str());
94 .WithBool(kEofKey,
eof_)
95 .WithString(kFilePathKey, file_path);
96 return std::string(json_value.View().WriteCompact().c_str());
104 const Aws::String aws_str(token_info_json.c_str());
105 const Aws::Utils::Json::JsonValue json_value(aws_str);
106 if (!json_value.WasParseSuccessful()) {
107 throw std::runtime_error(
"Unable to parse JSON");
109 auto view = json_value.View();
111 eof_ = view.GetBool(kEofKey);
112 file_path_ = view.GetString(kFilePathKey).c_str();
142 virtual bool isDataAvailable() = 0;
144 virtual bool isDeleteStaleData() = 0;
146 virtual DataToken read(std::string &data) = 0;
148 virtual void write(
const std::string &data) = 0;
156 virtual void resolve(
const DataToken &token,
bool is_success) = 0;
174 bool isTokenAvailable(
const std::string &file_name)
const;
180 FileTokenInfo popAvailableToken(
const std::string &file_name);
191 DataToken createToken(
const std::string &file_name,
const long streampos,
bool is_eof);
216 std::vector<FileTokenInfo> backup();
227 void restore(
const std::vector<FileTokenInfo> &file_tokens);
232 void restoreFromDisk();
241 void validateOptions();
247 void initializeBackupDirectory();
298 bool start()
override;
304 bool isDataAvailable()
override;
311 bool isDeleteStaleData()
override;
320 DataToken read(std::string &data)
override;
326 void write(
const std::string &data)
override;
336 void resolve(
const DataToken &token,
bool is_success)
override;
344 bool shutdown()
override;
353 std::string getFileToRead();
360 return active_write_file_;
368 void validateOptions();
374 void initializeStorage();
379 void initializeTokenStore();
384 void discoverStoredFiles();
391 void deleteFile(
const std::string &file_path);
398 void checkIfWriteFileShouldRotate(
const uintmax_t &new_data_size);
404 void rotateWriteFile();
412 void checkIfStorageLimitHasBeenReached(
const uintmax_t &new_data_size);
417 void deleteOldestFile();
423 void addFilePathToStorage(
const std::experimental::filesystem::path &file_path);
433 std::atomic<size_t> stored_files_size_{};
443 std::atomic<size_t> active_write_file_size_{};
FileManagerStrategyOptions options_
std::unique_ptr< TokenStore > token_store_
std::unordered_map< std::string, std::list< DataToken > > file_tokens_
std::random_device rand_device
static constexpr const char * kEofKey
std::mutex active_write_file_mutex_
FileTokenInfo(const std::string &file_path, const long position, const bool eof)
std::unordered_map< std::string, FileTokenInfo > staged_tokens_
bool operator==(const FileTokenInfo &lhs, const FileTokenInfo &rhs)
std::unordered_map< DataToken, FileTokenInfo > token_store_
std::string getActiveWriteFile()
FileTokenInfo(std::string &&file_path, const long position, const bool eof)
static constexpr const char * kFilePathKey
TokenStoreOptions options_
void sanitizePath(std::string &path)
std::string serialize() const
static constexpr const char * kPositionKey
void deserialize(const std::string &token_info_json)
std::string active_write_file_
std::mutex active_read_file_mutex_
std::unique_ptr< std::ifstream > active_read_file_stream_
std::list< std::string > stored_files_
std::string active_read_file_
FileTokenInfo & operator=(const FileTokenInfo &other)=default
bool operator!=(const FileTokenInfo &lhs, const FileTokenInfo &rhs)