Skip to content

Commit 2b0b687

Browse files
authored
Merge branch 'GoogleCloudPlatform:master' into swap-encryption-pr1-shared-infra_new
2 parents c3eb3bf + ae6156e commit 2b0b687

12 files changed

Lines changed: 107 additions & 31 deletions

File tree

CHANGES.next.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
bringing this variant more in-line with others.
128128
- Rename GKE Autopilot & EKS Auto mode's cluster_type within PKB from
129129
'Autopilot' to 'Auto'.
130+
- Duplicate metadata for all samples.
130131

131132
### New features:
132133

@@ -469,6 +470,7 @@
469470
`--use_managed_vm_groups`.
470471
- Add support for configuring IMDSv2 Http Tokens on AWS VMs via
471472
`aws_metadata_http_tokens`.
473+
- Add aggregate memtier results to `kubernetes_redis_memtier` benchmark.
472474

473475
### Bug fixes and maintenance updates:
474476

perfkitbenchmarker/linux_benchmarks/cluster_boot_benchmark.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@
168168
)
169169
_COLLECT_BTIME = flags.DEFINE_boolean(
170170
'cluster_boot_collect_btime',
171-
True,
171+
False,
172172
'Collect btime from /proc/stat. This should be the same as kernel_start '
173173
'from linux_boot, but does not require a startup script.',
174174
)

perfkitbenchmarker/linux_benchmarks/kubernetes_redis_memtier_benchmark.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,9 @@ def _RunMemtier(
213213
pipeline=pipeline,
214214
)
215215

216-
return result.GetSamples(metadata)
216+
samples = result.GetSamples(metadata)
217+
samples.extend(memtier.AggregateMemtierResults([result], metadata))
218+
return samples
217219

218220

219221
class MemtierRunConfig(NamedTuple):

perfkitbenchmarker/linux_packages/fortran.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import logging
1717
from absl import flags
18+
from perfkitbenchmarker import errors
1819

1920
VERSION = flags.DEFINE_integer(
2021
'fortran_version', None, 'Version of gfortran to install'
@@ -33,7 +34,7 @@ def YumInstall(vm):
3334
_YumInstallVersion(vm, VERSION.value)
3435
else:
3536
vm.InstallPackages('gcc-gfortran libgfortran')
36-
_LogFortranVersion(vm)
37+
logging.info('Version of fortran: %s', GetFortranVersion(vm))
3738

3839

3940
def AptInstall(vm):
@@ -42,7 +43,7 @@ def AptInstall(vm):
4243
_AptInstallVersion(vm, VERSION.value)
4344
else:
4445
vm.InstallPackages('gfortran')
45-
_LogFortranVersion(vm)
46+
logging.info('Version of fortran: %s', GetFortranVersion(vm))
4647

4748

4849
def _YumInstallVersion(vm, version):
@@ -73,7 +74,18 @@ def _AptInstallVersion(vm, version):
7374
)
7475

7576

76-
def _LogFortranVersion(vm):
77-
"""Logs the version of gfortran."""
78-
txt, _ = vm.RemoteCommand('gfortran -dumpversion')
79-
logging.info('Version of fortran: %s', txt.strip())
77+
def GetFortranVersion(vm, required_version_prefix: str | None = None) -> str:
78+
"""Returns the full version of gfortran e.g. 11.5.0."""
79+
txt, _ = vm.RemoteCommand('gfortran -dumpfullversion')
80+
version = txt.strip()
81+
if not required_version_prefix and VERSION.value:
82+
required_version_prefix = str(VERSION.value)
83+
84+
if required_version_prefix and not version.startswith(
85+
required_version_prefix
86+
):
87+
raise errors.Benchmarks.PrepareException(
88+
f'gfortran version {version} does not match expected version'
89+
f' {required_version_prefix}'
90+
)
91+
return version

