From ea7aa00e0cd99a0fab900ae55e727fd5acf672fd Mon Sep 17 00:00:00 2001 From: Guogang Li Date: Mon, 21 Aug 2023 17:22:37 -0700 Subject: [PATCH] Avoid reading GATT server for same advertisement PiperOrigin-RevId: 558944228 --- .../implementation/mediums/ble_v2/BUILD | 1 + .../ble_v2/discovered_peripheral_tracker.cc | 26 ++++++++++++++++++- .../ble_v2/discovered_peripheral_tracker.h | 7 +++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/connections/implementation/mediums/ble_v2/BUILD b/connections/implementation/mediums/ble_v2/BUILD index cd9321e8..17241f9e 100644 --- a/connections/implementation/mediums/ble_v2/BUILD +++ b/connections/implementation/mediums/ble_v2/BUILD @@ -50,6 +50,7 @@ cc_library( "//internal/platform:uuid", "//proto/mediums:ble_frames_cc_proto", "@aappleby_smhasher//:libmurmur3", + "@com_google_absl//absl/base:core_headers", "@com_google_absl//absl/container:flat_hash_map", "@com_google_absl//absl/container:flat_hash_set", "@com_google_absl//absl/numeric:int128", diff --git a/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.cc b/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.cc index 3153ca1f..806cf3dc 100644 --- a/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.cc +++ b/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.cc @@ -30,6 +30,7 @@ #include "connections/implementation/mediums/ble_v2/bloom_filter.h" #include "internal/flags/nearby_flags.h" #include "internal/platform/ble_v2.h" +#include "internal/platform/byte_array.h" #include "internal/platform/logging.h" #include "internal/platform/multi_thread_executor.h" #include "internal/platform/mutex_lock.h" @@ -521,13 +522,35 @@ void DiscoveredPeripheralTracker::HandleAdvertisementHeader( << absl::BytesToHexString( ByteArray(advertisement_header).data()) << " in thread"; + ByteArray advertisement_data{advertisement_header}; + if (fetching_advertisements_.contains(advertisement_data)) { + NEARBY_LOGS(VERBOSE) << ": Ignore the advertisement header due to it " + "is already in fetcing."; + return; + } + + fetching_advertisements_.insert(advertisement_data); + if (executor_ == nullptr) { // The situation happens when flag value changed executor_ = std::make_unique(kGattThreadCount); } executor_->Execute([this, peripheral, advertisement_header, advertisement_fetcher = - std::move(advertisement_fetcher)]() { + std::move(advertisement_fetcher), + advertisement_data = + std::move(advertisement_data)]() { + { + MutexLock lock(&mutex_); + if (!IsInterestingAdvertisementHeader(advertisement_header)) { + NEARBY_LOGS(INFO) + << ": Ignore to read raw advertisement from server due to it " + "is not interesting header now."; + fetching_advertisements_.erase(advertisement_data); + return; + } + } + std::vector gatt_advertisement_bytes_list = FetchRawAdvertisementsInThread(peripheral, advertisement_header, std::move(advertisement_fetcher)); @@ -537,6 +560,7 @@ void DiscoveredPeripheralTracker::HandleAdvertisementHeader( gatt_advertisement_bytes_list, /*service_uuid=*/{}); UpdateCommonStateForFoundBleAdvertisement(advertisement_header); + fetching_advertisements_.erase(advertisement_data); NEARBY_LOGS(VERBOSE) << ": Completed to handle GATT advertisement " << absl::BytesToHexString(ByteArray(advertisement_header).data()) diff --git a/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.h b/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.h index 423514cb..fcd59951 100644 --- a/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.h +++ b/connections/implementation/mediums/ble_v2/discovered_peripheral_tracker.h @@ -20,6 +20,9 @@ #include #include +#include "absl/base/thread_annotations.h" +#include "absl/container/flat_hash_map.h" +#include "absl/container/flat_hash_set.h" #include "connections/implementation/mediums//lost_entity_tracker.h" #include "connections/implementation/mediums/ble_v2/advertisement_read_result.h" #include "connections/implementation/mediums/ble_v2/ble_advertisement.h" @@ -289,6 +292,10 @@ class DiscoveredPeripheralTracker { absl::flat_hash_map gatt_advertisement_infos_ ABSL_GUARDED_BY(mutex_); + // Tracks the advertisements in GATT fetching. + absl::flat_hash_set fetching_advertisements_ + ABSL_GUARDED_BY(mutex_); + std::unique_ptr executor_ ABSL_GUARDED_BY(mutex_) = nullptr; };