Skip to content

Commit 5e3d6d4

Browse files
committed
[sm,layermanager] Clear cached layers if they exceed app limit
Signed-off-by: Mykhailo Lohvynenko <Mykhailo_Lohvynenko@epam.com>
1 parent d7120f7 commit 5e3d6d4

File tree

3 files changed

+65
-26
lines changed

3 files changed

+65
-26
lines changed

include/aos/sm/layermanager.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -272,13 +272,13 @@ class LayerManager : public LayerManagerItf, public spaceallocator::ItemRemoverI
272272
= Max(cNumInstallThreads * (sizeof(oci::ImageManifest) + sizeof(LayerData)) + sizeof(LayerDataStaticArray),
273273
sizeof(LayerDataStaticArray) + sizeof(FS::DirIterator) * 2);
274274

275+
Error PrepareSpaceForLayers(size_t desiredLayersNum);
275276
Error RemoveDamagedLayerFolders();
276277
Error SetOutdatedLayers();
277278
Error SetLayerState(const LayerData& layer, LayerState state);
278279
Error RemoveOutdatedLayers();
279280
Error RemoveLayerFromSystem(const LayerData& layer);
280-
Error UpdateCachedLayers(
281-
const Array<LayerData>& stored, Array<LayerStatus>& statuses, Array<aos::LayerInfo>& result);
281+
Error UpdateCachedLayers(Array<LayerStatus>& statuses, Array<aos::LayerInfo>& layersToInstall);
282282
Error InstallLayer(const aos::LayerInfo& layer);
283283

284284
Config mConfig = {};

src/sm/layermanager/layermanager.cpp

+56-23
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include "aos/sm/layermanager.hpp"
88
#include "aos/common/tools/fs.hpp"
9+
#include "aos/common/tools/semver.hpp"
910
#include "log.hpp"
1011

