Skip to content

Commit 0be0970

Browse files
authored
Don't fail copying results when multiple envs have same trial-timestamp
During the cut-over period Jenkins jobs get started at the same time for the old and new env potentially having the same trial-timestamp. This results in failure to copy results[1] as they may include docs from a different env. Additionally there's a risk of copying over results related to another race config if both run on the same environment at the same time (same effective date). Fix issue, by populating user-tag.race-configs-id also for nightlies and additionally filtering by environment name and race-configs-id. [1] https://elasticsearch-ci.elastic.co/view/All/job/elastic+elasticsearch+master+macrobenchmark-periodic-group-1/2/console Relates elastic#100
1 parent e0da0bb commit 0be0970

File tree

2 files changed

+133
-107
lines changed

2 files changed

+133
-107
lines changed

night_rally/night_rally.py

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,11 @@ def __init__(self, params, revision):
236236

237237

238238
class ReleaseCommand(BaseCommand):
239-
def __init__(self, params, release_params, distribution_version, race_configs_id):
239+
def __init__(self, params, release_params, distribution_version):
240240
self.distribution_version = distribution_version
241241
self.release_params = release_params
242242
self.params = ParamsFormatter(params=params + [
243-
LicenseParams(distribution_version, release_params, race_configs_id),
243+
LicenseParams(distribution_version, release_params),
244244
ConstantParam("distribution-version", distribution_version),
245245
ConstantParam("pipeline", "from-distribution")
246246
])
@@ -280,12 +280,12 @@ def runnable(self, race_config):
280280

281281

282282
class DockerCommand(BaseCommand):
283-
def __init__(self, params, release_params, distribution_version, race_configs_id):
283+
def __init__(self, params, release_params, distribution_version):
284284
self.pipeline = "docker"
285285
self.distribution_version = distribution_version
286286

287287
docker_params = [
288-
LicenseParams(distribution_version, release_params, race_configs_id),
288+
LicenseParams(distribution_version, release_params),
289289
ConstantParam("distribution-version", distribution_version),
290290
ConstantParam("pipeline", "docker")
291291
]
@@ -395,11 +395,12 @@ class StandardParams:
395395
"""
396396
Extracts all parameters that are needed for all Rally invocations.
397397
"""
398-
def __init__(self, configuration_name, effective_start_date, runtime_jdk, user_tag_setup, test_mode=False):
398+
def __init__(self, configuration_name, effective_start_date, runtime_jdk, user_tag_setup, race_configs_id=None, test_mode=False):
399399
self.configuration_name = configuration_name
400400
self.effective_start_date = effective_start_date
401401
self.runtime_jdk = runtime_jdk
402402
self.user_tag_setup = user_tag_setup
403+
self.race_configs_id = race_configs_id
403404
self.test_mode = test_mode
404405

