Compare commits

...

3 Commits

Author SHA1 Message Date
Auke Kok
16a292fb30 Do not fence connections without valid greeting.
There is no reason to fence any connection that hasn't sent a valid
greeting, since they haven't progressed far enough for it to make
sense.

We remove the connection from the list of accepted clients, which then
removes the need for fencing, and the server won't need to restart.

Adds a test script that makes sure that we didn't actually restart the
server while this was happening.

Signed-off-by: Auke Kok <auke.kok@versity.com>
2025-07-25 11:16:48 -07:00
Zach Brown
9741d40e10 Merge pull request #229 from versity/zab/v1.25
v1.25 Release
2025-06-04 11:21:25 -07:00
Zach Brown
48ac7bdf7c v1.25 Release
Finish the release notes for the 1.25 release.

Signed-off-by: Zach Brown <zab@versity.com>
2025-06-03 13:35:42 -07:00
5 changed files with 64 additions and 0 deletions

View File

@@ -1,6 +1,27 @@
Versity ScoutFS Release Notes
=============================
---
v1.25
\
*Jun 3, 2025*
Fix a bug that could cause indefinite retries of failed client commits.
Under specific error conditions the client and server's understanding of
the current client commit could get out of sync. The client would retry
commits indefinitely that could never succeed. This manifested as
infinite "critical transaction commit failure" messages in the kernel
log on the client and matching "error <nr> committing client logs" on
the server.
Fix a bug in a specific case of server error handling that could result
in sending references to unwritten blocks to the client. The client
would try to read blocks that hadn't been written and return spurious
errors. This was seen under low free space conditions on the server and
resulted in error messages with error code 116 (The errno enum for
ESTALE, the client's indication that it couldn't read the blocks that it
expected.)
---
v1.24
\

View File

@@ -1278,6 +1278,17 @@ restart:
set_conn_fl(acc, reconn_freeing);
spin_unlock(&conn->lock);
if (!test_conn_fl(conn, shutting_down)) {
/*
* If we haven't seen a vg for this connection, don't bother fencing
* it - instead just drop it. If this was a real client, it will try
* again to connect.
*/
if (!test_conn_fl(acc, valid_greeting)) {
/* delete the conn */
list_del_init(&acc->accepted_head);
goto restart;
}
scoutfs_info(sb, "client "SIN_FMT" reconnect timed out, fencing",
SIN_ARG(&acc->last_peername));
ret = scoutfs_fence_start(sb, acc->rid,

7
tests/golden/portscan Normal file
View File

@@ -0,0 +1,7 @@
== empty packets
Ncat: Connection refused.
Ncat: Connection refused.
== find portscan in connections
== find portscan in connections

View File

@@ -57,4 +57,5 @@ archive-light-cycle.sh
block-stale-reads.sh
inode-deletion.sh
renameat2-noreplace.sh
portscan.sh
xfstests.sh

24
tests/tests/portscan.sh Normal file
View File

@@ -0,0 +1,24 @@
#
# portscan tests - assure malformed packets do not cause issues
#
t_require_commands scoutfs nc
echo "== empty packets"
sleep 1
echo " " | nc -p 33033 127.0.0.1 42000
echo " " | nc -p 33133 127.0.0.1 42001
echo " " | nc -p 33233 127.0.0.1 42002
echo "== find portscan in connections"
L=$(grep 'peer 127.0.0.1:33.33' /sys/kernel/debug/scoutfs/*/connections)
echo $L
# wait for fencing timeout (20s)
sleep 30
echo "== find portscan in connections"
L=$(grep 'peer 127.0.0.1:33.33' /sys/kernel/debug/scoutfs/*/connections)
echo $L
t_pass