1112
namespace aos::sm::layermanager {
@@ -147,15 +148,13 @@ Error LayerManager::ProcessDesiredLayers(const Array<LayerInfo>& desiredLayers,
147148

148149
LOG_DBG() << "Process desired layers";
149150

150-
auto storageLayers = MakeUnique<LayerDataStaticArray>(&mAllocator);
151+
auto layersToInstall = MakeUnique<LayerInfoStaticArray>(&mAllocator, desiredLayers);
151152

152-
if (auto err = mStorage->GetAllLayers(*storageLayers); !err.IsNone()) {
153+
if (auto err = UpdateCachedLayers(layerStatuses, *layersToInstall); !err.IsNone()) {
153154
return AOS_ERROR_WRAP(err);
154155
}
155156

156-
auto layersToInstall = MakeUnique<LayerInfoStaticArray>(&mAllocator, desiredLayers);
157-
158-
if (auto err = UpdateCachedLayers(*storageLayers, layerStatuses, *layersToInstall); !err.IsNone()) {
157+
if (auto err = PrepareSpaceForLayers(layersToInstall->Size()); !err.IsNone()) {
159158
return AOS_ERROR_WRAP(err);
160159
}
161160

@@ -255,6 +254,35 @@ Error LayerManager::RemoveItem(const String& id)
255254
* Private
256255
**********************************************************************************************************************/
257256

257+
Error LayerManager::PrepareSpaceForLayers(size_t desiredLayersNum)
258+
{
259+
auto installedLayers = MakeUnique<LayerDataStaticArray>(&mAllocator);
260+
261+
if (auto err = mStorage->GetAllLayers(*installedLayers); !err.IsNone()) {
262+
return AOS_ERROR_WRAP(err);
263+
}
264+
265+
installedLayers->Sort([](const LayerData& lhs, const LayerData& rhs) {
266+
return semver::CompareSemver(lhs.mVersion, rhs.mVersion).mValue == -1;
267+
});
268+
269+
while (installedLayers->Size() + desiredLayersNum > cMaxNumLayers) {
270+
auto it
271+
= installedLayers->FindIf([](const LayerData& layer) { return layer.mState == LayerStateEnum::eCached; });
272+
if (it == installedLayers->end()) {
273+
return ErrorEnum::eNoMemory;
274+
}
275+
276+
if (auto err = RemoveLayerFromSystem(*it); !err.IsNone()) {
277+
return AOS_ERROR_WRAP(err);
278+
}
279+
280+
installedLayers->Erase(it);
281+
}
282+
283+
return ErrorEnum::eNone;
284+
}
285+
258286
Error LayerManager::RemoveDamagedLayerFolders()
259287
{
260288
LOG_DBG() << "Remove damaged layer folders";
@@ -406,16 +434,31 @@ Error LayerManager::RemoveLayerFromSystem(const LayerData& layer)
406434
return ErrorEnum::eNone;
407435
}
408436

409-
Error LayerManager::UpdateCachedLayers(
410-
const Array<LayerData>& stored, Array<LayerStatus>& statuses, Array<LayerInfo>& result)
437+
Error LayerManager::UpdateCachedLayers(Array<LayerStatus>& statuses, Array<LayerInfo>& layersToInstall)
411438
{
412439
LOG_DBG() << "Update cached layers";
413440

414-
for (const auto& storageLayer : stored) {
415-
auto layer = result.FindIf([&storageLayer](const auto& desiredLayer) {
441+
auto storageLayers = MakeUnique<LayerDataStaticArray>(&mAllocator);
442+
443+
if (auto err = mStorage->GetAllLayers(*storageLayers); !err.IsNone()) {
444+
return AOS_ERROR_WRAP(err);
445+
}
446+
447+
for (const auto& storageLayer : *storageLayers) {
448+
auto layer = layersToInstall.FindIf([&storageLayer](const auto& desiredLayer) {
416449
return storageLayer.mLayerDigest == desiredLayer.mLayerDigest;
417450
});
418451

452+
if (layer == layersToInstall.end()) {
453+
if (storageLayer.mState != LayerStateEnum::eCached) {
454+
if (auto err = SetLayerState(storageLayer, LayerStateEnum::eCached); !err.IsNone()) {
455+
return AOS_ERROR_WRAP(err);
456+
}
457+
}
458+
459+
continue;
460+
}
461+
419462
if (auto err = statuses.EmplaceBack(
420463
storageLayer.mLayerID, storageLayer.mLayerDigest, storageLayer.mVersion, ItemStatusEnum::eInstalled);
421464
!err.IsNone()) {
@@ -426,23 +469,13 @@ Error LayerManager::UpdateCachedLayers(
426469
statuses.Back().SetError(err, ItemStatusEnum::eError);
427470
}
428471

429-
if (layer != result.end()) {
430-
if (storageLayer.mState == LayerStateEnum::eCached) {
431-
if (auto err = SetLayerState(storageLayer, LayerStateEnum::eActive); !err.IsNone()) {
432-
return AOS_ERROR_WRAP(err);
433-
}
434-
}
435-
436-
result.Erase(layer);
437-
438-
continue;
439-
}
440-
441-
if (storageLayer.mState != LayerStateEnum::eCached) {
442-
if (auto err = SetLayerState(storageLayer, LayerStateEnum::eCached); !err.IsNone()) {
472+
if (storageLayer.mState == LayerStateEnum::eCached) {
473+
if (auto err = SetLayerState(storageLayer, LayerStateEnum::eActive); !err.IsNone()) {
443474
return AOS_ERROR_WRAP(err);
444475
}
445476
}
477+
478+
layersToInstall.Erase(layer);
446479
}
447480

448481
return ErrorEnum::eNone;

tests/sm/layermanager/layermanager_test.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,12 @@ TEST_F(LayerManagerTest, ProcessDesiredLayers)
286286
{{"layer1", "layer2", "layer3"}, {"sha256:layer1", "sha256:layer2", "sha256:layer3"}, {}, {}},
287287
{{"layer1", "layer3"}, {"sha256:layer1", "sha256:layer3"}, {"sha256:layer2"}, {}},
288288
{{"layer1", "layer2"}, {"sha256:layer1", "sha256:layer2"}, {"sha256:layer3"}, {"sha256:layer2"}},
289+
{{"l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8"},
290+
{"sha256:l1", "sha256:l2", "sha256:l3", "sha256:l4", "sha256:l5", "sha256:l6", "sha256:l7", "sha256:l8"},
291+
{"sha256:layer1", "sha256:layer2"}, {}},
292+
{{"l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8"},
293+
{"sha256:l1", "sha256:l2", "sha256:l3", "sha256:l4", "sha256:l5", "sha256:l6", "sha256:l7", "sha256:l8"},
294+
{}, {}},
289295
};
290296

291297
SetProcessDesiredLayerExpectedCalls();
@@ -304,7 +310,7 @@ TEST_F(LayerManagerTest, ProcessDesiredLayers)
304310
FAIL() << "Invalid layer status";
305311
}
306312

307-
StaticArray<LayerData, 4> dbLayers;
313+
StaticArray<LayerData, cMaxNumLayers> dbLayers;
308314

309315
err = mStorage.GetAllLayers(dbLayers);
310316
ASSERT_TRUE(err.IsNone()) << err.Message();

0 commit comments

Comments
 (0)