fix(simulator): calculate LRU cache capacity dynamically at startup to
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Thu, 2 Feb 2023 19:17:03 +0000 (20:17 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Thu, 2 Feb 2023 19:19:14 +0000 (20:19 +0100)
avoid heavy evictions load

Properly calculate the number of charging stations and templates in use

Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/charging-station/Bootstrap.ts
src/charging-station/SharedLRUCache.ts

index 88b4b4c42c973193231aa5d9d4af582dd2f61b18..66a424193270ebc033f36dc49eda67fb8fc66c72 100644 (file)
@@ -38,11 +38,11 @@ enum exitCodes {
 
 export class Bootstrap {
   private static instance: Bootstrap | null = null;
+  public numberOfChargingStations!: number;
+  public numberOfChargingStationTemplates!: number;
   private workerImplementation: WorkerAbstract<ChargingStationWorkerData> | null;
   private readonly uiServer!: AbstractUIServer | null;
   private readonly storage!: Storage;
-  private numberOfChargingStationTemplates!: number | undefined;
-  private numberOfChargingStations!: number;
   private numberOfStartedChargingStations!: number;
   private readonly version: string = version;
   private started: boolean;
@@ -86,29 +86,21 @@ export class Bootstrap {
         await this.workerImplementation?.start();
         this.uiServer?.start();
         const stationTemplateUrls = Configuration.getStationTemplateUrls();
-        this.numberOfChargingStationTemplates = stationTemplateUrls?.length;
         // Start ChargingStation object in worker thread
-        if (!Utils.isEmptyArray(stationTemplateUrls)) {
-          for (const stationTemplateUrl of stationTemplateUrls) {
-            try {
-              const nbStations = stationTemplateUrl.numberOfStations ?? 0;
-              for (let index = 1; index <= nbStations; index++) {
-                await this.startChargingStation(index, stationTemplateUrl);
-              }
-            } catch (error) {
-              console.error(
-                chalk.red(
-                  `Error at starting charging station with template file ${stationTemplateUrl.file}: `
-                ),
-                error
-              );
+        for (const stationTemplateUrl of stationTemplateUrls) {
+          try {
+            const nbStations = stationTemplateUrl.numberOfStations ?? 0;
+            for (let index = 1; index <= nbStations; index++) {
+              await this.startChargingStation(index, stationTemplateUrl);
             }
+          } catch (error) {
+            console.error(
+              chalk.red(
+                `Error at starting charging station with template file ${stationTemplateUrl.file}: `
+              ),
+              error
+            );
           }
-        } else {
-          console.warn(
-            chalk.yellow("'stationTemplateUrls' not defined or empty in configuration, exiting")
-          );
-          process.exit(exitCodes.missingChargingStationsConfiguration);
         }
         if (this.numberOfChargingStations === 0) {
           console.warn(
@@ -256,6 +248,18 @@ export class Bootstrap {
   private initialize() {
     this.numberOfChargingStationTemplates = 0;
     this.numberOfChargingStations = 0;
+    const stationTemplateUrls = Configuration.getStationTemplateUrls();
+    if (!Utils.isEmptyArray(stationTemplateUrls)) {
+      this.numberOfChargingStationTemplates = stationTemplateUrls?.length;
+      stationTemplateUrls.forEach((stationTemplateUrl) => {
+        this.numberOfChargingStations += stationTemplateUrl.numberOfStations ?? 0;
+      });
+    } else {
+      console.warn(
+        chalk.yellow("'stationTemplateUrls' not defined or empty in configuration, exiting")
+      );
+      process.exit(exitCodes.missingChargingStationsConfiguration);
+    }
     this.numberOfStartedChargingStations = 0;
     this.initializeWorkerImplementation();
   }
@@ -286,7 +290,6 @@ export class Bootstrap {
       ),
     };
     await this.workerImplementation?.addElement(workerData);
-    ++this.numberOfChargingStations;
   }
 
   private logPrefix = (): string => {
index e235c51d1f930a764c1e2ef8198b792711254b31..db5269f5317e83508014ec374d36396f5a6ff856 100644 (file)
@@ -1,5 +1,6 @@
 import LRUCache from 'mnemonist/lru-map-with-delete';
 
+import { Bootstrap } from '../internal';
 import type { ChargingStationConfiguration } from '../types/ChargingStationConfiguration';
 import type { ChargingStationTemplate } from '../types/ChargingStationTemplate';
 import Utils from '../utils/Utils';
@@ -16,7 +17,10 @@ export default class SharedLRUCache {
   private readonly lruCache: LRUCache<string, CacheableType>;
 
   private constructor() {
-    this.lruCache = new LRUCache<string, CacheableType>(1000);
+    this.lruCache = new LRUCache<string, CacheableType>(
+      Bootstrap.getInstance().numberOfChargingStations +
+        Bootstrap.getInstance().numberOfChargingStationTemplates
+    );
   }
 
   public static getInstance(): SharedLRUCache {