query_object_client::socket_data* query_object_client::get_socket(const std::string& objectkey) { boost::lock_guard<boost::mutex> guard(lock); std::map<std::string, socket_data*>::iterator iter = sockets.find(objectkey); if (iter != sockets.end()) return iter->second; else { // create a socket socket_data* newsock = new socket_data; newsock->creation_time = time(NULL); newsock->key = objectkey; newsock->randid = ((uint64_t)(rand()) << 32) + rand(); std::string masterkey = get_zk_objectkey_name(objectkey, 0); std::vector<std::string> slavekeys; for (size_t i = 1; i <= replica_count; ++i) { slavekeys.push_back(get_zk_objectkey_name(objectkey, i)); } newsock->sock = new async_request_socket(z_ctx, zk_keyval, masterkey, slavekeys); newsock->sock->add_to_pollset(&pollset); sockets[objectkey] = newsock; return newsock; } }
bool replica_election(graphlab::zookeeper_util::key_value* zk_keyval, std::string objectkey, size_t replicaid) { // the actual election process. Simply try to insert the object std::cout << "Joining replica election: " << objectkey << ":" << replicaid << "\n"; // If we fail to insert. we lose the election return zk_keyval->insert(get_zk_objectkey_name(objectkey, replicaid), ""); }