From 5ba96dd27488a5e8d484db3d46edf10c8a529660 Mon Sep 17 00:00:00 2001
From: Nazir Bilal Yavuz <byavuz81@gmail.com>
Date: Wed, 8 Jan 2025 10:56:23 +0300
Subject: [PATCH v3 3/3] Collect core files on NetBSD and OpenBSD

NetBSD and OpenBSD operating systems are added to the CI. Now, collect
core files on failure on these operating systems.
---
 .cirrus.tasks.yml               | 15 +++++++++++++++
 src/tools/ci/cores_backtrace.sh |  6 ++++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/.cirrus.tasks.yml b/.cirrus.tasks.yml
index 43cca1aeb58..a4aeabd097b 100644
--- a/.cirrus.tasks.yml
+++ b/.cirrus.tasks.yml
@@ -229,11 +229,13 @@ task:
     CCACHE_DIR: /home/postgres/cache
 
     PATH: /usr/sbin:$PATH
+    CORE_DUMP_DIR: /var/crash
 
   matrix:
     - name: NetBSD - Meson
       only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*netbsd.*'
       env:
+        OS_NAME: netbsd
         IMAGE_FAMILY: pg-ci-netbsd-postgres
         PKGCONFIG_PATH: '/usr/lib/pkgconfig:/usr/pkg/lib/pkgconfig'
         # initdb fails with: 'invalid locale settings' error on NetBSD.
@@ -249,12 +251,15 @@ task:
     - name: OpenBSD - Meson
       only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*openbsd.*'
       env:
+        OS_NAME: openbsd
         IMAGE_FAMILY: pg-ci-openbsd-postgres
         PKGCONFIG_PATH: '/usr/lib/pkgconfig:/usr/local/lib/pkgconfig'
         UUID: -Duuid=e2fs
         TCL: -Dtcl_version=tcl86
       setup_additional_packages_script: |
         #pkg_add -I ...
+      # Always core dump to ${CORE_DUMP_DIR}
+      set_core_dump_script: sysctl -w kern.nosuidcoredump=2
       <<: *openbsd_task_template
 
   sysinfo_script: |
@@ -272,6 +277,10 @@ task:
     chown -R postgres:users /home/postgres
     mkdir -p ${CCACHE_DIR}
     chown -R postgres:users ${CCACHE_DIR}
+  setup_core_files_script: |
+    mkdir -p ${CORE_DUMP_DIR}
+    chmod -R 770 ${CORE_DUMP_DIR}
+    chown -R postgres:users ${CORE_DUMP_DIR}
 
   # -Duuid=bsd is not set since 'bsd' uuid option
   # is not working on NetBSD & OpenBSD. See
@@ -301,6 +310,12 @@ task:
 
   on_failure:
     <<: *on_failure_meson
+    cores_script: |
+      # Although we try to configure the OS to core dump inside
+      # ${CORE_DUMP_DIR}, they may not obey this. So, move core files to the
+      # ${CORE_DUMP_DIR} directory.
+      find build/ -type f -name '*.core' -exec mv '{}' ${CORE_DUMP_DIR} \;
+      src/tools/ci/cores_backtrace.sh ${OS_NAME} ${CORE_DUMP_DIR}
 
 
 # configure feature flags, shared between the task running the linux tests and
diff --git a/src/tools/ci/cores_backtrace.sh b/src/tools/ci/cores_backtrace.sh
index 28d3cecfc67..4b174a5cf56 100755
--- a/src/tools/ci/cores_backtrace.sh
+++ b/src/tools/ci/cores_backtrace.sh
@@ -9,7 +9,7 @@ os=$1
 directory=$2
 
 case $os in
-    freebsd|linux|macos)
+    freebsd|netbsd|openbsd|linux|macos)
     ;;
     *)
         echo "unsupported operating system ${os}"
@@ -26,7 +26,7 @@ for corefile in $(find "$directory" -type f) ; do
         echo -e '\n\n'
     fi
 
-    if [ "$os" = 'macos' ]; then
+    if [ "$os" = 'macos' ] || [ "$os" = 'openbsd' ]; then
         lldb -c $corefile --batch -o 'thread backtrace all' -o 'quit'
     else
         auxv=$(gdb --quiet --core ${corefile} --batch -ex 'info auxv' 2>/dev/null)
@@ -37,6 +37,8 @@ for corefile in $(find "$directory" -type f) ; do
 
         if [ "$os" = 'freebsd' ]; then
             binary=$(echo "$auxv" | grep AT_EXECPATH | perl -pe "s/^.*\"(.*)\"\$/\$1/g")
+        elif [ "$os" = 'netbsd' ]; then
+            binary=$(echo "$auxv" | grep AT_SUN_EXECNAME | perl -pe "s/^.*\"(.*)\"\$/\$1/g")
         elif [ "$os" = 'linux' ]; then
             binary=$(echo "$auxv" | grep AT_EXECFN | perl -pe "s/^.*\"(.*)\"\$/\$1/g")
         else
-- 
2.47.1

