Merge branch 'bugfix/nvs_page_selection' into 'master'

nvs: Fix page selection algo to consider free entry counts as well

See merge request idf/esp-idf!2240
This commit is contained in:
Ivan Grokhotkov
2018-04-16 10:32:01 +08:00
2 changed files with 32 additions and 9 deletions
+11 -9
View File
@@ -125,17 +125,18 @@ esp_err_t PageManager::requestNewPage()
}
// find the page with the higest number of erased items
TPageListIterator maxErasedItemsPageIt;
size_t maxErasedItems = 0;
TPageListIterator maxUnusedItemsPageIt;
size_t maxUnusedItems = 0;
for (auto it = begin(); it != end(); ++it) {
auto erased = it->getErasedEntryCount();
if (erased > maxErasedItems) {
maxErasedItemsPageIt = it;
maxErasedItems = erased;
auto unused = Page::ENTRY_COUNT - it->getUsedEntryCount();
if (unused > maxUnusedItems) {
maxUnusedItemsPageIt = it;
maxUnusedItems = unused;
}
}
if (maxErasedItems == 0) {
if (maxUnusedItems == 0) {
return ESP_ERR_NVS_NOT_ENOUGH_SPACE;
}
@@ -146,7 +147,8 @@ esp_err_t PageManager::requestNewPage()
Page* newPage = &mPageList.back();
Page* erasedPage = maxErasedItemsPageIt;
Page* erasedPage = maxUnusedItemsPageIt;
#ifndef NDEBUG
size_t usedEntries = erasedPage->getUsedEntryCount();
#endif
@@ -172,7 +174,7 @@ esp_err_t PageManager::requestNewPage()
assert(usedEntries == newPage->getUsedEntryCount());
#endif
mPageList.erase(maxErasedItemsPageIt);
mPageList.erase(maxUnusedItemsPageIt);
mFreePageList.push_back(erasedPage);
return ESP_OK;