# $permissions [list allow|super|deny $ipaddrhex $maskhex ...]
# $realtime pipes
# $realtime_retry [list $timeoutid $awaitedpongmsg|{} $buf]
+# $realtime_last_retries [list $now $now $now ... $now]
# $replay("$pri $key") $rhs $pri is \d\d; causes replay of "$key $rhs"
# $detect0($seg) unset -> 1 or irrelevant; [after ...]
# $conns($conn) 1
# $realtime any unset set unset
# $realtime_retry unset {} {} [list ...]
#
+# realtime_last_retries is unset at startup, and becomes unset when we
+# enter auto mode. unset means in auto mode we have to set it.
+# It contains the last few startup times.
+#
# replay priorities and messages:
# 10 stastate
# 40 warning realtime-failed
#---------- automatic realtime restart ----------
proc global/!realtime {conn args} {
- global realtime realtime_retry
+ global realtime realtime_retry realtime_last_retries
nargs $args 1
set how [lindex $args 0]
auto {
realtime-retry-reset
set realtime_retry {}
+ catch { unset realtime_last_retries }
}
stop - start - start-manual {
realtime-retry-reset
proc realtime-retry-check {} {
global realtime_retry realtime
+ global realtime_last_retries restart_min_mean_interval
if {![info exists realtime_retry]} return
if {[llength $realtime_retry]} return
if {[info exists realtime]} return
+
+ if {![info exists realtime_last_retries]} {
+ set realtime_last_retries {0 0 0 0 0}
+ }
+ set oldest [lindex $realtime_last_retries 0]
+ set now [clock seconds]
+ if {$now - $oldest <
+ $restart_min_mean_interval * [llength $realtime_last_retries]} {
+ xmit-relevantly-savereplay 40 \
+ "warning realtime-failed" looping-disabled
+ unset realtime_retry
+ return
+ }
+ set realtime_last_retries [lrange $realtime_last_retries 1 end]
+ lappend realtime_last_retries $now
+
realtime-start {}
}
setting testmode 0 {[01]}
setting lputs 0 {[01]}
setting dev_railway {} {/.*}
+ setting restart_min_mean_interval 5 {^\d+}
parse-argv {}
uplevel #0 source $libdir/multiplex-config