blob: de95cfb8f7edbe122a4ea0bd1f3d76e872bfffd5 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#!/bin/sh
DBGF=logs/vespa/debug.retention-enforcer
DBDIR=var/db/vespa/logfiledb
PIDF=$DBDIR/retention-enforcer.pid
RETAIN_DAYS=31
prereq_dir() {
if [ -d $1 ] && [ -w $1 ]; then
:
else
echo "$0: missing directory '$1' in '`pwd`'" >&2
exit 1
fi
}
check_prereqs() {
prereq_dir var/db/vespa
prereq_dir logs/vespa
}
ensure_dir () {
if [ -d $1 ] && [ -w $1 ]; then
return 0
fi
echo "Creating directory '$1' in '`pwd`'"
mkdir -p $1 || exit 1
}
prepare_stuff() {
check_prereqs
exec > $DBGF.$$.log 2>&1
ensure_dir $DBDIR
}
bad_timestamp() {
now=$(date +%s)
if [ "$1" ] && [ "$1" -ge 1514764800 ] && [ "$1" -le $now ]; then
# sane timestamp:
return 1
fi
# bad timestamp:
return 0
}
mark_pid() {
echo $$ > $PIDF.$$.tmp
mv $PIDF.$$.tmp $PIDF || exit 1
}
check_pidfile() {
read pid < $PIDF
[ "$pid" = $$ ] && return 0
if [ "$pid" ] && [ $pid -gt $$ ]; then
sleep 30
read pid_again < $PIDF
if [ "$pid_again" != "$pid" ]; then return 1; fi
ps -p $pid >/dev/null 2>&1 || return 1
proc=$(ps -p $pid 2>&1)
case $proc in *retention*) ;; *) return 1;; esac
echo "$0 [$$]: Yielding my place to pid '$pid'"
exit 1
fi
}
maybe_collect() {
timestamp=$1
logfilename=$2
if bad_timestamp "$1"; then
echo "WARNING: bad timestamp '$timestamp' for logfilename '$logfilename'"
return
fi
add=$((86400 * $RETAIN_DAYS))
lim1=$(($timestamp + $add))
mod_time=$(get_mod_time "$logfilename")
lim2=$(($mod_time + $add))
if [ $lim1 -lt $now ] && [ $lim2 -lt $now ]; then
echo "Collect logfile '$logfilename' timestamped $timestamp modified $mod_time"
rm -f "$logfilename"
fi
}
get_mod_time() {
perl -e 'print (((stat("'"$1"'"))[9]) . "\n")'
}
process_file() {
dbfile="$1"
now=$(date +%s)
found=0
while read timestamp logfilename; do
for fn in $logfilename $logfilename.*z*; do
if [ -f "$fn" ]; then
found=1
maybe_collect "$timestamp" "$fn"
fi
done
done < $dbfile
if [ $found = 0 ]; then
ts=${dbfile##*.}00000
maybe_collect "$ts" "$dbfile"
fi
}
process_all() {
for dbf in $DBDIR/logfiles.* ; do
[ -f "$dbf" ] || continue
process_file "$dbf"
done
}
mainloop() {
while true; do
mark_pid
process_all
sleep 3600
check_pidfile
done
}
prepare_stuff
mainloop
exit 0
|