Skip to content
This repository has been archived by the owner on Oct 31, 2023. It is now read-only.

Commit

Permalink
Remove new environment benchmark scores on configuration change (#4680)
Browse files Browse the repository at this point in the history
  • Loading branch information
mfranciszkiewicz committed Sep 16, 2019
1 parent 4dfc1d4 commit 0f24ede
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 11 deletions.
10 changes: 10 additions & 0 deletions golem/task/envmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from typing import Dict, List, Type, Optional

from dataclasses import dataclass
from peewee import PeeweeException
from twisted.internet.defer import Deferred, inlineCallbacks

from golem.envs import EnvId, Environment, EnvMetadata
Expand Down Expand Up @@ -125,3 +126,12 @@ def get_cached_performance(env_id: EnvId) -> Optional[float]:
return Performance.get(Performance.environment_id == env_id).value
except Performance.DoesNotExist:
return None

@staticmethod
def remove_cached_performance(env_id: EnvId) -> None:
try:
query = Performance.delete().where(
Performance.environment_id == env_id)
query.execute()
except PeeweeException:
logger.exception(f"Cannot clear performance score for '{env_id}'")
24 changes: 16 additions & 8 deletions golem/task/taskserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -699,14 +699,22 @@ def _change_task_computer_config(
run_benchmarks: bool,
) -> Deferred:
config_changed = yield self.task_computer.change_config(config_desc)
if config_changed or run_benchmarks:
self.task_computer.lock_config(True)
deferred = Deferred()
self.benchmark_manager.run_all_benchmarks(
deferred.callback, deferred.errback
)
yield deferred
self.task_computer.lock_config(False)
if config_changed:
self._remove_env_performance_scores()
elif not run_benchmarks:
return

self.task_computer.lock_config(True)
deferred = Deferred()
self.benchmark_manager.run_all_benchmarks(
deferred.callback, deferred.errback)
yield deferred
self.task_computer.lock_config(False)

def _remove_env_performance_scores(self) -> None:
env_manager = self.task_keeper.new_env_manager
for env_id in env_manager.environments():
env_manager.remove_cached_performance(env_id)

def get_task_computer_root(self):
return os.path.join(self.client.datadir, "ComputerRes")
Expand Down
7 changes: 7 additions & 0 deletions tests/golem/task/test_envmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,3 +172,10 @@ def test_cached_performance(self):
perf = 123.4
Performance.update_or_create(self.env_id, perf)
self.assertEqual(perf, self.manager.get_cached_performance(self.env_id))

def test_remove_cached_performance(self):
perf = 123.4
Performance.update_or_create(self.env_id, perf)
self.assertEqual(perf, self.manager.get_cached_performance(self.env_id))
self.manager.remove_cached_performance(self.env_id)
self.assertIsNone(self.manager.get_cached_performance(self.env_id))
14 changes: 11 additions & 3 deletions tests/golem/task/test_taskserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -1487,10 +1487,11 @@ def test(self):
change_pcs_config.assert_called_once_with(self.ts, config_desc)


@patch('golem.task.envmanager.EnvironmentManager.remove_cached_performance')
class ChangeTaskComputerConfig(TaskServerAsyncTestBase):

@defer.inlineCallbacks
def test_config_unchanged_no_benchmarks(self):
def test_config_unchanged_no_benchmarks(self, remove_performance):
change_tc_config = self._patch_ts_async('task_computer').change_config
change_tc_config.return_value = defer.succeed(False)
run_benchmarks = self._patch_ts_async('benchmark_manager')\
Expand All @@ -1500,13 +1501,15 @@ def test_config_unchanged_no_benchmarks(self):
yield self.ts._change_task_computer_config(config_desc, False)
change_tc_config.assert_called_once_with(config_desc)
run_benchmarks.assert_not_called()
remove_performance.assert_not_called()

@defer.inlineCallbacks
def test_config_changed_no_benchmarks(self):
def test_config_changed_no_benchmarks(self, remove_performance):
task_computer = self._patch_ts_async('task_computer')
task_computer.change_config.return_value = defer.succeed(True)
run_benchmarks = self._patch_ts_async('benchmark_manager')\
.run_all_benchmarks
env_manager = self.ts.task_keeper.new_env_manager

def _check(callback, _):
task_computer.lock_config.assert_called_once_with(True)
Expand All @@ -1520,9 +1523,13 @@ def _check(callback, _):
task_computer.change_config.assert_called_once_with(config_desc)
task_computer.lock_config.assert_called_once_with(False)
run_benchmarks.assert_called_once()
remove_performance.assert_has_calls(
[call(env_id) for env_id in env_manager.environments()],
any_order=True
)

@defer.inlineCallbacks
def test_config_unchanged_run_benchmarks(self):
def test_config_unchanged_run_benchmarks(self, remove_performance):
task_computer = self._patch_ts_async('task_computer')
task_computer.change_config.return_value = defer.succeed(False)
run_benchmarks = self._patch_ts_async('benchmark_manager')\
Expand All @@ -1540,6 +1547,7 @@ def _check(callback, _):
task_computer.change_config.assert_called_once_with(config_desc)
task_computer.lock_config.assert_called_once_with(False)
run_benchmarks.assert_called_once()
remove_performance.assert_not_called()


class TestTaskServerConcent(TaskServerAsyncTestBase):
Expand Down

0 comments on commit 0f24ede

Please # to comment.