Changes to avoid parallel execution issue on SLSA services

- Create custom-cache-tag for pkglistgen to enable separate cache dir
  name in case of parallel running
- Add custom-cache-tag to SLSA services
- Check for systemd service instead of process to ensure that SLSA
  services will not run in parallel
- Change pkglisgen timer to avoid overlap with relpkggen timer
This commit is contained in:
Gustavo Yokoyama Ribeiro 2022-08-03 13:32:36 -03:00
parent 28aec91acd
commit 9e328db488
6 changed files with 23 additions and 22 deletions

View File

@ -9,13 +9,6 @@ logger() {
echo "$1" >> ${LOG_DIR}/relpkggen.log echo "$1" >> ${LOG_DIR}/relpkggen.log
} }
logger "[START] Start relpkggen service" logger "[START] Start osrt-relpkggen@${PROJECT}.service"
if pgrep "osrt-pkglistgen"; then /usr/bin/osrt-pkglistgen -A ${API_URL} --debug update_and_solve -p ${PROJECT} -s target --only-release-packages --custom-cache-tag releasepackages --force >> ${LOG_DIR}/relpkggen.log 2>&1
logger "[WARNING] osrt-pkglistgen is running" logger "[FINISH] Finish osrt-relpkggen@${PROJECT}.service"
logger "[SKIP] Skip execution due to osrt-pkglistgen service is running"
exit 0
fi
logger "[RUNNING] Running osrt-relpkggen"
/usr/bin/osrt-pkglistgen -A ${API_URL} --debug update_and_solve -p ${PROJECT} -s target --only-release-packages --force >> ${LOG_DIR}/relpkggen.log 2>&1
logger "[FINISH] Finish relpkggen service"

View File

@ -49,6 +49,7 @@ class CommandLineInterface(ToolBase.CommandLineInterface):
@cmdln.option('--stop-after-solve', action='store_true', help='only create group files') @cmdln.option('--stop-after-solve', action='store_true', help='only create group files')
@cmdln.option('--staging', help='Only solve that one staging') @cmdln.option('--staging', help='Only solve that one staging')
@cmdln.option('--only-release-packages', action='store_true', help='Generate 000release-packages only') @cmdln.option('--only-release-packages', action='store_true', help='Generate 000release-packages only')
@cmdln.option('--custom-cache-tag', help='add custom tag to cache dir to avoid issues when running in parallel')
def do_update_and_solve(self, subcmd, opts): def do_update_and_solve(self, subcmd, opts):
"""${cmd_name}: update and solve for given scope """${cmd_name}: update and solve for given scope
@ -94,7 +95,8 @@ class CommandLineInterface(ToolBase.CommandLineInterface):
project=project, scope=scope, force=opts.force, project=project, scope=scope, force=opts.force,
no_checkout=opts.no_checkout, no_checkout=opts.no_checkout,
only_release_packages=opts.only_release_packages, only_release_packages=opts.only_release_packages,
stop_after_solve=opts.stop_after_solve) stop_after_solve=opts.stop_after_solve,
custom_cache_tag=opts.custom_cache_tag)
except MismatchedRepoException: except MismatchedRepoException:
logging.error("Failed to create weakremovers.inc due to mismatch in repos - project most likey started building again.") logging.error("Failed to create weakremovers.inc due to mismatch in repos - project most likey started building again.")
# for stagings we have to be strict on the exit value # for stagings we have to be strict on the exit value

View File

@ -611,7 +611,8 @@ class PkgListGen(ToolBase.ToolBase):
force: bool, force: bool,
no_checkout: bool, no_checkout: bool,
only_release_packages: bool, only_release_packages: bool,
stop_after_solve: bool stop_after_solve: bool,
custom_cache_tag
): ):
self.all_architectures = target_config.get('pkglistgen-archs').split(' ') self.all_architectures = target_config.get('pkglistgen-archs').split(' ')
self.use_newest_version = str2bool(target_config.get('pkglistgen-use-newest-version', 'False')) self.use_newest_version = str2bool(target_config.get('pkglistgen-use-newest-version', 'False'))
@ -651,7 +652,10 @@ class PkgListGen(ToolBase.ToolBase):
# Cache dir specific to hostname and project. # Cache dir specific to hostname and project.
host = urlparse(api.apiurl).hostname host = urlparse(api.apiurl).hostname
cache_dir = CacheManager.directory('pkglistgen', host, project) prefix_dir = 'pkglistgen'
if custom_cache_tag:
prefix_dir += '-' + custom_cache_tag
cache_dir = CacheManager.directory(prefix_dir, host, project)
if not no_checkout: if not no_checkout:
if os.path.exists(cache_dir): if os.path.exists(cache_dir):

