Avoid very long media metrics deletion blocks
Could see a large block of items expire, which were all done under a
mutex. This blocks other media requests as well as causing long latency
for the current request. Change expiration so we do at most 50 at a
time, so the current thread can respond to its client. If more are due to expire,
fork a separate thread to continue in similar 50-element bursts,
allowing other clients insertion requests to enter between those bursts.
Bug: 109850816
Test: with shorter timeout and limits
Change-Id: I774a0a1bb7fbb81e12b14c540557d23fb055e3f1
diff --git a/services/mediaanalytics/MediaAnalyticsService.h b/services/mediaanalytics/MediaAnalyticsService.h
index b3c902a..632c692 100644
--- a/services/mediaanalytics/MediaAnalyticsService.h
+++ b/services/mediaanalytics/MediaAnalyticsService.h
@@ -26,6 +26,8 @@
#include <utils/String8.h>
#include <utils/List.h>
+#include <future>
+
#include <media/IMediaAnalyticsService.h>
namespace android {
@@ -44,6 +46,8 @@
MediaAnalyticsService();
virtual ~MediaAnalyticsService();
+ bool processExpirations();
+
private:
MediaAnalyticsItem::SessionID_t generateUniqueSessionID();
@@ -65,6 +69,8 @@
int32_t mMaxRecords;
// by time (none older than this long agan
nsecs_t mMaxRecordAgeNs;
+ // max to expire per expirations_l() invocation
+ int32_t mMaxRecordsExpiredAtOnce;
//
// # of sets of summaries
int32_t mMaxRecordSets;
@@ -79,6 +85,9 @@
List<MediaAnalyticsItem *> mItems;
void saveItem(MediaAnalyticsItem *);
+ bool expirations_l(MediaAnalyticsItem *);
+ std::future<bool> mExpireFuture;
+
// support for generating output
int mDumpProto;
int mDumpProtoDefault;