Browse Source

Fix orphan blob accumulation on firmware upgrade

Before PR#1495, blobs were written for every advert regardless of
whether the advertiser became a contact. Nodes upgrading from older
firmware (e.g., v1.11.0) have thousands of orphan blobs consuming
storage space.

This adds a one-time cleanup on first boot that:
- Iterates all blob files in /bl/
- Deletes any blob that doesn't match a current contact's pub_key
- Creates a marker file to prevent running again

Affects ESP32 and RP2040 platforms (which use /bl/ directory).
pull/1601/head
Wessel Nieboer 4 months ago
committed by Wessel Nieboer
parent
commit
e53f49fd83
No known key found for this signature in database GPG Key ID: 929C8E45E33B5FD2
  1. 29
      examples/companion_radio/MyMesh.cpp

29
examples/companion_radio/MyMesh.cpp

@ -958,6 +958,35 @@ void MyMesh::begin(bool has_display) {
resetContacts();
_store->loadContacts(this);
bootstrapRTCfromContacts();
#if defined(ESP32) || defined(RP2040_PLATFORM)
// One-time cleanup of orphan blobs from pre-v1.13 firmware
FILESYSTEM* fs = _store->getPrimaryFS();
if (!fs->exists("/bl/.cleaned")) {
MESH_DEBUG_PRINTLN("Cleaning orphan blobs...");
File root = _store->openRead("/bl");
if (root) {
for (File f = root.openNextFile(); f; f = root.openNextFile()) {
const char* name = f.name();
f.close();
uint8_t key[8];
if (name[0] != '.' && strlen(name) == 16 && mesh::Utils::fromHex(key, 8, name)) {
bool found = false;
for (int i = 0; i < num_contacts && !found; i++)
found = (memcmp(contacts[i].id.pub_key, key, 8) == 0);
if (!found) _store->deleteBlobByKey(key, 8);
}
}
root.close();
}
#if defined(ESP32)
File m = fs->open("/bl/.cleaned", "w", true);
#else
File m = fs->open("/bl/.cleaned", "w");
#endif
if (m) m.close();
}
#endif
addChannel("Public", PUBLIC_GROUP_PSK); // pre-configure Andy's public channel
_store->loadChannels(this);

Loading…
Cancel
Save