forked from espressif/esp-idf
Merge branch 'bugfix/nvs_set_blob_bug' into 'master'
nvs_flash: Fix nvs_set_blob hang when partition is near to FULL See merge request idf/esp-idf!3051
This commit is contained in:
@@ -180,6 +180,9 @@ esp_err_t Storage::writeMultiPageBlob(uint8_t nsIndex, const char* key, const vo
|
|||||||
err = mPageManager.requestNewPage();
|
err = mPageManager.requestNewPage();
|
||||||
if (err != ESP_OK) {
|
if (err != ESP_OK) {
|
||||||
return err;
|
return err;
|
||||||
|
} else if(getCurrentPage().getVarDataTailroom() == tailroom) {
|
||||||
|
/* We got the same page or we are not improving.*/
|
||||||
|
return ESP_ERR_NVS_NOT_ENOUGH_SPACE;
|
||||||
} else {
|
} else {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -257,7 +260,6 @@ esp_err_t Storage::writeItem(uint8_t nsIndex, ItemType datatype, const char* key
|
|||||||
err = findItem(nsIndex, datatype, key, findPage, item);
|
err = findItem(nsIndex, datatype, key, findPage, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) {
|
if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -280,6 +282,7 @@ esp_err_t Storage::writeItem(uint8_t nsIndex, ItemType datatype, const char* key
|
|||||||
}
|
}
|
||||||
/* Write the blob with new version*/
|
/* Write the blob with new version*/
|
||||||
err = writeMultiPageBlob(nsIndex, key, data, dataSize, nextStart);
|
err = writeMultiPageBlob(nsIndex, key, data, dataSize, nextStart);
|
||||||
|
|
||||||
if (err == ESP_ERR_NVS_PAGE_FULL) {
|
if (err == ESP_ERR_NVS_PAGE_FULL) {
|
||||||
return ESP_ERR_NVS_NOT_ENOUGH_SPACE;
|
return ESP_ERR_NVS_NOT_ENOUGH_SPACE;
|
||||||
}
|
}
|
||||||
|
@@ -1710,6 +1710,27 @@ TEST_CASE("Check that orphaned blobs are erased during init", "[nvs]")
|
|||||||
TEST_ESP_OK(storage.writeItem(1, ItemType::BLOB, "key3", blob, sizeof(blob)));
|
TEST_ESP_OK(storage.writeItem(1, ItemType::BLOB, "key3", blob, sizeof(blob)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("nvs code handles errors properly when partition is near to full", "[nvs]")
|
||||||
|
{
|
||||||
|
const size_t blob_size = Page::CHUNK_MAX_SIZE * 0.3 ;
|
||||||
|
uint8_t blob[blob_size] = {0x11};
|
||||||
|
SpiFlashEmulator emu(5);
|
||||||
|
Storage storage;
|
||||||
|
char nvs_key[16] = "";
|
||||||
|
|
||||||
|
TEST_ESP_OK(storage.init(0, 5));
|
||||||
|
|
||||||
|
/* Four pages should fit roughly 12 blobs*/
|
||||||
|
for(uint8_t count = 1; count <= 12; count++) {
|
||||||
|
sprintf(nvs_key, "key:%u", count);
|
||||||
|
TEST_ESP_OK(storage.writeItem(1, ItemType::BLOB, nvs_key, blob, sizeof(blob)));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(uint8_t count = 13; count <= 20; count++) {
|
||||||
|
sprintf(nvs_key, "key:%u", count);
|
||||||
|
TEST_ESP_ERR(storage.writeItem(1, ItemType::BLOB, nvs_key, blob, sizeof(blob)), ESP_ERR_NVS_NOT_ENOUGH_SPACE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("Check for nvs version incompatibility", "[nvs]")
|
TEST_CASE("Check for nvs version incompatibility", "[nvs]")
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user