View File

@ -1,6 +1,6 @@
[Timer] [Timer]
OnBootSec=420 OnBootSec=420
OnCalendar=*:0/10 OnCalendar=*:05,15,25,35,45,55
Unit=osrt-pkglistgen@.service Unit=osrt-pkglistgen@.service
[Install] [Install]

View File

@ -7,6 +7,7 @@ SyslogIdentifier=osrt-slsa
EnvironmentFile=/etc/openSUSE-release-tools/ibsapi EnvironmentFile=/etc/openSUSE-release-tools/ibsapi
Environment="OSC_CONFIG=/etc/openSUSE-release-tools/oscrc" Environment="OSC_CONFIG=/etc/openSUSE-release-tools/oscrc"
WorkingDirectory=/var/lib/osrt-slsa/relpkggen WorkingDirectory=/var/lib/osrt-slsa/relpkggen
ExecStartPre=/bin/bash -xc '/usr/bin/systemctl is-active --quiet osrt-pkglistgen@%i.service && exit 1 || exit 0'
ExecStart=/usr/bin/osrt-generate-release-packages %i ExecStart=/usr/bin/osrt-generate-release-packages %i
RuntimeMaxSec=120 hour RuntimeMaxSec=120 hour

View File

@ -10,6 +10,7 @@ logger() {
} }
polling_repo() { polling_repo() {
logger "[CHECKING] Checking standard repository from ${PROJECT}"
OUTPUT=$(/usr/share/openSUSE-release-tools/verify-repo-built-successful.py -A ${API_URL} -p ${PROJECT} -r standard 2>&1) OUTPUT=$(/usr/share/openSUSE-release-tools/verify-repo-built-successful.py -A ${API_URL} -p ${PROJECT} -r standard 2>&1)
RETURNCODE=$? RETURNCODE=$?
if [ ${RETURNCODE} -eq 0 ]; then if [ ${RETURNCODE} -eq 0 ]; then
@ -34,25 +35,25 @@ polling_repo() {
return ${RETURNCODE} return ${RETURNCODE}
} }
logger "[START] Start pkglistgen service: polling repository results" logger "[START] Start osrt-pkglistgen@${PROJECT}.service: polling repository results"
polling_repo polling_repo
# Check if repository building # Check if repository building
if [ $? -eq 3 ]; then if [ $? -eq 3 ]; then
# Repository is building, waiting it finishes # Repository is building, waiting it finishes
while true; do while true; do
logger "[WAITING] Waiting 20min before next repository status checking" logger "[WAITING] Waiting 10min before next repository status check"
sleep 20m sleep 10m
polling_repo polling_repo
case $? in case $? in
0) 0)
# Stop polling repository results: Repository finished building # Stop polling repository results: Repository finished building
if pgrep "osrt-pkglistgen"; then if systemctl is-active --quiet osrt-relpkggen@${PROJECT}.service; then
logger "[WARNING] osrt-relpkggen is running" logger "[WARNING] osrt-relpkggen@${PROJECT}.service is running"
logger "[WAITING] Waiting for osrt-relpkggen service finishes" logger "[WAITING] Waiting for osrt-relpkggen@${PROJECT}.service finishes"
continue continue
else else
logger"[RUNNING] Running osrt-pkglistgen" logger"[RUNNING] Running osrt-pkglistgen"
/usr/bin/osrt-pkglistgen -A ${API_URL} --debug update_and_solve -p ${PROJECT} -s target --force >> ${LOG_DIR}/pkglistgen.log 2>&1 /usr/bin/osrt-pkglistgen -A ${API_URL} --debug update_and_solve -p ${PROJECT} -s target --custom-cache-tag product --force >> ${LOG_DIR}/pkglistgen.log 2>&1
exit $? exit $?
fi fi
;; ;;
@ -67,4 +68,4 @@ if [ $? -eq 3 ]; then
esac esac
done done
fi fi
logger "[FINISH] Finish pkglistgen service" logger "[FINISH] Finish osrt-pkglistgen@${PROJECT}.service"