405406
def __call__(self, race_config):
@@ -411,9 +412,16 @@ def __call__(self, race_config):
411412
"track": race_config.track,
412413
"challenge": race_config.challenge,
413414
"car": race_config.car,
414-
"client-options": "timeout:240",
415-
"user-tag": self.tags(additional_tags={"name": race_config.name, "setup": self.user_tag_setup})
415+
"client-options": "timeout:240"
416416
}
417+
418+
additional_tags = {
419+
"name": race_config.name,
420+
"setup": self.user_tag_setup}
421+
if self.race_configs_id:
422+
additional_tags["race-configs-id"] = self.race_configs_id
423+
params["user-tag"] = self.tags(additional_tags=additional_tags)
424+
417425
add_if_present(params, "runtime-jdk", self.runtime_jdk)
418426
add_if_present(params, "car-params", race_config.car_params)
419427
add_if_present(params, "track-params", race_config.track_params)
@@ -434,7 +442,7 @@ class LicenseParams:
434442
Extracts all license related parameters that affect benchmarking. Before Elasticsearch 6.3.0 x-pack is considered a plugin.
435443
For later versions it is treated as module.
436444
"""
437-
def __init__(self, distribution_version, release_params=None, race_configs_id=None):
445+
def __init__(self, distribution_version, release_params=None):
438446
if distribution_version == "master":
439447
self.treat_as_car = True
440448
else:
@@ -443,7 +451,6 @@ def __init__(self, distribution_version, release_params=None, race_configs_id=No
443451

444452
self.distribution_version = distribution_version
445453
self.release_params = release_params
446-
self.race_configs_id = race_configs_id
447454

448455
def __call__(self, race_config):
449456
params = {}
@@ -491,8 +498,6 @@ def user_tags(self, x_pack, track_license):
491498
user_tags += ["x-pack:true"]
492499
if self.release_params and "x-pack-components" in self.release_params:
493500
user_tags += ["x-pack-components:{}".format(self.release_params["x-pack-components"])]
494-
if self.race_configs_id:
495-
user_tags += ["race-configs-id:{}".format(self.race_configs_id)]
496501
return user_tags
497502

498503

@@ -648,6 +653,18 @@ def copy_results_for_release_comparison(effective_start_date, configuration_name
648653
}
649654
}
650655
},
656+
# also limit by environment in case of multiple night-rally jobs executed at the same time using different env
657+
{
658+
"term": {
659+
"environment": configuration_name
660+
}
661+
},
662+
# and avoid race conditions with >1 night-rally invocations on different hardware using same environment
663+
{
664+
"term": {
665+
"user-tags.race-configs-id": race_configs_id
666+
}
667+
},
651668
{
652669
"bool": {
653670
"must_not": [
@@ -681,7 +698,6 @@ def copy_results_for_release_comparison(effective_start_date, configuration_name
681698
src["environment"] = "release-new"
682699
# release benchmarks rely on `user-tags.setup` for bar charts and this depends on the license
683700
src["user-tags"]["setup"] = "bare-{}".format(src["user-tags"]["license"])
684-
src["user-tags"]["race-configs-id"] = race_configs_id
685701
release_results.append(src)
686702
if release_results:
687703
logger.info("Copying %d result documents for [%s] to release environment." % (len(release_results), ts))
@@ -946,21 +962,23 @@ def main():
946962
params.append(TelemetryParams(args.telemetry, args.telemetry_params))
947963

948964
if common_cli_params.is_release:
949-
params.append(StandardParams(common_cli_params.configuration_name, start_date, args.runtime_jdk, common_cli_params.setup, args.test_mode))
965+
params.append(StandardParams(common_cli_params.configuration_name, start_date, args.runtime_jdk,
966+
common_cli_params.setup, common_cli_params.race_configs_id, args.test_mode))
950967
if common_cli_params.is_docker:
951968
logger.info("Running Docker release benchmarks for release [%s] against %s." % (common_cli_params.version, target_hosts))
952-
command = DockerCommand(params, common_cli_params.release_params, common_cli_params.version, common_cli_params.race_configs_id)
969+
command = DockerCommand(params, common_cli_params.release_params, common_cli_params.version)
953970
else:
954971
logger.info("Running release benchmarks for release [%s] against %s (release tag is [%s])."
955972
% (common_cli_params.version, target_hosts, common_cli_params.printable_release_params))
956-
command = ReleaseCommand(params, common_cli_params.release_params, common_cli_params.version, common_cli_params.race_configs_id)
973+
command = ReleaseCommand(params, common_cli_params.release_params, common_cli_params.version)
957974
elif common_cli_params.is_adhoc:
958975
logger.info("Running adhoc benchmarks for revision [%s] against %s." % (args.revision, target_hosts))
959976
params.append(StandardParams(common_cli_params.configuration_name, start_date, args.runtime_jdk, common_cli_params.setup, args.test_mode))
960977
command = AdHocCommand(params, args.revision)
961978
else:
962979
logger.info("Running nightly benchmarks against %s." % target_hosts)
963-
params.append(StandardParams(common_cli_params.configuration_name, start_date, args.runtime_jdk, common_cli_params.setup, args.test_mode))
980+
params.append(StandardParams(common_cli_params.configuration_name, start_date, args.runtime_jdk,
981+
common_cli_params.setup, common_cli_params.race_configs_id, args.test_mode))
964982
command = NightlyCommand(params, start_date)
965983

966984
rally_failure = run_rally(tracks, common_cli_params.release_params, target_hosts, command, args.dry_run, args.skip_ansible)

0 commit comments

Comments
 (0)