| 91 | } |
| 92 | |
| 93 | void LoadTabletProcedure::LoadTabletAsync(TabletNodePtr dest_node) { |
| 94 | if (dest_node->NodeDown()) { |
| 95 | LOG(WARNING) << "dest node offline, giveup this load try node: " << dest_node->GetAddr(); |
| 96 | return; |
| 97 | } |
| 98 | |
| 99 | tabletnode::TabletNodeClient node_client(thread_pool_, dest_node->GetAddr(), |
| 100 | FLAGS_tera_master_load_rpc_timeout); |
| 101 | LoadTabletRequest* request = new LoadTabletRequest; |
| 102 | LoadTabletResponse* response = new LoadTabletResponse; |
| 103 | request->set_tablet_name(tablet_->GetTableName()); |
| 104 | request->set_sequence_id(MasterEnv().SequenceId().Inc()); |
| 105 | request->mutable_key_range()->set_key_start(tablet_->GetKeyStart()); |
| 106 | request->mutable_key_range()->set_key_end(tablet_->GetKeyEnd()); |
| 107 | request->set_path(tablet_->GetPath()); |
| 108 | request->mutable_schema()->CopyFrom(tablet_->GetSchema()); |
| 109 | request->set_session_id(dest_node->uuid_); |
| 110 | request->set_create_time(tablet_->CreateTime()); |
| 111 | request->set_version(tablet_->Version()); |
| 112 | TablePtr table = tablet_->GetTable(); |
| 113 | TabletMeta meta; |
| 114 | tablet_->ToMeta(&meta); |
| 115 | PROC_CHECK(meta.parent_tablets_size() <= 2) |
| 116 | << "too many parents tablets: " << meta.parent_tablets_size(); |
| 117 | for (int32_t i = 0; i < meta.parent_tablets_size(); ++i) { |
| 118 | request->add_parent_tablets(meta.parent_tablets(i)); |
| 119 | } |
| 120 | |
| 121 | std::vector<std::string> ignore_err_lgs; |
| 122 | tablet_->GetErrorIgnoredLGs(&ignore_err_lgs); |
| 123 | for (uint32_t i = 0; i < ignore_err_lgs.size(); ++i) { |
| 124 | PROC_VLOG(6) << "tablet:" << tablet_->GetPath() |
| 125 | << " Add ignore err lg to request :" << ignore_err_lgs[i]; |
| 126 | request->add_ignore_err_lgs(ignore_err_lgs[i]); |
| 127 | } |
| 128 | tablet_->SetErrorIgnoredLGs(); // clean error lg, only for this request once |
| 129 | |
| 130 | PROC_LOG(INFO) << "LoadTabletAsync id: " << request->sequence_id() << ", " << tablet_; |
| 131 | // Bind "dest_node" to the first parameter of LoadTabletCallback as dest_node |
| 132 | // may decay to kOffline state |
| 133 | // and we initiate RPC to a new started TabletNode on the same IP:PORT before |
| 134 | // we apperceive it |
| 135 | // under which case we may have a success rpc with status code being |
| 136 | // "kIllegalAccess" |
| 137 | // NOTICE: explicit cast from shared_ptr to weak_ptr is necessary! |
| 138 | LoadClosure done = |
| 139 | std::bind(&LoadTabletProcedure::LoadTabletCallbackWrapper, |
| 140 | std::weak_ptr<LoadTabletProcedure>(shared_from_this()), dest_node, _1, _2, _3, _4); |
| 141 | node_client.LoadTablet(request, response, done); |
| 142 | } |
| 143 | |
| 144 | void LoadTabletProcedure::LoadTabletCallbackWrapper(std::weak_ptr<LoadTabletProcedure> weak_proc, |
| 145 | TabletNodePtr node, LoadTabletRequest* request, |