summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-07-20 13:00:18 +0000
committerGerrit Code Review <review@openstack.org>2015-07-20 13:00:18 +0000
commitd8ab58339cb2a47680b9a73383e0748916271b47 (patch)
tree9b62448219fb58d7c5f8c224415a834d55a366be /tools
parent0c3964ece8e5771c2377e3fc4a1c37d427190c57 (diff)
parentf985a11bc6b8703fc7d1bcf1d520f4450322a3af (diff)
downloadnova-d8ab58339cb2a47680b9a73383e0748916271b47.tar.gz
Merge "XenAPI: Refactor rotate_xen_guest_logs to avoid races"
Diffstat (limited to 'tools')
-rwxr-xr-xtools/xenserver/rotate_xen_guest_logs.sh48
1 files changed, 16 insertions, 32 deletions
diff --git a/tools/xenserver/rotate_xen_guest_logs.sh b/tools/xenserver/rotate_xen_guest_logs.sh
index e0b48730fe..08bdcbf246 100755
--- a/tools/xenserver/rotate_xen_guest_logs.sh
+++ b/tools/xenserver/rotate_xen_guest_logs.sh
@@ -18,48 +18,32 @@ log_dir="/var/log/xen/guest"
kb=1024
max_size_bytes=$(($kb*$kb))
truncated_size_bytes=$((5*$kb))
-list_domains=/opt/xensource/bin/list_domains
log_file_base="${log_dir}/console."
-tmp_file_base="${log_dir}/tmp.console."
# Ensure logging is setup correctly for all domains
xenstore-write /local/logconsole/@ "${log_file_base}%d"
-# Move logs we want to keep
-domains=$($list_domains | sed '/^id*/d' | sed 's/|.*|.*$//g' | xargs)
-for i in $domains; do
- log="${log_file_base}$i"
- tmp="${tmp_file_base}$i"
- mv $log $tmp || true
+# Ensure the last_dom_id is set + updated for all running VMs
+for vm in $(xe vm-list power-state=running --minimal | tr ',' ' '); do
+ xe vm-param-set uuid=$vm other-config:last_dom_id=$(xe vm-param-get uuid=$vm param-name=dom-id)
done
-# Delete all console logs,
-# mostly to remove logs from recently killed domains
-rm -f ${log_dir}/console.*
+# Get the last_dom_id for all VMs
+valid_last_dom_ids=$(xe vm-list params=other-config --minimal | tr ';,' '\n\n' | grep last_dom_id | sed -e 's/last_dom_id: //g' | xargs)
-# Reload domain list, in case it changed
-# (note we may have just deleted a new console log)
-domains=$($list_domains | sed '/^id*/d' | sed 's/|.*|.*$//g' | xargs)
-for i in $domains; do
- log="${log_file_base}$i"
- tmp="${tmp_file_base}$i"
+# Remove console files that do not correspond to valid last_dom_id's
+allowed_consoles=".*console.\(${valid_last_dom_ids// /\\|}\)$"
+find $log_dir -type f -not -regex $allowed_consoles -delete
- if [ -e "$tmp" ]; then
- size=$(stat -c%s "$tmp")
-
- # Trim the log if required
- if [ "$size" -gt "$max_size_bytes" ]; then
- tail -c $truncated_size_bytes $tmp > $log || true
- else
- mv $tmp $log || true
- fi
- fi
+# Truncate all remaining logs
+for log in `find $log_dir -type f -regex '.*console.*' -size +${max_size_bytes}c`; do
+ tmp="$log.tmp"
+ tail -c $truncated_size_bytes $log > $tmp
+ mv -f $tmp $log
# Notify xen that it needs to reload the file
- xenstore-write /local/logconsole/$i $log
- xenstore-rm /local/logconsole/$i
+ domid=${log##*.}
+ xenstore-write /local/logconsole/$domid $log
+ xenstore-rm /local/logconsole/$domid
done
-
-# Delete all the tmp files
-rm -f ${tmp_file_base}* || true