perfkitbenchmarker/linux_packages/speccpu.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from perfkitbenchmarker import sample
2727
from perfkitbenchmarker import stages
2828
from perfkitbenchmarker.linux_packages import build_tools
29+
from perfkitbenchmarker.linux_packages import fortran
2930

3031
BASE_MODE = 'base'
3132
PEAK_MODE = 'peak'
@@ -290,9 +291,10 @@ def InstallSPECCPU(vm, speccpu_vm_state):
290291
def Install(vm):
291292
"""Installs SPECCPU dependencies."""
292293
vm.Install('wget')
293-
vm.Install('fortran')
294294
# Install gcc, g++, fortran according to --gcc_version
295295
vm.Install('build_tools')
296+
# Verify fortran is installed correctly
297+
fortran.GetFortranVersion(vm, required_version_prefix=FLAGS.gcc_version)
296298

297299
# Install libxcrypt-compat is needed on RHEL 9 based OSes, but not available
298300
# on RHEL 8 based OSes.
@@ -505,6 +507,7 @@ def _ExtractScore(stdout, vm, keep_partial_results, runspec_metric):
505507
'spec17_fdo': FLAGS.spec17_fdo,
506508
'spec17_subset': FLAGS.spec17_subset,
507509
'gcc_version': build_tools.GetVersion(vm, 'gcc'),
510+
'gfortran_version': fortran.GetFortranVersion(vm),
508511
}
509512
if cpu_version:
510513
major, minor = cpu_version
@@ -551,12 +554,15 @@ def _ExtractScore(stdout, vm, keep_partial_results, runspec_metric):
551554
missing_results.append(spec_name)
552555

553556
if missing_results:
557+
missing_results_str = ','.join(missing_results)
554558
if keep_partial_results:
555559
metadata['partial'] = 'true'
556-
metadata['missing_results'] = ','.join(missing_results)
560+
metadata['missing_results'] = missing_results_str
561+
for result in results:
562+
result.metadata.update(metadata)
557563
else:
558564
raise errors.Benchmarks.RunError(
559-
'speccpu: results missing, see log: ' + ','.join(missing_results)
565+
'speccpu: results missing, see log: ' + missing_results_str
560566
)
561567

562568
if spec_score:

perfkitbenchmarker/providers/gcp/gce_virtual_machine.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,6 +1077,11 @@ def _ParseCreateErrors(
10771077
# Occurs when creating a large number >30 of VMs in parallel.
10781078
if 'gcloud crashed (SSLError)' in stderr:
10791079
raise errors.Resource.RetryableCreationError(stderr)
1080+
if (
1081+
'The global or regional External IP resource pool is exhausted'
1082+
in stderr
1083+
):
1084+
raise errors.Benchmarks.InsufficientCapacityCloudFailure(stderr)
10801085
raise errors.Resource.CreationError(
10811086
f'Failed to create VM {self.name}:\n{stderr}\nreturn code: {retcode}'
10821087
)

perfkitbenchmarker/sample.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,14 @@ def __new__(
136136
if timestamp is None:
137137
timestamp = time.time()
138138

139+
metadata = metadata or {}
140+
metadata = metadata.copy()
139141
return super().__new__(
140142
cls,
141143
metric,
142144
float(value or 0.0),
143145
unit,
144-
metadata=metadata or {},
146+
metadata=metadata,
145147
timestamp=timestamp,
146148
**kwargs,
147149
)

tests/gce_virtual_machine_test.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,6 +1104,14 @@ def testCreateVMSubnetworkNotReady(self):
11041104
),
11051105
'expected_error': errors.Resource.RetryableCreationError,
11061106
},
1107+
{
1108+
'testcase_name': 'IP stockout',
1109+
'fake_stderr': (
1110+
'{"errors": [{"code": "RESOURCE_POOL_EXHAUSTED", "message": "The'
1111+
' global or regional External IP resource pool is exhausted"}]}'
1112+
),
1113+
'expected_error': errors.Benchmarks.InsufficientCapacityCloudFailure,
1114+
}
11071115
)
11081116
def testCreateVMErrorCases(self, fake_stderr, expected_error):
11091117
fake_rets = [('stdout', fake_stderr, 1)]

