6
6
7
7
#include " aos/sm/layermanager.hpp"
8
8
#include " aos/common/tools/fs.hpp"
9
+ #include " aos/common/tools/semver.hpp"
9
10
#include " log.hpp"
10
11
11
12
namespace aos ::sm::layermanager {
@@ -147,15 +148,13 @@ Error LayerManager::ProcessDesiredLayers(const Array<LayerInfo>& desiredLayers,
147
148
148
149
LOG_DBG () << " Process desired layers" ;
149
150
150
- auto storageLayers = MakeUnique<LayerDataStaticArray >(&mAllocator );
151
+ auto layersToInstall = MakeUnique<LayerInfoStaticArray >(&mAllocator , desiredLayers );
151
152
152
- if (auto err = mStorage -> GetAllLayers (*storageLayers ); !err.IsNone ()) {
153
+ if (auto err = UpdateCachedLayers (layerStatuses, *layersToInstall ); !err.IsNone ()) {
153
154
return AOS_ERROR_WRAP (err);
154
155
}
155
156
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 ()) {
159
158
return AOS_ERROR_WRAP (err);
160
159
}
161
160
@@ -255,6 +254,35 @@ Error LayerManager::RemoveItem(const String& id)
255
254
* Private
256
255
**********************************************************************************************************************/
257
256
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
+
258
286
Error LayerManager::RemoveDamagedLayerFolders ()
259
287
{
260
288
LOG_DBG () << " Remove damaged layer folders" ;
@@ -406,16 +434,31 @@ Error LayerManager::RemoveLayerFromSystem(const LayerData& layer)
406
434
return ErrorEnum::eNone;
407
435
}
408
436
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)
411
438
{
412
439
LOG_DBG () << " Update cached layers" ;
413
440
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) {
416
449
return storageLayer.mLayerDigest == desiredLayer.mLayerDigest ;
417
450
});
418
451
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
+
419
462
if (auto err = statuses.EmplaceBack (
420
463
storageLayer.mLayerID , storageLayer.mLayerDigest , storageLayer.mVersion , ItemStatusEnum::eInstalled);
421
464
!err.IsNone ()) {
@@ -426,23 +469,13 @@ Error LayerManager::UpdateCachedLayers(
426
469
statuses.Back ().SetError (err, ItemStatusEnum::eError);
427
470
}
428
471
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 ()) {
443
474
return AOS_ERROR_WRAP (err);
444
475
}
445
476
}
477
+
478
+ layersToInstall.Erase (layer);
446
479
}
447
480
448
481
return ErrorEnum::eNone;
0 commit comments