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

Reply via email to