| 1637 | } |
| 1638 | |
| 1639 | void TableImpl::ScanMetaTableCallBack(std::string key_start, std::string key_end, |
| 1640 | std::string expand_key_end, int64_t start_time, |
| 1641 | ScanTabletRequest* request, ScanTabletResponse* response, |
| 1642 | bool failed, int error_code) { |
| 1643 | perf_counter_.get_meta.Add(get_micros() - start_time); |
| 1644 | perf_counter_.get_meta_cnt.Inc(); |
| 1645 | if (failed) { |
| 1646 | if (error_code == sofa::pbrpc::RPC_ERROR_SERVER_SHUTDOWN || |
| 1647 | error_code == sofa::pbrpc::RPC_ERROR_SERVER_UNREACHABLE || |
| 1648 | error_code == sofa::pbrpc::RPC_ERROR_SERVER_UNAVAILABLE) { |
| 1649 | response->set_status(kServerError); |
| 1650 | } else if (error_code == sofa::pbrpc::RPC_ERROR_REQUEST_CANCELED || |
| 1651 | error_code == sofa::pbrpc::RPC_ERROR_SEND_BUFFER_FULL) { |
| 1652 | response->set_status(kClientError); |
| 1653 | } else if (error_code == sofa::pbrpc::RPC_ERROR_CONNECTION_CLOSED || |
| 1654 | error_code == sofa::pbrpc::RPC_ERROR_RESOLVE_ADDRESS) { |
| 1655 | response->set_status(kConnectError); |
| 1656 | } else if (error_code == sofa::pbrpc::RPC_ERROR_REQUEST_TIMEOUT) { |
| 1657 | response->set_status(kRPCTimeout); |
| 1658 | } else { |
| 1659 | response->set_status(kRPCError); |
| 1660 | } |
| 1661 | } |
| 1662 | |
| 1663 | StatusCode err = response->status(); |
| 1664 | if (err != kTabletNodeOk) { |
| 1665 | VLOG(10) << "fail to scan meta table [" << request->start() << ", " << request->end() |
| 1666 | << "]: " << StatusCodeToString(err); |
| 1667 | { |
| 1668 | MutexLock lock(&meta_mutex_); |
| 1669 | GiveupUpdateTabletMeta(key_start, key_end); |
| 1670 | } |
| 1671 | ThreadPool::Task retry_task = std::bind(&TableImpl::ScanMetaTableAsyncInLock, this, key_start, |
| 1672 | key_end, expand_key_end, true); |
| 1673 | thread_pool_->DelayTask(FLAGS_tera_sdk_update_meta_internal, retry_task); |
| 1674 | delete request; |
| 1675 | delete response; |
| 1676 | return; |
| 1677 | } |
| 1678 | |
| 1679 | std::string return_start, return_end; |
| 1680 | const RowResult& scan_result = response->results(); |
| 1681 | for (int32_t i = 0; i < scan_result.key_values_size(); i++) { |
| 1682 | const KeyValuePair& kv = scan_result.key_values(i); |
| 1683 | |
| 1684 | TabletMeta meta; |
| 1685 | ParseMetaTableKeyValue(kv.key(), kv.value(), &meta); |
| 1686 | |
| 1687 | if (i == 0) { |
| 1688 | return_start = meta.key_range().key_start(); |
| 1689 | } |
| 1690 | if (i == scan_result.key_values_size() - 1) { |
| 1691 | return_end = meta.key_range().key_end(); |
| 1692 | } |
| 1693 | |
| 1694 | MutexLock lock(&meta_mutex_); |
| 1695 | UpdateTabletMetaList(meta); |
| 1696 | } |
no test coverage detected