Internal refactoring related to file map cache

This commit is contained in:
Pavel Shevaev 2025-04-17 17:12:23 +03:00
parent d0f700c958
commit fc0aa1636e
3 changed files with 70 additions and 42 deletions

View File

@ -286,12 +286,19 @@ class ConfigCacheFileMap
return [$added, $removed]; return [$added, $removed];
} }
function init(array $files)
{
$this->file2deps = [];
foreach($files as $file)
$this->file2deps[$file] = [];
}
function update(array $added, array $removed) function update(array $added, array $removed)
{ {
foreach($added as $file) foreach($added as $file)
{ {
//TODO: are we sure about this check? //NOTE: we preserve existing files
if(isset($this->file2deps[$file])) if(!isset($this->file2deps[$file]))
$this->file2deps[$file] = []; $this->file2deps[$file] = [];
} }
foreach($removed as $file) foreach($removed as $file)
@ -339,6 +346,9 @@ class ConfigCacheUpdateResult
class ConfigCacheUpdateParams class ConfigCacheUpdateParams
{ {
const MAX_DEFAULT_WORKERS = 5;
const FILES_THRESHOLD_ONE_WORKER = 100;
public ConfigGlobals $globals; public ConfigGlobals $globals;
public ConfigDirFiles $affected_files; public ConfigDirFiles $affected_files;
public bool $verbose = false; public bool $verbose = false;
@ -356,10 +366,9 @@ class ConfigCacheUpdateParams
function calcMaxWorkers() : int function calcMaxWorkers() : int
{ {
$max_workers = $this->max_workers; if($this->affected_files->count() < self::FILES_THRESHOLD_ONE_WORKER)
if($max_workers === null) return 1;
$max_workers = $this->affected_files->count() < 100 ? 1 : 5; return $this->max_workers ?? self::MAX_DEFAULT_WORKERS;
return $max_workers;
} }
function splitFilesByChunks(int $max_workers, bool $sort = true) : array function splitFilesByChunks(int $max_workers, bool $sort = true) : array

View File

@ -37,8 +37,8 @@ class ConfigGlobals
enum ConfigUpdateMode : int enum ConfigUpdateMode : int
{ {
case All = 1; case Force = 1;
case AllChanged = 2; case DetectChanged = 2;
case Patch = 3; case Patch = 3;
} }
@ -50,29 +50,29 @@ class ConfigUpdateRequest
private function __construct() {} private function __construct() {}
static function all(?ConfigDirFiles $files = null) : ConfigUpdateRequest static function force(?ConfigDirFiles $files = null) : ConfigUpdateRequest
{ {
$update = new ConfigUpdateRequest(); $req = new ConfigUpdateRequest();
$update->mode = ConfigUpdateMode::All; $req->mode = ConfigUpdateMode::Force;
$update->files = $files; $req->files = $files;
return $update; return $req;
} }
static function allChanged(string $result_file, ?ConfigDirFiles $files = null) : ConfigUpdateRequest static function detectChanged(string $result_file, ?ConfigDirFiles $files = null) : ConfigUpdateRequest
{ {
$update = new ConfigUpdateRequest(); $req = new ConfigUpdateRequest();
$update->mode = ConfigUpdateMode::Patch; $req->mode = ConfigUpdateMode::DetectChanged;
$update->files = $files; $req->files = $files;
$update->result_file = $result_file; $req->result_file = $result_file;
return $update; return $req;
} }
static function patch(ConfigDirFiles $files) : ConfigUpdateRequest static function patch(ConfigDirFiles $files) : ConfigUpdateRequest
{ {
$update = new ConfigUpdateRequest(); $req = new ConfigUpdateRequest();
$update->mode = ConfigUpdateMode::Patch; $req->mode = ConfigUpdateMode::Patch;
$update->files = $files; $req->files = $files;
return $update; return $req;
} }
} }
@ -128,7 +128,7 @@ class ConfigManager
function updateCache(ConfigUpdateRequest $req, bool $verbose = false) : ConfigCacheUpdateResult function updateCache(ConfigUpdateRequest $req, bool $verbose = false) : ConfigCacheUpdateResult
{ {
config_log("Updating cache, mode {$req->mode->value}..."); config_log("Updating cache, mode '{$req->mode->name}'...");
if($req->files === null) if($req->files === null)
$req->files = $this->scanFiles(extension: '.js', verbose: $verbose); $req->files = $this->scanFiles(extension: '.js', verbose: $verbose);
@ -154,6 +154,31 @@ class ConfigManager
$this->cache->clear(); $this->cache->clear();
$this->_updateFileMap($req, $affected_files, $added_files, $removed_files);
return $update_result;
}
private function _checkFileMap(ConfigUpdateRequest $req, array &$added_files, array &$removed_files)
{
$fs_cache_map = $this->getFileMap();
if($req->mode === ConfigUpdateMode::Force)
{
$added_files = $req->files->getAllFiles();
//let's rebuild the file map
$fs_cache_map->init($added_files);
config_log("File map init: ".count($added_files));
}
else if($req->mode === ConfigUpdateMode::DetectChanged)
{
list($added_files, $removed_files) = $fs_cache_map->compare($req->files->getAllFiles());
config_log("File map compare, added: ".count($added_files).", removed: ".count($removed_files));
}
}
private function _updateFileMap(ConfigUpdateRequest $req, ConfigDirFiles $affected_files, array $added_files, array $removed_files)
{
$fs_cache_map = $this->getFileMap(); $fs_cache_map = $this->getFileMap();
//TODO: traverse all affected files and update file map //TODO: traverse all affected files and update file map
@ -165,22 +190,11 @@ class ConfigManager
if($affected_files->count() > 0 || $added_files || $removed_files) if($affected_files->count() > 0 || $added_files || $removed_files)
{ {
//in case of Force map was already cleared and initialized
if($req->mode != ConfigUpdateMode::Force)
$fs_cache_map->update($added_files, $removed_files); $fs_cache_map->update($added_files, $removed_files);
$this->_saveFileMap(); $this->_saveFileMap();
} }
return $update_result;
}
private function _checkFileMap(ConfigUpdateRequest $req, array &$added_files, array &$removed_files)
{
$fs_cache_map = $this->_getFileMap($req->mode != ConfigUpdateMode::Patch ? $req->files : null);
if($req->mode === ConfigUpdateMode::All || $req->mode === ConfigUpdateMode::AllChanged)
{
list($added_files, $removed_files) = $fs_cache_map->compare($req->files->getAllFiles());
config_log("File map added: ".count($added_files).", removed: ".count($removed_files));
}
} }
private function _getAffectedFiles(ConfigUpdateRequest $req, array $removed_files) : ConfigDirFiles private function _getAffectedFiles(ConfigUpdateRequest $req, array $removed_files) : ConfigDirFiles
@ -189,11 +203,11 @@ class ConfigManager
$affected_files = null; $affected_files = null;
if($req->mode === ConfigUpdateMode::All) if($req->mode === ConfigUpdateMode::Force)
{ {
$affected_files = $req->files; $affected_files = $req->files;
} }
else if($req->mode === ConfigUpdateMode::AllChanged) else if($req->mode === ConfigUpdateMode::DetectChanged)
{ {
$affected_files = ConfigDirFiles::makeFor($this); $affected_files = ConfigDirFiles::makeFor($this);
@ -273,7 +287,7 @@ class ConfigManager
{ {
config_log("Creating file map"); config_log("Creating file map");
$map = new ConfigCacheFileMap(); $map = new ConfigCacheFileMap();
$map->update($files->getAllFiles(), []); $map->init($files->getAllFiles());
return $map; return $map;
} }

View File

@ -27,6 +27,11 @@ class ConfigDirFiles implements \ArrayAccess, \Countable, \Iterator
return new ConfigDirFiles([], $mgr->getGlobals()->base_dirs); return new ConfigDirFiles([], $mgr->getGlobals()->base_dirs);
} }
static function makeFromArtefactFiles(\taskman\artefact\TaskmanDirFiles $files) : ConfigDirFiles
{
return new ConfigDirFiles($files->toMap());
}
function clear() function clear()
{ {
$this->base_dir2files = array(); $this->base_dir2files = array();