diff --git a/be/src/olap/tablet_manager.cpp b/be/src/olap/tablet_manager.cpp index af2bd599a9..78baf0f34f 100644 --- a/be/src/olap/tablet_manager.cpp +++ b/be/src/olap/tablet_manager.cpp @@ -1496,9 +1496,16 @@ void TabletManager::get_tablets_distribution_on_different_disks( std::map> &tablets_num_on_disk, std::map>> &tablets_info_on_disk) { std::vector data_dirs = StorageEngine::instance()->get_stores(); - ReadLock rlock(&_partition_tablet_map_lock); - std::map>::iterator partition_iter = _partition_tablet_map.begin(); - for (; partition_iter != _partition_tablet_map.end(); partition_iter++) { + std::map> partition_tablet_map; + { + // When drop tablet, '_partition_tablet_map_lock' is locked in 'tablet_shard_lock'. + // To avoid locking 'tablet_shard_lock' in '_partition_tablet_map_lock', we lock and + // copy _partition_tablet_map here. + ReadLock rlock(&_partition_tablet_map_lock); + partition_tablet_map = _partition_tablet_map; + } + std::map>::iterator partition_iter = partition_tablet_map.begin(); + for (; partition_iter != partition_tablet_map.end(); partition_iter++) { std::map tablets_num; std::map> tablets_info; for(int i = 0; i < data_dirs.size(); i++) { @@ -1507,7 +1514,11 @@ void TabletManager::get_tablets_distribution_on_different_disks( int64_t partition_id = partition_iter->first; std::set::iterator tablet_info_iter = (partition_iter->second).begin(); for(; tablet_info_iter != (partition_iter->second).end(); tablet_info_iter++) { + // get_tablet() will hold 'tablet_shard_lock' TabletSharedPtr tablet = get_tablet(tablet_info_iter->tablet_id, tablet_info_iter->schema_hash); + if (tablet == nullptr) { + continue; + } DataDir* data_dir = tablet->data_dir(); size_t tablet_footprint = tablet->tablet_footprint(); tablets_num[data_dir]++;