Internal refactoring related to file map cache
This commit is contained in:
parent
d0f700c958
commit
fc0aa1636e
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue