| | |
| | | } |
| | | |
| | | # A disturbance window over the errors log of every server (#1208): window_open before the |
| | | # disturbance, window_close once the disturbed server serves again, a line "<lines before> |
| | | # <lines after>" in logs/<node>.windows |
| | | window_open() { |
| | | local n |
| | | # disturbance, with the msgIDs of the errors it expects besides the failed handshakes, |
| | | # or dns:<hostname> for ERROR 51 naming exactly that temporarily unavailable host, |
| | | # window_close once the disturbed server serves again, a line "<lines before> <lines after> |
| | | # [<msgID>|dns:<hostname>...]" in logs/<node>.windows |
| | | window_open() { # [<msgID>|dns:<hostname>...] |
| | | local n lines |
| | | for n in $ALL_NODES; do |
| | | errors_lines $n >"$OUT/logs/$n.window" |
| | | # an assignment, so that a log that cannot be read stops the run here as well |
| | | lines=$(errors_lines $n) |
| | | echo "$lines${*:+ $*}" >"$OUT/logs/$n.window" |
| | | done |
| | | } |
| | | |
| | | window_close() { |
| | | local n lines |
| | | local n lines before ids |
| | | for n in $ALL_NODES; do |
| | | lines=$(errors_lines $n) |
| | | echo "$(cat "$OUT/logs/$n.window") $lines" >>"$OUT/logs/$n.windows" |
| | | read -r before ids <"$OUT/logs/$n.window" |
| | | echo "$before $lines${ids:+ $ids}" >>"$OUT/logs/$n.windows" |
| | | rm "$OUT/logs/$n.window" |
| | | done |
| | | } |
| | |
| | | # timed out connecting (212) and its replication server logged 178, and a replication server |
| | | # logged 311 with SocketTimeoutException when the restarted server logged 119 with "Remote host |
| | | # terminated the handshake"; in run 40463887505 a replication server logged 145 on the |
| | | # connection of the restarted one. Those go to logs/<node>.expected; outside a window, and |
| | | # anything else inside one, they are errors. A window expects them on any server, not only on |
| | | # the connections of the disturbed one: 178 and 179 name the servers by id alone, and a server |
| | | # has one in each of its domains and another for its replication server. A handshake that fails |
| | | # is followed by a connection elsewhere, and a change it lost the checks of the data find |
| | | # connection of the restarted one. A window opened with msgIDs expects the SYNC errors of those |
| | | # msgIDs as well. A dns:<hostname> token expects only ERROR 51's exact resolution-failure |
| | | # message for that hostname, not other DNS errors inside the window. This covers the stopped |
| | | # RS container's name temporarily disappearing during kill-rs, restart-rs or a combined |
| | | # kill-ds or restart-ds. DS-only crashes and restarts pass no DNS token, and other hosts remain |
| | | # errors. |
| | | # The other allowances cover what one disturbance leaves behind besides the handshakes, such |
| | | # as the connections a killed replication server breaks (disturb-kill-rs.sh), which a window of |
| | | # another one does not expect. Those go to logs/<node>.expected; outside a window, and anything |
| | | # else inside one, they are errors. A window expects them on any server, not only on the |
| | | # connections of the disturbed one: 178 and 179 name the servers by id alone, and a server has |
| | | # one in each of its domains and another for its replication server. A handshake that fails is |
| | | # followed by a connection elsewhere, and a change it lost the checks of the data find |
| | | replication_errors() { # <node> |
| | | local windows= |
| | | [ ! -f "$OUT/logs/$1.windows" ] || windows=$(tr '\n' ' ' <"$OUT/logs/$1.windows") |
| | | [ ! -f "$OUT/logs/$1.windows" ] || windows=$(tr '\n' ';' <"$OUT/logs/$1.windows") |
| | | since_mark $1 | awk -v first=$(($(cat "$OUT/logs/$1.mark") + 1)) -v windows="$windows" \ |
| | | -v expected="$OUT/logs/$1.expected" ' |
| | | BEGIN { n = split(windows, w, " ") } |
| | | BEGIN { |
| | | n = split(windows, w, ";") |
| | | for (i = 1; i <= n; i++) { |
| | | k = split(w[i], f, " ") |
| | | from[i] = f[1]; to[i] = f[2]; ids[i] = " " |
| | | for (j = 3; j <= k; j++) ids[i] = ids[i] f[j] " " |
| | | } |
| | | } |
| | | !/category=SYNC severity=ERROR|SSLHandshakeException|bad_certificate/ { next } |
| | | { |
| | | line = first + NR - 1 |
| | | if (/category=SYNC severity=ERROR msgID=(145|178|179) / \ |
| | | || /category=SYNC severity=WARNING .*SSLHandshakeException\(Remote host terminated the handshake\)/) |
| | | for (i = 1; i < n; i += 2) |
| | | if (line > w[i] + 0 && line <= w[i + 1] + 0) { print >expected; next } |
| | | handshake = /category=SYNC severity=ERROR msgID=(145|178|179) / \ |
| | | || /category=SYNC severity=WARNING .*SSLHandshakeException\(Remote host terminated the handshake\)/ |
| | | id = "" |
| | | if (match($0, /category=SYNC severity=ERROR msgID=[0-9]+ /)) { |
| | | id = substr($0, RSTART, RLENGTH) |
| | | sub(/.*msgID=/, "", id) |
| | | sub(/ $/, "", id) |
| | | } |
| | | dns = "" |
| | | if (id == "51") { |
| | | message = substr($0, index($0, " msg=") + 5) |
| | | if (message ~ /^The hostname [^ ]+ could not be resolved as an IP address$/) { |
| | | split(message, parts, " ") |
| | | dns = " dns:" parts[3] " " |
| | | } |
| | | } |
| | | for (i = 1; i <= n; i++) |
| | | if (line > from[i] + 0 && line <= to[i] + 0 \ |
| | | && (handshake || index(ids[i], " " id " ") || (dns != "" && index(ids[i], dns)))) { |
| | | print >expected |
| | | next |
| | | } |
| | | print |
| | | }' |
| | | } |
| | |
| | | |
| | | # A directory server is connected to one replication server at a time, so the replication |
| | | # servers reach each other only through their own connections: each one names every peer it is |
| | | # connected to "Connected replication server RS(<id>) <host:port>" (ReplicationServerHandler) |
| | | # connected to "Connected replication server RS(<id>) <host:port>" (ReplicationServerHandler). |
| | | # The number of them, 0 where the search fails |
| | | rs_peers() { # <replication server> |
| | | admin_search $1 "$MONITOR_DOMAIN" sub "(cn=Connected replication server*)" 1.1 | grep -c '^dn:' || true |
| | | } |
| | | |
| | | assert_rs_mesh() { |
| | | local rs want got failed= |
| | | want=$(($(echo $RS_NODES | wc -w) - 1)) |
| | | for rs in $RS_NODES; do |
| | | got=$(admin_search $rs "$MONITOR_DOMAIN" sub "(cn=Connected replication server*)" 1.1 | grep -c '^dn:' || true) |
| | | got=$(rs_peers $rs) |
| | | [ "${got:-0}" -eq "$want" ] || { echo "::error::$rs is connected to ${got:-0} replication servers, not $want"; failed=1; } |
| | | done |
| | | [ -z "$failed" ] |