The branch, master has been updated via b02f1d676f6 s3:share_mode_lock: remove unused reproducer for bug #14428 via b5c0874fd5d s3:share_mode_lock: make sure share_mode_cleanup_disconnected() removes the record via 1aa1ac97082 s3:share_mode_lock: add missing 'goto done' in share_mode_cleanup_disconnected() via 4d740ac2084 s3:share_mode_lock: consistently debug share_mode_entry records via deb2f782c95 s3:share_mode_lock: let share_mode_forall_entries/share_entry_forall evaluate e.stale first via 444f2bedf72 s3:share_mode_lock: reproduce problem with stale disconnected share mode entries via 560fe7b38f0 s3:selftest: also run durable_v2_reconnect_delay_msec in samba3.blackbox.durable_v2_delay from 232054c09b1 lib/util: remove extra safe_string.h file
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit b02f1d676f6e62a0a4b33b9b08f8f51a68b561ca Author: Stefan Metzmacher <me...@samba.org> Date: Fri Aug 28 16:28:41 2020 +0200 s3:share_mode_lock: remove unused reproducer for bug #14428 BUG: https://bugzilla.samba.org/show_bug.cgi?id=14428 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> Autobuild-User(master): Volker Lendecke <v...@samba.org> Autobuild-Date(master): Mon Aug 31 13:34:17 UTC 2020 on sn-devel-184 commit b5c0874fd5d31e252cf9ac8b84bde5c536b1e8ef Author: Stefan Metzmacher <me...@samba.org> Date: Fri Aug 28 16:28:41 2020 +0200 s3:share_mode_lock: make sure share_mode_cleanup_disconnected() removes the record This fixes one possible trigger for "PANIC: assert failed in get_lease_type()" https://bugzilla.samba.org/show_bug.cgi?id=14428 This is no longer enough to remove the record: d->have_share_modes = false; d->modified = true; Note that we can remove it completely from share_mode_cleanup_disconnected() as share_mode_forall_entries() already sets it when there are no entries left. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14428 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> commit 1aa1ac97082f81f6dc62f345823d2dd345e0afd7 Author: Stefan Metzmacher <me...@samba.org> Date: Fri Aug 28 15:56:35 2020 +0200 s3:share_mode_lock: add missing 'goto done' in share_mode_cleanup_disconnected() When cleanup_disconnected_lease() fails we should stop, at least we do that if brl_cleanup_disconnected() fails. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14428 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> commit 4d740ac2084a68c6d4836cd83ea5d5f1ee9d37a2 Author: Stefan Metzmacher <me...@samba.org> Date: Fri Aug 28 15:56:35 2020 +0200 s3:share_mode_lock: consistently debug share_mode_entry records share_mode_entry_do(), share_mode_forall_entries() and share_entry_forall() print the record before the callback is called and when it was modified or deleted. This makes it much easier to debug problems. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14428 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> commit deb2f782c95a5e59a0a5da4272239c2d31bc2b6d Author: Stefan Metzmacher <me...@samba.org> Date: Fri Aug 28 15:56:35 2020 +0200 s3:share_mode_lock: let share_mode_forall_entries/share_entry_forall evaluate e.stale first It's not really clear why e.stale would be ignored if *modified is set to true. This matches the behavior of share_mode_entry_do() This also makes sure we see the removed entry in level 10 logs again. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14428 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> commit 444f2bedf723b89bb9f493c47812bff2154c4113 Author: Stefan Metzmacher <me...@samba.org> Date: Fri Aug 28 14:37:59 2020 +0200 s3:share_mode_lock: reproduce problem with stale disconnected share mode entries This reproduces the origin of "PANIC: assert failed in get_lease_type()" (https://bugzilla.samba.org/show_bug.cgi?id=14428). share_mode_cleanup_disconnected() removes disconnected entries from leases.tdb and brlock.tdb but not from locking.tdb. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14428 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> commit 560fe7b38f0c8d53079fabf3f984b11748270035 Author: Stefan Metzmacher <me...@samba.org> Date: Fri Aug 28 15:33:43 2020 +0200 s3:selftest: also run durable_v2_reconnect_delay_msec in samba3.blackbox.durable_v2_delay BUG: https://bugzilla.samba.org/show_bug.cgi?id=14428 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> ----------------------------------------------------------------------- Summary of changes: source3/locking/share_mode_lock.c | 104 +++++++++++++++++---- .../script/tests/test_durable_handle_reconnect.sh | 12 +++ 2 files changed, 100 insertions(+), 16 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/locking/share_mode_lock.c b/source3/locking/share_mode_lock.c index ba0bc2b1e7b..1c4d3a42221 100644 --- a/source3/locking/share_mode_lock.c +++ b/source3/locking/share_mode_lock.c @@ -1648,6 +1648,42 @@ static bool share_mode_find_connected_fn( return false; } +static bool cleanup_disconnected_share_mode_entry_fn( + struct share_mode_entry *e, + bool *modified, + void *private_data) +{ + struct cleanup_disconnected_state *state = private_data; + struct share_mode_data *d = state->lck->data; + + bool disconnected; + + disconnected = server_id_is_disconnected(&e->pid); + if (!disconnected) { + struct file_id_buf tmp1; + struct server_id_buf tmp2; + DBG_ERR("file (file-id='%s', servicepath='%s', " + "base_name='%s%s%s') " + "is used by server %s ==> internal error\n", + file_id_str_buf(d->id, &tmp1), + d->servicepath, + d->base_name, + (d->stream_name == NULL) + ? "" : "', stream_name='", + (d->stream_name == NULL) + ? "" : d->stream_name, + server_id_str_buf(e->pid, &tmp2)); + smb_panic(__location__); + } + + /* + * Setting e->stale = true is + * the indication to delete the entry. + */ + e->stale = true; + return false; +} + bool share_mode_cleanup_disconnected(struct file_id fid, uint64_t open_persistent_id) { @@ -1694,6 +1730,7 @@ bool share_mode_cleanup_disconnected(struct file_id fid, (data->stream_name == NULL) ? "" : data->stream_name, open_persistent_id); + goto done; } ok = brl_cleanup_disconnected(fid, open_persistent_id); @@ -1727,8 +1764,24 @@ bool share_mode_cleanup_disconnected(struct file_id fid, ? "" : data->stream_name, open_persistent_id); - data->have_share_modes = false; - data->modified = true; + ok = share_mode_forall_entries( + state.lck, cleanup_disconnected_share_mode_entry_fn, &state); + if (!ok) { + DBG_DEBUG("failed to clean up %zu entries associated " + "with file (file-id='%s', servicepath='%s', " + "base_name='%s%s%s') and open_persistent_id %"PRIu64" " + "==> do not cleanup\n", + state.num_disconnected, + file_id_str_buf(fid, &idbuf), + data->servicepath, + data->base_name, + (data->stream_name == NULL) + ? "" : "', stream_name='", + (data->stream_name == NULL) + ? "" : data->stream_name, + open_persistent_id); + goto done; + } ret = true; done: @@ -2008,6 +2061,23 @@ static bool share_mode_for_one_entry( (int)modified, (int)e.stale); + if (e.stale) { + if (DEBUGLEVEL>=10) { + DBG_DEBUG("share_mode_entry:\n"); + NDR_PRINT_DEBUG(share_mode_entry, &e); + } + + if (*i < *num_share_modes) { + memmove(blob.data, + blob.data + SHARE_MODE_ENTRY_SIZE, + (*num_share_modes - *i - 1) * + SHARE_MODE_ENTRY_SIZE); + } + *num_share_modes -= 1; + *writeback = true; + return stop; + } + if (modified) { if (DEBUGLEVEL>=10) { DBG_DEBUG("share_mode_entry:\n"); @@ -2038,18 +2108,6 @@ static bool share_mode_for_one_entry( return stop; } - if (e.stale) { - if (*i < *num_share_modes) { - memmove(blob.data, - blob.data + SHARE_MODE_ENTRY_SIZE, - (*num_share_modes - *i - 1) * - SHARE_MODE_ENTRY_SIZE); - } - *num_share_modes -= 1; - *writeback = true; - return stop; - } - if (stop) { return true; } @@ -2226,8 +2284,18 @@ static bool share_mode_entry_do( goto done; } + if (DEBUGLEVEL>=10) { + DBG_DEBUG("entry[%zu]:\n", idx); + NDR_PRINT_DEBUG(share_mode_entry, &e); + } + fn(&e, ltdb->num_share_entries, &modified, private_data); + DBG_DEBUG("entry[%zu]: modified=%d, e.stale=%d\n", + idx, + (int)modified, + (int)e.stale); + if (!e.stale && !modified) { ret = true; goto done; @@ -2238,9 +2306,8 @@ static bool share_mode_entry_do( if (e.stale) { /* - * Move the reset down one entry + * Move the rest down one entry */ - size_t behind = ltdb->num_share_entries - idx - 1; if (behind != 0) { memmove(e_ptr, @@ -2248,6 +2315,11 @@ static bool share_mode_entry_do( behind * SHARE_MODE_ENTRY_SIZE); } ltdb->num_share_entries -= 1; + + if (DEBUGLEVEL>=10) { + DBG_DEBUG("share_mode_entry:\n"); + NDR_PRINT_DEBUG(share_mode_entry, &e); + } } else { struct share_mode_entry_buf buf; bool ok; diff --git a/source3/script/tests/test_durable_handle_reconnect.sh b/source3/script/tests/test_durable_handle_reconnect.sh index 77d82c1b403..2f6b308eebe 100755 --- a/source3/script/tests/test_durable_handle_reconnect.sh +++ b/source3/script/tests/test_durable_handle_reconnect.sh @@ -17,6 +17,18 @@ testit "durable_v2_delay.durable_v2_reconnect_delay" $VALGRIND \ smb2.durable-v2-delay.durable_v2_reconnect_delay || failed=$(expr $failed + 1) +SMBD_LOG_FILES="$SMBD_TEST_LOG" +if [ $SMBD_DONT_LOG_STDOUT -eq 1 ]; then + _SMBD_LOG_FILE=$(dirname $SMBD_TEST_LOG)/logs/log.smbd + SMBD_LOG_FILES="$SMBD_LOG_FILES $_SMBD_LOG_FILE" +fi + +testit "durable_v2_delay.durable_v2_reconnect_delay_msec" $VALGRIND \ + $BINDIR/smbtorture //$SERVER_IP/durable \ + -U$USERNAME%$PASSWORD \ + smb2.durable-v2-delay.durable_v2_reconnect_delay_msec || + failed=$(expr $failed + 1) + rm $delay_inject_conf testok $0 $failed -- Samba Shared Repository