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

Remove new environment benchmark scores on configuration change #4680

Merged
merged 2 commits into from
Sep 9, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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