Merge "Fix handling of INSUFFICIENT_RESOURCES in LoadEntry"

This commit is contained in:
Srujan Gaddam
2019-01-17 03:33:49 +00:00
committed by Android (Google) Code Review
3 changed files with 54 additions and 24 deletions

View File

@@ -152,8 +152,9 @@ CdmResponseType UsageTableHeader::AddEntry(
retry_count < kMaxCryptoRetries &&
status == INSUFFICIENT_CRYPTO_RESOURCES_3;
++retry_count) {
uint32_t entry_number_to_delete =
int64_t entry_number_to_delete =
GetRandomInRange(usage_entry_info_.size());
if (entry_number_to_delete < 0) break;
DeleteEntry(entry_number_to_delete, file_handle_.get(), metrics);
status = crypto_session->CreateUsageEntry(usage_entry_number);
@@ -215,17 +216,18 @@ CdmResponseType UsageTableHeader::LoadEntry(CryptoSession* crypto_session,
crypto_session->LoadUsageEntry(usage_entry_number, usage_entry);
// If loading a usage entry fails due to insufficient resources, release a
// random entry and try again.
// random entry different from |usage_entry_number| and try again. If there
// are no more entries to release, we fail.
for (uint32_t retry_count = 0;
retry_count < kMaxCryptoRetries &&
status == INSUFFICIENT_CRYPTO_RESOURCES_3;
++retry_count) {
uint32_t entry_number_to_delete =
GetRandomInRange(usage_entry_info_.size());
if (usage_entry_number != entry_number_to_delete) {
DeleteEntry(entry_number_to_delete, file_handle_.get(), metrics);
status = crypto_session->LoadUsageEntry(usage_entry_number, usage_entry);
}
// Get a random entry from the other entries.
int64_t entry_number_to_delete = GetRandomInRangeWithExclusion(
usage_entry_info_.size(), usage_entry_number);
if (entry_number_to_delete < 0) break;
DeleteEntry(entry_number_to_delete, file_handle_.get(), metrics);
status = crypto_session->LoadUsageEntry(usage_entry_number, usage_entry);
}
return status;
@@ -707,9 +709,26 @@ bool UsageTableHeader::UpgradeUsageInfoFromUsageTable(
return NO_ERROR;
}
uint32_t UsageTableHeader::GetRandomInRange(size_t upper_bound_inclusive) {
if (upper_bound_inclusive == 0) return 0;
return rand() / (RAND_MAX / upper_bound_inclusive + 1);
int64_t UsageTableHeader::GetRandomInRange(size_t upper_bound_exclusive) {
if (upper_bound_exclusive == 0) {
LOGE("upper_bound_exclusive must be > 0.");
return -1;
}
return (int)((double)rand() / ((double)RAND_MAX + 1) * upper_bound_exclusive);
}
int64_t UsageTableHeader::GetRandomInRangeWithExclusion(
size_t upper_bound_exclusive, size_t exclude) {
if ((upper_bound_exclusive <= 1) ||
(exclude >= upper_bound_exclusive)) {
LOGE(
"upper_bound_exclusive must be > 1 and exclude must be < "
"upper_bound_exclusive.");
return -1;
}
uint32_t random = GetRandomInRange(upper_bound_exclusive - 1);
if (random >= exclude) random++;
return random;
}
// TODO(fredgc): remove when b/65730828 is addressed