From 75d3ade093190bab69a2d24453c77a5b931e558f Mon Sep 17 00:00:00 2001 From: Alex Dale Date: Tue, 11 Jul 2023 15:19:39 -0700 Subject: [PATCH] Close session during capacity check. [ Merge of http://go/wvgerrit/181151 ] [ Cherry-pick of http://ag/24103737 ] For devices with a large number of usage entries, when restoring the usage table a capacity check is performed. This checks that a new entry can be created. This test was originally added as some devices might enter a "stuck" state the table cannot be initialized. To perform this test, a temporary crypto session is created and an entry is created for that session. After successfully creating that entry, the entry is deleted. However, because the session was left open, the entry could not be deleted. This change closes the capacity-check-session before deleting the entry, as well as includes additional logs for helping future debugs. Bug: 286176947 Bug: 291351287 Test: usage_table_header_unittest Test: Android GTS R11 on oriole Change-Id: I6923de00175f70b2392bfe581ca5f9ae60c4af25 (cherry picked from commit 8b4bbeeb6f440c48a3250b961f7a7dab2472d7e9) (cherry picked from commit bb925c46e5f9b9574b43d30112820fd997cac4dd) --- .../cdm/core/src/cdm_usage_table.cpp | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/libwvdrmengine/cdm/core/src/cdm_usage_table.cpp b/libwvdrmengine/cdm/core/src/cdm_usage_table.cpp index 5a99c78b..b3e65827 100644 --- a/libwvdrmengine/cdm/core/src/cdm_usage_table.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_usage_table.cpp @@ -384,6 +384,9 @@ CdmResponseType CdmUsageTable::InvalidateEntryInternal( // sent back to the caller for the CDM as a whole to handle. const uint32_t pre_defrag_store_counter = store_table_counter_; const CdmResponseType status = DefragTable(device_files, metrics); + if (status != NO_ERROR) { + LOGW("Failed to defrag usage table: sts = %s", status.ToString().c_str()); + } if (pre_defrag_store_counter == store_table_counter_) { // It is possible that DefragTable() does not result in any // changes to the table, and as a result, it will not store the @@ -470,6 +473,10 @@ bool CdmUsageTable::CapacityCheck(CryptoSession* const crypto_session) { return false; } + // Session must be closed before invalidating, otherwise Shrink() will + // fail in call to InvalidateEntry(). + local_crypto_session->Close(); + status = InvalidateEntry(temporary_entry_index, /* defrag_table = */ true, device_files_.get(), metrics); @@ -482,7 +489,10 @@ bool CdmUsageTable::CapacityCheck(CryptoSession* const crypto_session) { // The entry should have been deleted from the usage table, // not just marked as type unknown. Failure to call // Shrink() may be an indicator of other issues. - LOGE("Failed to shrink table for capacity test"); + LOGE( + "Failed to shrink table for capacity test: " + "post_check_size = %zu, check_usage_entry_number = %u", + entry_info_list_.size(), temporary_entry_index); return false; } return true; @@ -954,7 +964,12 @@ CdmResponseType CdmUsageTable::DefragTable(DeviceFiles* device_files, if (entries_to_move.empty()) { LOGD("No valid entries found, shrinking entire table: size = %zu", entry_info_list_.size()); - return Shrink(metrics, static_cast(entry_info_list_.size())); + const CdmResponseType status = + Shrink(metrics, static_cast(entry_info_list_.size())); + if (status != NO_ERROR) { + LOGE("Failed to shrink table: sts = %s", status.ToString().c_str()); + } + return status; } // Step 3: Ignore invalid entries that are after the last valid @@ -978,7 +993,11 @@ CdmResponseType CdmUsageTable::DefragTable(DeviceFiles* device_files, last_valid_entry - 1; LOGD("Removing all entries after the last valid entry: count = %u", to_remove); - return Shrink(metrics, to_remove); + const CdmResponseType status = Shrink(metrics, to_remove); + if (status != NO_ERROR) { + LOGE("Failed to shrink table: sts = %s", status.ToString().c_str()); + } + return status; } // Step 4: Move the valid entries to overwrite the invalid entries. @@ -1106,7 +1125,12 @@ CdmResponseType CdmUsageTable::DefragTable(DeviceFiles* device_files, LOGD( "All entries have been invalidated, shrinking entire table: size = %zu", entry_info_list_.size()); - return Shrink(metrics, static_cast(entry_info_list_.size())); + const CdmResponseType status = + Shrink(metrics, static_cast(entry_info_list_.size())); + if (status != NO_ERROR) { + LOGE("Failed to shrink table: sts = %s", status.ToString().c_str()); + } + return status; } const UsageEntryIndex to_remove = @@ -1125,7 +1149,11 @@ CdmResponseType CdmUsageTable::DefragTable(DeviceFiles* device_files, // Step 6: Shrink table to the new size. LOGD("Clean up complete, shrinking table: count = %u", to_remove); - return Shrink(metrics, to_remove); + const CdmResponseType status = Shrink(metrics, to_remove); + if (status != NO_ERROR) { + LOGE("Failed to shrink table: sts = %s", status.ToString().c_str()); + } + return status; } // End Defrag(). CdmResponseType CdmUsageTable::ReleaseOldestEntry(