<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><br><div>Hi Joel,</div><div><br> </div><div>In testing, we found that the problem is consistent with the one that commit "7a9ae1a208" solves.</div><div>commit "7a9ae1a208" comment in w_e_end_rsdata_req() function:<br></div><div>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* DRBD versions without DRBD_FF_RESYNC_DAGTAG lock<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* 128MiB "resync extents" in the activity log whenever<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* they make resync requests. Some of these versions<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* also lock activity lock extents when receiving<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* P_DATA. In particular, DRBD 9.0 and 9.1. This can<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* cause a deadlock if we send resync replies in these<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* extents as follows:<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* * Node is SyncTarget towards us<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* * Node locks a resync extent and sends P_RS_DATA_REQUEST<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* * Node receives P_DATA write in this extent; write<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp; waits for resync extent to be unlocked<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* * Node receives P_BARRIER (protocol A); receiver<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp; thread blocks waiting for write to complete<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* * We reply to P_RS_DATA_REQUEST, but it is never<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp; processed because receiver thread is blocked<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;*<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* Break the deadlock by canceling instead. This is<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* sent on the control socket so it will be processed. */</div><div><br></div><div>Then we found two suspicious pieces of code (patch content below):</div><div>1. In the w_e_end_rsdata_req() function, there is no lock protection between al_resync_extent_active() and drbd_rs_reply(), and P_DATA may be sent through this gap.</div><div>@@ -180,9 +184,11 @@ struct lc_element *_al_get_nonblock(struct drbd_device *device, unsigned int enr<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp; struct lc_element *al_ext;<br>&nbsp;<br>+&nbsp;&nbsp;&nbsp; mutex_lock(&amp;device-&gt;resync_lock);<br>&nbsp;&nbsp;&nbsp;&nbsp; spin_lock_irq(&amp;device-&gt;al_lock);<br>&nbsp;&nbsp;&nbsp;&nbsp; al_ext = is_local ? lc_try_get_local(device-&gt;act_log, enr) : lc_try_get(device-&gt;act_log, enr);<br>&nbsp;&nbsp;&nbsp;&nbsp; spin_unlock_irq(&amp;device-&gt;al_lock);<br>+&nbsp;&nbsp;&nbsp; mutex_unlock(&amp;device-&gt;resync_lock);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; return al_ext;<br>&nbsp;}<br>@@ -192,9 +198,11 @@ struct lc_element *_al_get(struct drbd_device *device, unsigned int enr, bool is<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp; struct lc_element *al_ext;<br>&nbsp;<br>+&nbsp;&nbsp;&nbsp; mutex_lock(&amp;device-&gt;resync_lock);<br>&nbsp;&nbsp;&nbsp;&nbsp; spin_lock_irq(&amp;device-&gt;al_lock);<br>&nbsp;&nbsp;&nbsp;&nbsp; al_ext = is_local ? lc_get_local(device-&gt;act_log, enr) : lc_get(device-&gt;act_log, enr);<br>&nbsp;&nbsp;&nbsp;&nbsp; spin_unlock_irq(&amp;device-&gt;al_lock);<br>+&nbsp;&nbsp;&nbsp; mutex_unlock(&amp;device-&gt;resync_lock);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; return al_ext;<br>&nbsp;}<br>diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h<br>index e9d2c3914..95cf2bb48 100644<br>--- a/drbd/drbd_int.h<br>+++ b/drbd/drbd_int.h<br>@@ -1588,6 +1588,7 @@ struct drbd_device {<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; int next_barrier_nr;<br>&nbsp;&nbsp;&nbsp;&nbsp; struct drbd_md_io md_io;<br>+&nbsp;&nbsp;&nbsp; struct mutex resync_lock;<br>&nbsp;&nbsp;&nbsp;&nbsp; spinlock_t al_lock;<br>&nbsp;&nbsp;&nbsp;&nbsp; wait_queue_head_t al_wait;<br>&nbsp;&nbsp;&nbsp;&nbsp; struct lru_cache *act_log;&nbsp;&nbsp;&nbsp; /* activity log */<br>diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c<br>index 02f4ae5d1..f625e2e83 100644<br>--- a/drbd/drbd_main.c<br>+++ b/drbd/drbd_main.c<br>@@ -4092,6 +4092,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig<br>&nbsp;#ifdef CONFIG_DRBD_TIMING_STATS<br>&nbsp;&nbsp;&nbsp;&nbsp; spin_lock_init(&amp;device-&gt;timing_lock);<br>&nbsp;#endif<br>+&nbsp;&nbsp;&nbsp; mutex_init(&amp;device-&gt;resync_lock);<br>&nbsp;&nbsp;&nbsp;&nbsp; spin_lock_init(&amp;device-&gt;al_lock);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; spin_lock_init(&amp;device-&gt;pending_completion_lock);<br>diff --git a/drbd/drbd_req.c b/drbd/drbd_req.c<br>index c4aa23a31..f05e21dd3 100644<br>--- a/drbd/drbd_req.c<br>+++ b/drbd/drbd_req.c<br>@@ -2383,6 +2383,7 @@ static bool prepare_al_transaction_nonblock(struct drbd_device *device,<br>&nbsp;&nbsp;&nbsp;&nbsp; bool made_progress = false;<br>&nbsp;&nbsp;&nbsp;&nbsp; int err;<br>&nbsp;<br>+&nbsp;&nbsp;&nbsp; mutex_lock(&amp;device-&gt;resync_lock);<br>&nbsp;&nbsp;&nbsp;&nbsp; spin_lock_irq(&amp;device-&gt;al_lock);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; /* Don't even try, if someone has it locked right now. */<br>@@ -2418,6 +2419,7 @@ static bool prepare_al_transaction_nonblock(struct drbd_device *device,<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp; out:<br>&nbsp;&nbsp;&nbsp;&nbsp; spin_unlock_irq(&amp;device-&gt;al_lock);<br>+&nbsp;&nbsp;&nbsp; mutex_unlock(&amp;device-&gt;resync_lock);<br>&nbsp;&nbsp;&nbsp;&nbsp; return made_progress;<br>&nbsp;}<br>&nbsp;<br>diff --git a/drbd/drbd_sender.c b/drbd/drbd_sender.c<br>index 738be16d5..ddea6230a 100644<br>--- a/drbd/drbd_sender.c<br>+++ b/drbd/drbd_sender.c<br>@@ -2106,6 +2106,7 @@ int w_e_end_rsdata_req(struct drbd_work *w, int cancel)<br>&nbsp;&nbsp;&nbsp;&nbsp; if (peer_device-&gt;repl_state[NOW] == L_AHEAD) {<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; err = drbd_send_ack(peer_device, P_RS_CANCEL, peer_req);<br>&nbsp;&nbsp;&nbsp;&nbsp; } else if (likely((peer_req-&gt;flags &amp; EE_WAS_ERROR) == 0)) {<br>+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mutex_lock(&amp;peer_device-&gt;device-&gt;resync_lock);<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (unlikely(peer_device-&gt;disk_state[NOW] &lt; D_INCONSISTENT)) {<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (connection-&gt;agreed_features &amp; DRBD_FF_RESYNC_DAGTAG) {<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; drbd_err_ratelimit(peer_device,<br>@@ -2154,6 +2155,7 @@ int w_e_end_rsdata_req(struct drbd_work *w, int cancel)<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (expect_ack)<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; peer_req = NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mutex_unlock(&amp;peer_device-&gt;device-&gt;resync_lock);<br>&nbsp;&nbsp;&nbsp;&nbsp; } else {<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; drbd_err_ratelimit(peer_device, "Sending NegRSDReply. sector %llus.\n",<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (unsigned long long)peer_req-&gt;i.sector);<br></div><div><br></div><div><br></div><div>2.The al_resync_extent_active() check does not include changing extent.<br>--- a/drbd/drbd_actlog.c<br>+++ b/drbd/drbd_actlog.c<br>@@ -163,12 +163,16 @@ bool drbd_al_active(struct drbd_device *device, sector_t sector, unsigned int si<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spin_lock_irq(&amp;device-&gt;al_lock);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (enr = first; enr &lt;= last; enr++) {<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct lc_element *al_ext;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; al_ext = lc_find(device-&gt;act_log, enr);<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (al_ext &amp;&amp; al_ext-&gt;refcnt &gt; 0) {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (lc_is_used(device-&gt;act_log, enr)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; active = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // struct lc_element *al_ext;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // al_ext = lc_find(device-&gt;act_log, enr);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // if (al_ext &amp;&amp; al_ext-&gt;refcnt &gt; 0) {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; active = true;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spin_unlock_irq(&amp;device-&gt;al_lock);</div><div><br></div><div><br></div><div>When we fixed these two pieces of code, the problem continued to recur.</div><div>Now the reason is that SyncSource send thead is also blocked, so it will not reply to P_RS_CANCEL ack.</div><div><br></div><div>SyncSource send thead:</div><div>[&lt;0&gt;] wait_woken+0x2c/0x60<br>[&lt;0&gt;] sk_stream_wait_memory+0x2bb/0x340<br>[&lt;0&gt;] do_tcp_sendpages+0x258/0x340<br>[&lt;0&gt;] tcp_sendpage_locked+0x44/0x60<br>[&lt;0&gt;] tcp_sendpage+0x37/0x50<br>[&lt;0&gt;] inet_sendpage+0x52/0x90<br>[&lt;0&gt;] dtt_send_page+0x93/0x140 [drbd_transport_tcp]<br>[&lt;0&gt;] flush_send_buffer+0xd0/0x150 [drbd]<br>[&lt;0&gt;] __send_command+0xf8/0x160 [drbd]<br>[&lt;0&gt;] drbd_send_block+0xaa/0x230 [drbd]<br>[&lt;0&gt;] drbd_rs_reply+0x26e/0x300 [drbd]<br>[&lt;0&gt;] w_e_end_rsdata_req+0xd6/0x4b0 [drbd]<br>[&lt;0&gt;] drbd_sender+0x13a/0x3d0 [drbd]<br>[&lt;0&gt;] drbd_thread_setup+0x69/0x190 [drbd]<br>[&lt;0&gt;] kthread+0x10a/0x120<br>[&lt;0&gt;] ret_from_fork+0x1f/0x40<br></div><div><br></div><div>SyncTarget receiver thread:</div><div>[&lt;0&gt;] conn_wait_active_ee_empty_or_disconnect+0x7d/0xb0 [drbd]<br>[&lt;0&gt;] receive_Barrier+0x16b/0x1f0 [drbd]<br>[&lt;0&gt;] drbd_receiver+0x5af/0x7f0 [drbd]<br>[&lt;0&gt;] drbd_thread_setup+0x5c/0x160 [drbd]<br>[&lt;0&gt;] kthread+0x10a/0x120<br>[&lt;0&gt;] ret_from_fork+0x1f/0x40<br><br></div><div>Do you have any good solutions?<br></div><pre style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Best regards,
zhengbing</pre><div  style="position:relative;zoom:1"></div><br>From: Zhengbing &lt;zhengbing.huang@easystack.cn&gt;<br>Date: 2024-10-16 20:03:27<br>To:  drbd-dev@lists.linbit.com<br>Subject: drbd: resync blocks<br><blockquote id="isReplyContent" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Hi Joel,</div><div style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><br></div><div style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">I have a problem with resync blocks. <br></div><div style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><br></div><div style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">First, I have a 2 node cluster, and node-1 running DRBD 9.1 and node -2 is DRBD 9.2 and protocol C.<br></div><div style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">and the problem scenario is as follows:</div><div style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">1. node-2 always has application IO<br>2. node-1 network failure with node-2<br>3. the network is restored. node-1 is SyncTarget and node-2 is SyncSource<br>4. then resync process is blocks<br></div><div style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><br></div><div style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">You solved the same problem in Commit "7a9ae1a208", but I still have this problem.</div><div style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><br></div><div style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">So, how do I solve this problem?<br></div><div style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><br></div><div style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><pre style="color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Best regards,
zhengbing<br></pre></div><p></p></div><br></blockquote></div><br>