Hi Minh,

Thanks for your comments.

All cases you mentioned should be protected by the mutex as well. I will send out the updated patch soon.

Regards, Vu

On 1/6/20 11:08 AM, Minh Hon Chau wrote:
Hi Vu,

Don't you need to protect the list in ~LogClient()? And in NotifyClientAboutLostInvocations(), does it need to protect before 'read' in the 'for' loop? Otherwise it's ack from me.

Thanks

Minh

On 6/1/20 2:15 pm, Vu Minh Nguyen wrote:
log agent did not protect the resource `unacked_invocations_ list` from
accessing by multiple threads, so caused segmentation fault.

This patch introduces a mutex in order to synchronize the access to that
common resource.
---
  src/log/agent/lga_client.h | 12 +++++++++++-
  1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/log/agent/lga_client.h b/src/log/agent/lga_client.h
index f5fa6faa4..c999d148e 100644
--- a/src/log/agent/lga_client.h
+++ b/src/log/agent/lga_client.h
@@ -174,11 +174,15 @@ class LogClient {
    // get acknowledgement from it.
    void KeepTrack(SaInvocationT inv, uint32_t ack_flags) {
      if (ack_flags != SA_LOG_RECORD_WRITE_ACK) return;
+    base::Lock scope_lock{mutex_unacked_list_};
      unacked_invocations_.push_back(inv);
    }
      // Got an acknowledgment, so remove from the track list.
-  void RemoveTrack(SaInvocationT inv) { unacked_invocations_.remove(inv); }
+  void RemoveTrack(SaInvocationT inv) {
+    base::Lock scope_lock{mutex_unacked_list_};
+    unacked_invocations_.remove(inv);
+  }
      void NotifyClientAboutLostInvocations() {
      for (const auto& i : unacked_invocations_) {
@@ -196,6 +200,8 @@ class LogClient {
          SendMsgToMbx(msg, MDS_SEND_PRIORITY_HIGH);
      }
+
+    base::Lock scope_lock{mutex_unacked_list_};
      unacked_invocations_.clear();
    }
  @@ -290,6 +296,10 @@ class LogClient {
    // If cluster goes to headless, log agent will inform to log client with
    // SA_AIS_ERR_TRY_AGAIN code for these invocations.
    std::list<SaInvocationT> unacked_invocations_{};
+
+  // To protect the `unacked_invocations_` list.
+  base::Mutex mutex_unacked_list_{};
+
    // LOG handle (derived from hdl-mngr)
    SaLogHandleT handle_;



_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to