Avoid reading GATT server for same advertisement

PiperOrigin-RevId: 558944228
This commit is contained in:
Guogang Li
2023-08-21 17:24:03 -07:00
committed by Copybara-Service
parent 96750db706
commit ea7aa00e0c
3 changed files with 33 additions and 1 deletions
@@ -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",
@@ -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<MultiThreadExecutor>(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<const ByteArray*> 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())
@@ -20,6 +20,9 @@
#include <string>
#include <vector>
#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<BleAdvertisement, GattAdvertisementInfo>
gatt_advertisement_infos_ ABSL_GUARDED_BY(mutex_);
// Tracks the advertisements in GATT fetching.
absl::flat_hash_set<ByteArray> fetching_advertisements_
ABSL_GUARDED_BY(mutex_);
std::unique_ptr<MultiThreadExecutor> executor_ ABSL_GUARDED_BY(mutex_) =
nullptr;
};