| 190 | } |
| 191 | |
| 192 | void UpdateTableProcedure::UpdateTabletSchemaCallback(TabletPtr tablet, int32_t retry_times, |
| 193 | UpdateRequest* request, |
| 194 | UpdateResponse* response, bool rpc_failed, |
| 195 | int status_code) { |
| 196 | std::unique_ptr<UpdateRequest> request_holder(request); |
| 197 | std::unique_ptr<UpdateResponse> response_holder(response); |
| 198 | StatusCode status = response_holder->status(); |
| 199 | TabletNodePtr node = tablet->GetTabletNode(); |
| 200 | PROC_VLOG(23) << "tablet: " << tablet->GetPath() |
| 201 | << ", update schema callback returned, remain cnt: " << tablet_sync_cnt_; |
| 202 | if (tablet->GetStatus() == TabletMeta::kTabletOffline || |
| 203 | (!rpc_failed && status == kTabletNodeOk)) { |
| 204 | if (tablet->GetStatus() == TabletMeta::kTabletOffline) { |
| 205 | offline_tablets_.emplace_back(tablet); |
| 206 | } |
| 207 | // do not unlock offline tablets' TransitionLock. After all online tablets |
| 208 | // UpdateTabletSchema RPC |
| 209 | // has been collected, UpdateTableProcedure will issue LoadTabletProcedure |
| 210 | // for those offline tablets |
| 211 | // and those offline tablets will be locked until their LoadTabletProcedure |
| 212 | // finished. |
| 213 | else { |
| 214 | tablet->UnlockTransition(); |
| 215 | } |
| 216 | if (--tablet_sync_cnt_ == 0) { |
| 217 | PROC_VLOG(23) << "sync tablets schema finished"; |
| 218 | RecoverOfflineTablets(); |
| 219 | table_->CommitUpdate(); |
| 220 | EnterPhaseWithResponseStatus(kMasterOk, UpdateTablePhase::kEofPhase); |
| 221 | } |
| 222 | return; |
| 223 | } |
| 224 | |
| 225 | if (rpc_failed || status != kTabletNodeOk) { |
| 226 | if (rpc_failed) { |
| 227 | PROC_LOG(WARNING) << "[update] fail to update schema: " |
| 228 | << sofa::pbrpc::RpcErrorCodeToString(status_code) << ": " << tablet; |
| 229 | } else { |
| 230 | PROC_LOG(WARNING) << "[update] fail to update schema: " << StatusCodeToString(status) << ": " |
| 231 | << tablet; |
| 232 | } |
| 233 | if (retry_times > FLAGS_tera_master_schema_update_retry_times) { |
| 234 | PROC_LOG(ERROR) << "[update] retry " << retry_times << " times, kick " |
| 235 | << tablet->GetServerAddr(); |
| 236 | // we ensure tablet's schema been updated by kickoff the hosting |
| 237 | // tabletnode if all |
| 238 | // UpdateTabletSchema RPC tries failed |
| 239 | tablet->UnlockTransition(); |
| 240 | MasterEnv().GetMaster()->TryKickTabletNode(tablet->GetServerAddr()); |
| 241 | if (--tablet_sync_cnt_ == 0) { |
| 242 | RecoverOfflineTablets(); |
| 243 | table_->CommitUpdate(); |
| 244 | EnterPhaseWithResponseStatus(kMasterOk, UpdateTablePhase::kEofPhase); |
| 245 | } |
| 246 | } else { |
| 247 | UpdateClosure done = std::bind(&UpdateTableProcedure::UpdateTabletSchemaCallback, this, |
| 248 | tablet, retry_times + 1, _1, _2, _3, _4); |
| 249 | ThreadPool::Task task = |
nothing calls this directly
no test coverage detected