in src/core/src/core_logic/PatchInstaller.py [0:0]
def batch_patching(self, all_packages, all_package_versions, packages, package_versions, maintenance_window, package_manager):
stopwatch_for_batch_install_process = Stopwatch(self.env_layer, self.telemetry_writer, self.composite_logger)
stopwatch_for_batch_install_process.start()
total_packages_to_install_count = len(packages)
maintenance_window_batch_cutoff_reached = False
max_batch_size_for_packages = self.get_max_batch_size(maintenance_window, package_manager)
installed_update_count_in_batch_patching = 0
patch_installation_successful_in_batch_patching = True
for phase in range(Constants.PackageBatchConfig.MAX_PHASES_FOR_BATCH_PATCHING):
if len(packages) == 0:
break
if max_batch_size_for_packages <= 0:
maintenance_window_batch_cutoff_reached = True
break
stopwatch_for_phase = Stopwatch(self.env_layer, self.telemetry_writer, self.composite_logger)
stopwatch_for_phase.start()
installed_update_count, patch_installation_successful, maintenance_window_batch_cutoff_reached, packages, package_versions = self.install_packages_in_batches(
all_packages, all_package_versions, packages, package_versions, maintenance_window, package_manager, max_batch_size_for_packages)
installed_update_count_in_batch_patching += installed_update_count
if patch_installation_successful is False:
patch_installation_successful_in_batch_patching = False
stopwatch_for_phase.stop()
batch_phase_processing_perf_log = "[{0}={1}][{2}={3}][{4}={5}][{6}={7}][{8}={9}][{10}={11}][{12}={13}][{14}={15}]".format(Constants.PerfLogTrackerParams.TASK, "InstallPackagesInBatchInDifferentPhases",
"Phase", str(phase), "InstalledPackagesCount", str(installed_update_count), "SuccessfulParentPackageInstallCount", self.successful_parent_package_install_count, "FailedParentPackageInstallCount",
self.failed_parent_package_install_count, "RemainingPackagesToInstall", str(len(packages)), Constants.PerfLogTrackerParams.PATCH_OPERATION_SUCCESSFUL, str(patch_installation_successful),
"IsMaintenanceWindowBatchCutoffReached", str(maintenance_window_batch_cutoff_reached))
stopwatch_for_phase.write_telemetry_for_stopwatch(str(batch_phase_processing_perf_log))
max_batch_size_for_packages = int(max_batch_size_for_packages / Constants.PackageBatchConfig.BATCH_SIZE_DECAY_FACTOR)
if total_packages_to_install_count < max_batch_size_for_packages:
# All the packages will be attempted in single batch as max batch size is larger than total packages.
# All packages are already attempted in single batch as max batch size was higher than total packages in the last phase also.
# Avoiding same packages in a single batch again as the chances of failures is high.
break
stopwatch_for_batch_install_process.stop()
batch_processing_perf_log = "[{0}={1}][{2}={3}][{4}={5}][{6}={7}][{8}={9}][{10}={11}][{12}={13}][{14}={15}]".format(Constants.PerfLogTrackerParams.TASK, "InstallPackagesInBatches",
"InstalledPackagesCountInBatchProcessing", str(installed_update_count_in_batch_patching), "AttemptedParentPackageInstallCount", self.attempted_parent_package_install_count,
"SuccessfulParentPackageInstallCount", self.successful_parent_package_install_count, "FailedParentPackageInstallCount", self.failed_parent_package_install_count,
"RemainingPackagesToInstall", str(len(packages)), Constants.PerfLogTrackerParams.PATCH_OPERATION_SUCCESSFUL, str(patch_installation_successful_in_batch_patching),
"IsMaintenanceWindowBatchCutoffReached", str(maintenance_window_batch_cutoff_reached))
stopwatch_for_batch_install_process.write_telemetry_for_stopwatch(str(batch_processing_perf_log))
return packages, package_versions, installed_update_count_in_batch_patching, patch_installation_successful_in_batch_patching