Commit cb25fded authored by dtu's avatar dtu Committed by Commit bot

[telemetry] Use SetEvent signals instead of web server for IPPET power monitor.

Hopefully this will reduce flake and overhead from running the web server.

BUG=336558
TEST=Enable IppetPowerMonitor.CanMonitorPower(), then tools/telemetry/run_tests ippet on Windows.

Review URL: https://codereview.chromium.org/504333003

Cr-Commit-Position: refs/heads/master@{#292093}
parent 30e02313
...@@ -11,11 +11,9 @@ import platform ...@@ -11,11 +11,9 @@ import platform
import re import re
import shutil import shutil
import tempfile import tempfile
import urllib2
import zipfile import zipfile
from telemetry import decorators from telemetry import decorators
from telemetry.core import util
from telemetry.core.platform import platform_backend from telemetry.core.platform import platform_backend
from telemetry.core.platform import power_monitor from telemetry.core.platform import power_monitor
from telemetry.util import cloud_storage from telemetry.util import cloud_storage
...@@ -32,6 +30,10 @@ except ImportError: ...@@ -32,6 +30,10 @@ except ImportError:
win32process = None win32process = None
START_EVENT = 'ippet_StartEvent'
QUIT_EVENT = 'ippet_QuitEvent'
class IppetError(Exception): class IppetError(Exception):
pass pass
...@@ -68,7 +70,6 @@ class IppetPowerMonitor(power_monitor.PowerMonitor): ...@@ -68,7 +70,6 @@ class IppetPowerMonitor(power_monitor.PowerMonitor):
super(IppetPowerMonitor, self).__init__() super(IppetPowerMonitor, self).__init__()
self._backend = backend self._backend = backend
self._ippet_handle = None self._ippet_handle = None
self._ippet_port = None
self._output_dir = None self._output_dir = None
def CanMonitorPower(self): def CanMonitorPower(self):
...@@ -108,53 +109,63 @@ class IppetPowerMonitor(power_monitor.PowerMonitor): ...@@ -108,53 +109,63 @@ class IppetPowerMonitor(power_monitor.PowerMonitor):
def StartMonitoringPower(self, browser): def StartMonitoringPower(self, browser):
assert not self._ippet_handle, 'Called StartMonitoringPower() twice.' assert not self._ippet_handle, 'Called StartMonitoringPower() twice.'
self._output_dir = tempfile.mkdtemp() self._output_dir = tempfile.mkdtemp()
self._ippet_port = util.GetUnreservedAvailableLocalPort()
parameters = ['-log_dir', self._output_dir, parameters = ['-log_dir', self._output_dir,
'-web_port', str(self._ippet_port), '-signals', 'START,QUIT',
'-zip', 'n'] '-enable_web', 'n', '-zip', 'n']
self._ippet_handle = self._backend.LaunchApplication(
IppetPath(), parameters, elevate_privilege=True)
def IppetServerIsUp(): try:
try: with contextlib.closing(win32event.CreateEvent(
urllib2.urlopen('http://127.0.0.1:%d/ippet' % self._ippet_port, None, True, False, START_EVENT)) as start_event:
timeout=1).close() self._ippet_handle = self._backend.LaunchApplication(
except urllib2.URLError: IppetPath(), parameters, elevate_privilege=True)
return False wait_code = win32event.WaitForSingleObject(start_event, 5000)
return True if wait_code != win32event.WAIT_OBJECT_0:
util.WaitFor(IppetServerIsUp, timeout=5) if wait_code == win32event.WAIT_TIMEOUT:
raise IppetError('Timed out waiting for IPPET to start.')
else:
raise IppetError('Error code %d while waiting for IPPET to start.' %
wait_code)
except: # In case of emergency, don't leave IPPET processes hanging around.
if self._ippet_handle:
try:
exit_code = win32process.GetExitCodeProcess(self._ippet_handle)
if exit_code == win32con.STILL_ACTIVE:
win32process.TerminateProcess(self._ippet_handle, 0)
finally:
self._ippet_handle.Close()
self._ippet_handle = None
raise
def StopMonitoringPower(self): def StopMonitoringPower(self):
assert self._ippet_handle, ( assert self._ippet_handle, (
'Called StopMonitoringPower() before StartMonitoringPower().') 'Called StopMonitoringPower() before StartMonitoringPower().')
# Stop IPPET.
try: try:
ippet_quit_url = 'http://127.0.0.1:%d/ippet?cmd=quit' % self._ippet_port # Stop IPPET.
with contextlib.closing( with contextlib.closing(win32event.OpenEvent(
urllib2.urlopen(ippet_quit_url, timeout=5)) as response: win32event.EVENT_MODIFY_STATE, False, QUIT_EVENT)) as quit_event:
quit_output = response.read() win32event.SetEvent(quit_event)
if quit_output != 'quiting\r\n':
raise IppetError('Failed to quit IPPET: %s' % quit_output.strip()) # Wait for IPPET process to exit.
wait_return_code = win32event.WaitForSingleObject(self._ippet_handle, wait_code = win32event.WaitForSingleObject(self._ippet_handle, 20000)
20000) if wait_code != win32event.WAIT_OBJECT_0:
if wait_return_code != win32event.WAIT_OBJECT_0: if wait_code == win32event.WAIT_TIMEOUT:
if wait_return_code == win32event.WAIT_TIMEOUT:
raise IppetError('Timed out waiting for IPPET to close.') raise IppetError('Timed out waiting for IPPET to close.')
else: else:
raise IppetError('Error code %d while waiting for IPPET to close.' % raise IppetError('Error code %d while waiting for IPPET to close.' %
wait_return_code) wait_code)
finally:
finally: # If we need to, forcefully kill IPPET.
try: try:
ippet_exit_code = win32process.GetExitCodeProcess(self._ippet_handle) exit_code = win32process.GetExitCodeProcess(self._ippet_handle)
if ippet_exit_code == win32con.STILL_ACTIVE: if exit_code == win32con.STILL_ACTIVE:
win32process.TerminateProcess(self._ippet_handle) win32process.TerminateProcess(self._ippet_handle, 0)
raise IppetError('IPPET is still running but should have stopped.') raise IppetError('IPPET is still running but should have stopped.')
elif ippet_exit_code != 0: elif exit_code != 0:
raise IppetError('IPPET closed with exit code %d.' % ippet_exit_code) raise IppetError('IPPET closed with exit code %d.' % exit_code)
finally: finally:
self._ippet_handle.Close() self._ippet_handle.Close()
self._ippet_handle = None self._ippet_handle = None
self._ippet_port = None
# Read IPPET's log file. # Read IPPET's log file.
log_file = os.path.join(self._output_dir, 'ippet_log_processes.xls') log_file = os.path.join(self._output_dir, 'ippet_log_processes.xls')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment