#!/bin/bash # Copyright 2020 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # Due to crbug.com/1081332, we need to update AFDO metadata # manually. This script performs a few checks and generates a # new kernel_afdo.json file, which can then be committed. # # USAGE: # toolchain-utils$ ./afdo_tools/update_kernel_afdo # # The script modifies the JSON file and shows the git diff. # # If the changes look good, git commit them. Example commit # message (from crrev.com/c/2197462): # # afdo_metadata: Publish the new kernel profiles # # Update chromeos-kernel-3_18 to R84-13080.0-1589189810 # Update chromeos-kernel-4_4 to R84-13080.0-1589189726 # Update chromeos-kernel-4_14 to R84-13080.0-1589190025 # Update chromeos-kernel-4_19 to R84-13080.0-1589189550 # # BUG=None # TEST=Verified in kernel-release-afdo-verify-orchestrator. # set -eu set -o pipefail CROS_REPO=https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay GS_BASE=gs://chromeos-prebuilt/afdo-job/vetted/kernel KVERS="3.18 4.4 4.14 4.19" errs="" successes=0 script_dir=$(dirname "$0") tc_utils_dir="$script_dir/.." metadata_dir="$tc_utils_dir/afdo_metadata" outfile="$metadata_dir/kernel_afdo.json" # The most recent Monday, in Unix timestamp format. if [ $(date +%a) = "Mon" ] then expected_time=$(date +%s -d 00:00:00) else expected_time=$(date +%s -d "last Monday") fi # Get the current canary branch number (using beta + 1) beta=$(git ls-remote -h $CROS_REPO | \ sed -n -e "s/^.*release-R\([0-9][0-9]*\).*$/\1/p" | \ sort -g | tail -1) canary="$(($beta + 1))" json="{" sep="" for kver in $KVERS do # Sort the gs output by timestamp (default ordering is by name, so # R86-13310.3-1594633089.gcov.xz goes after R86-13310.18-1595237847.gcov.xz) latest=$(gsutil ls -l "$GS_BASE/$kver/" | sort -k2 | \ grep "R${canary}" | tail -1 || true) if [ -z "$latest" ] then # if no profiles exist for R${canary}, try the previous branch latest=$(gsutil ls -l "$GS_BASE/$kver/" | sort -k2 | \ grep "R${beta}" | tail -1) fi # Verify that the file has the expected date. file_time=$(echo "$latest" | awk '{print $2}') file_time_unix=$(date +%s -d "$file_time") if [ $file_time_unix -lt $expected_time ] then expected=$(env TZ=UTC date +%Y-%m-%dT%H:%M:%SZ -d @$expected_time) echo "Wrong date for $kver: $file_time is before $expected" >&2 errs="$errs $kver" continue fi # Generate JSON. json_kver=$(echo "$kver" | tr . _) # b/147370213 (migrating profiles from gcov format) may result in the # pattern below no longer doing the right thing. name=$(echo "$latest" | sed 's%.*/\(.*\)\.gcov.*%\1%') json=$(cat <&2 exit 2 fi # Write new JSON file. printf "%s\n}\n" "$json" > "$outfile" # Show the changes. (cd "$tc_utils_dir" && git diff) # If no changes were made, say so. outdir=$(dirname "$outfile") shortstat=$(cd "$outdir" && git status --short $(basename "$outfile")) [ -n "$shortstat" ] || echo $(basename "$outfile")" is up to date." # If we had any errors, warn about them. [ -z "$errs" ] || echo "warning: failed to update$errs" >&2