def batch_patching()

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