Loading include/common/rpc/distributor.hpp +36 −0 Original line number Diff line number Diff line Loading @@ -102,6 +102,42 @@ public: locate_directory_metadata(const std::string& path) const override; }; class ECCDistributor : public Distributor { private: host_t localhost_; unsigned int hosts_size_{0}; unsigned int ecc_size_{0}; std::vector<host_t> all_hosts_; std::hash<std::string> str_hash; public: ECCDistributor(); ECCDistributor(host_t localhost, unsigned int hosts_size, unsigned int ecc_size); unsigned int hosts_size() const override; host_t localhost() const override; host_t locate_data(const std::string& path, const chunkid_t& chnk_id, const int num_copy) const override; host_t locate_data(const std::string& path, const chunkid_t& chnk_id, unsigned int host_size, const int num_copy); host_t locate_file_metadata(const std::string& path, const int num_copy) const override; std::vector<host_t> locate_directory_metadata(const std::string& path) const override; }; class LocalOnlyDistributor : public Distributor { private: host_t localhost_; Loading src/common/rpc/distributor.cpp +55 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,61 @@ SimpleHashDistributor::locate_directory_metadata(const string& path) const { return all_hosts_; } ECCDistributor::ECCDistributor(host_t localhost, unsigned int hosts_size, unsigned int ecc_size) : localhost_(localhost), hosts_size_(hosts_size), ecc_size_(ecc_size), all_hosts_(hosts_size) { ::iota(all_hosts_.begin(), all_hosts_.end(), 0); } ECCDistributor::ECCDistributor() {} host_t ECCDistributor::localhost() const { return localhost_; } unsigned int ECCDistributor::hosts_size() const { return hosts_size_; } host_t ECCDistributor::locate_data(const string& path, const chunkid_t& chnk_id, const int num_copy) const { if(num_copy == 0) { return (str_hash(path + ::to_string(chnk_id))) % (hosts_size_ - ecc_size_); } else { return (num_copy + (hosts_size_ - ecc_size_)); } } host_t ECCDistributor::locate_data(const string& path, const chunkid_t& chnk_id, unsigned int hosts_size, const int num_copy) { if(hosts_size_ != hosts_size) { hosts_size_ = hosts_size; all_hosts_ = std::vector<unsigned int>(hosts_size); ::iota(all_hosts_.begin(), all_hosts_.end(), 0); } return (locate_data(path, chnk_id, num_copy)); } host_t ECCDistributor::locate_file_metadata(const string& path, const int num_copy) const { return (str_hash(path) + num_copy) % hosts_size_; } ::vector<host_t> ECCDistributor::locate_directory_metadata(const string& path) const { return all_hosts_; } LocalOnlyDistributor::LocalOnlyDistributor(host_t localhost) : localhost_(localhost) {} Loading Loading
include/common/rpc/distributor.hpp +36 −0 Original line number Diff line number Diff line Loading @@ -102,6 +102,42 @@ public: locate_directory_metadata(const std::string& path) const override; }; class ECCDistributor : public Distributor { private: host_t localhost_; unsigned int hosts_size_{0}; unsigned int ecc_size_{0}; std::vector<host_t> all_hosts_; std::hash<std::string> str_hash; public: ECCDistributor(); ECCDistributor(host_t localhost, unsigned int hosts_size, unsigned int ecc_size); unsigned int hosts_size() const override; host_t localhost() const override; host_t locate_data(const std::string& path, const chunkid_t& chnk_id, const int num_copy) const override; host_t locate_data(const std::string& path, const chunkid_t& chnk_id, unsigned int host_size, const int num_copy); host_t locate_file_metadata(const std::string& path, const int num_copy) const override; std::vector<host_t> locate_directory_metadata(const std::string& path) const override; }; class LocalOnlyDistributor : public Distributor { private: host_t localhost_; Loading
src/common/rpc/distributor.cpp +55 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,61 @@ SimpleHashDistributor::locate_directory_metadata(const string& path) const { return all_hosts_; } ECCDistributor::ECCDistributor(host_t localhost, unsigned int hosts_size, unsigned int ecc_size) : localhost_(localhost), hosts_size_(hosts_size), ecc_size_(ecc_size), all_hosts_(hosts_size) { ::iota(all_hosts_.begin(), all_hosts_.end(), 0); } ECCDistributor::ECCDistributor() {} host_t ECCDistributor::localhost() const { return localhost_; } unsigned int ECCDistributor::hosts_size() const { return hosts_size_; } host_t ECCDistributor::locate_data(const string& path, const chunkid_t& chnk_id, const int num_copy) const { if(num_copy == 0) { return (str_hash(path + ::to_string(chnk_id))) % (hosts_size_ - ecc_size_); } else { return (num_copy + (hosts_size_ - ecc_size_)); } } host_t ECCDistributor::locate_data(const string& path, const chunkid_t& chnk_id, unsigned int hosts_size, const int num_copy) { if(hosts_size_ != hosts_size) { hosts_size_ = hosts_size; all_hosts_ = std::vector<unsigned int>(hosts_size); ::iota(all_hosts_.begin(), all_hosts_.end(), 0); } return (locate_data(path, chnk_id, num_copy)); } host_t ECCDistributor::locate_file_metadata(const string& path, const int num_copy) const { return (str_hash(path) + num_copy) % hosts_size_; } ::vector<host_t> ECCDistributor::locate_directory_metadata(const string& path) const { return all_hosts_; } LocalOnlyDistributor::LocalOnlyDistributor(host_t localhost) : localhost_(localhost) {} Loading