tests/linux_benchmarks/cluster_boot_benchmark_test.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -216,13 +216,6 @@ def testGetTimeToBoot(
216216
vm_util, 'IssueCommand', return_value=('{}', '', 0), autospec=True
217217
)
218218
)
219-
self.enter_context(
220-
mock.patch(
221-
'perfkitbenchmarker.linux_packages.linux_boot.CollectBtimeSample',
222-
return_value=sample.Sample('btime', 5.0, 'second', {}),
223-
autospec=True,
224-
)
225-
)
226219
vm_spec = vm_spec_class(
227220
'cluster_boot_benchmark_test', zone=zone, machine_type=machine_type
228221
)
@@ -272,16 +265,6 @@ def testGetTimeToBoot(
272265
timestamp=1678147200.0,
273266
)
274267
)
275-
expecteds.append(
276-
sample.Sample(
277-
metric='btime',
278-
value=5.0,
279-
unit='second',
280-
metadata={},
281-
timestamp=1678147200.0,
282-
)
283-
)
284-
285268
self.assertCountEqual(actuals, expecteds)
286269

287270

tests/linux_benchmarks/dpb_sparksql_benchmark_test.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
from perfkitbenchmarker.scripts.spark_sql_test_scripts import spark_sql_runner
2020

21-
2221
FLAGS = flags.FLAGS
2322
_TPCH_TABLES = [
2423
'customer',
@@ -391,6 +390,52 @@ def testRenderRunnerScriptWithQueries(self):
391390
)
392391
self.assertIn(expected_substr, rendered_script)
393392

393+
@flagsaver.flagsaver(
394+
dpb_sparksql_order=['1', '2', '3', '4'],
395+
dpb_sparksql_fetch_results_from_logs=True,
396+
)
397+
def testSampleFailingQueries(self):
398+
# Arrange
399+
self.benchmark_spec_mock.table_subdirs = list(_TPCH_TABLES)
400+
self.benchmark_spec_mock.query_streams = [['1', '2', '3']]
401+
self.benchmark_spec_mock.queries_and_script_upload_time = None
402+
self.benchmark_spec_mock.hive_tables_creation_time = None
403+
404+
job_result_mock = mock.Mock(
405+
wall_time=42.0,
406+
pending_time=5.0,
407+
stdout=(
408+
'----@spark_sql_runner:results_start@----\n'
409+
'[{"query_id": "1", "duration": 10.0},\n'
410+
' {"query_id": "2", "duration": 10.0},\n'
411+
' {"query_id": "3", "duration": 10.0}]\n'
412+
'----@spark_sql_runner:results_end@----\n'
413+
),
414+
stderr='',
415+
)
416+
self.benchmark_spec_mock.dpb_service.SubmitJob.return_value = (
417+
job_result_mock
418+
)
419+
self.benchmark_spec_mock.dpb_service.GetResourceMetadata.return_value = {
420+
'cluster_name': 'test_cluster'
421+
}
422+
self.benchmark_spec_mock.dpb_service.GetClusterCreateTime.return_value = (
423+
100.0
424+
)
425+
self.benchmark_spec_mock.dpb_service.metadata = {}
426+
427+
# Act
428+
samples = dpb_sparksql_benchmark.Run(self.benchmark_spec_mock)
429+
430+
# Assert
431+
query_sample = next(s for s in samples if s.metric == 'sparksql_run_time')
432+
global_sample = next(
433+
s for s in samples if s.metric == 'sparksql_total_wall_time'
434+
)
435+
self.assertIn('failing_queries', global_sample.metadata)
436+
self.assertEqual(global_sample.metadata['failing_queries'], '4')
437+
self.assertNotIn('failing_queries', query_sample.metadata)
438+
394439

395440
if __name__ == '__main__':
396441
unittest.main()

0 commit comments

Comments
 (0)