Skip to content

Commit

Permalink
0.9.16
Browse files Browse the repository at this point in the history
  • Loading branch information
vinifmor authored Apr 6, 2021
2 parents 8a81ae4 + 6feedf4 commit f1f496c
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 29 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

## [0.9.16] 2021-04-06
### Fixes
- Arch
- not skipping dependency checking when the user opts to proceed with a transaction that would break other packages
- AUR: not restoring the CPUs to previous scaling governors after the package is built when optimizations are on
- randomly crashing when solving repository packages dependencies (RuntimeError: dictionary changed size during iteration)


## [0.9.15] 2021-03-03
### Improvements
- UI
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ suggestions:

c) `ccache` will be added to `BUILDENV` if it is installed on the system and already not defined

d) set the device processors to performance mode
d) set the device CPUs to performance scaling governor

Obs: For more information about them, have a look at [Makepkg](https://wiki.archlinux.org/index.php/Makepkg)

Expand Down
2 changes: 1 addition & 1 deletion bauh/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = '0.9.15'
__version__ = '0.9.16'
__app_name__ = 'bauh'

import os
Expand Down
15 changes: 7 additions & 8 deletions bauh/gems/arch/controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -1944,23 +1944,22 @@ def _build(self, context: TransactionContext) -> bool:

# building main package
context.watcher.change_substatus(self.i18n['arch.building.package'].format(bold(context.name)))
optimize = bool(context.config['optimize']) and cpu_manager.supports_performance_mode() and not cpu_manager.all_in_performance()
optimize = bool(context.config['optimize']) and cpu_manager.supports_performance_mode()

cpus_changed, cpu_prev_governors = False, None

cpu_optimized = False
if optimize:
self.logger.info("Setting cpus to performance mode")
cpu_manager.set_mode('performance', context.root_password)
cpu_optimized = True
cpus_changed, cpu_prev_governors = cpu_manager.set_all_cpus_to('performance', context.root_password, self.logger)

try:
pkgbuilt, output = makepkg.make(pkgdir=context.project_dir,
optimize=optimize,
handler=context.handler,
custom_pkgbuild=context.custom_pkgbuild_path)
finally:
if cpu_optimized:
self.logger.info("Setting cpus to powersave mode")
cpu_manager.set_mode('powersave', context.root_password)
if cpus_changed and cpu_prev_governors:
self.logger.info("Restoring CPU governors")
cpu_manager.set_cpus(cpu_prev_governors, context.root_password, {'performance'}, self.logger)

self._update_progress(context, 65)

Expand Down
73 changes: 56 additions & 17 deletions bauh/gems/arch/cpu_manager.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import multiprocessing
import os
import traceback
from logging import Logger
from typing import Optional, Set, Tuple, Dict

from bauh.commons.system import new_root_subprocess

Expand All @@ -9,30 +11,67 @@ def supports_performance_mode():
return os.path.exists('/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor')


def all_in_performance() -> bool:
for i in range(multiprocessing.cpu_count()):
with open('/sys/devices/system/cpu/cpu{}/cpufreq/scaling_governor'.format(i)) as f:
if f.read().strip() != 'performance':
return False
def current_governors() -> Dict[str, Set[int]]:
governors = {}
for cpu in range(multiprocessing.cpu_count()):
with open('/sys/devices/system/cpu/cpu{}/cpufreq/scaling_governor'.format(cpu)) as f:
gov = f.read().strip()
cpus = governors.get(gov, set())
cpus.add(cpu)
governors[gov] = cpus

return False
return governors


def set_mode(mode: str, root_password: str):
def set_governor(governor: str, root_password: str, cpu_idxs: Optional[Set[int]] = None):
new_gov_file = '/tmp/bauh_scaling_governor'
with open(new_gov_file, 'w+') as f:
f.write(mode)
f.write(governor)

for i in range(multiprocessing.cpu_count()):
for idx in (cpu_idxs if cpu_idxs else range(multiprocessing.cpu_count())):
_change_governor(idx, new_gov_file, root_password)

if os.path.exists(new_gov_file):
try:
gov_file = '/sys/devices/system/cpu/cpu{}/cpufreq/scaling_governor'.format(i)
replace = new_root_subprocess(['cp', new_gov_file, gov_file], root_password=root_password)
replace.wait()
os.remove(new_gov_file)
except:
traceback.print_exc()

if os.path.exists(new_gov_file):
try:
os.remove(new_gov_file)
except:
traceback.print_exc()

def _change_governor(cpu_idx: int, new_gov_file_path: str, root_password: str):
try:
gov_file = '/sys/devices/system/cpu/cpu{}/cpufreq/scaling_governor'.format(cpu_idx)
replace = new_root_subprocess(['cp', new_gov_file_path, gov_file], root_password=root_password)
replace.wait()
except:
traceback.print_exc()


def set_all_cpus_to(governor: str, root_password: str, logger: Optional[Logger] = None) -> Tuple[bool, Optional[Dict[str, Set[int]]]]:
"""
"""
cpus_changed, cpu_governors = False, current_governors()

if cpu_governors:
not_in_performance = set()
for gov, cpus in cpu_governors.items():
if gov != governor:
not_in_performance.update(cpus)

if not_in_performance:
if logger:
logger.info("Changing CPUs {} governors to '{}'".format(not_in_performance, governor))

set_governor(governor, root_password, not_in_performance)
cpus_changed = True

return cpus_changed, cpu_governors


def set_cpus(governors: Dict[str, Set[int]], root_password: str, ignore_governors: Optional[Set[str]] = None, logger: Optional[Logger] = None):
for gov, cpus in governors.items():
if not ignore_governors or gov not in ignore_governors:
if logger:
logger.info("Changing CPUs {} governors to '{}'".format(cpus, gov))

set_governor(gov, root_password, cpus)
2 changes: 1 addition & 1 deletion bauh/gems/arch/dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@ def map_missing_deps(self, pkgs_data: Dict[str, dict], provided_map: Dict[str, S
for t in aur_threads:
t.join()

missing_subdeps = self.map_missing_deps(pkgs_data=deps_data, provided_map=provided_map, aur_index=aur_index,
missing_subdeps = self.map_missing_deps(pkgs_data={**deps_data}, provided_map=provided_map, aur_index=aur_index,
deps_checked=deps_checked, sort=False, deps_data=deps_data,
watcher=watcher,
remote_provided_map=remote_provided_map,
Expand Down
2 changes: 1 addition & 1 deletion bauh/gems/arch/pacman.py
Original file line number Diff line number Diff line change
Expand Up @@ -723,7 +723,7 @@ def upgrade_several(pkgnames: Iterable[str], root_password: str, overwrite_confl
cmd.append('--overwrite=*')

if skip_dependency_checks:
cmd.append('-d')
cmd.append('-dd')

return SimpleProcess(cmd=cmd,
root_password=root_password,
Expand Down

0 comments on commit f1f496c

Please sign in to comment.