locka99 / opcua

A client and server implementation of the OPC UA specification written in Rust
Mozilla Public License 2.0
476 stars 129 forks source link

fix out of order locking between server_state and session_manager #240

Closed joshuagleaton closed 1 year ago

joshuagleaton commented 1 year ago

fix out of order locking between server_state and session_manager causing deadlock.

Deadlock occurred in the following scenario:

thread 1:
spawn_reading_loop_task:
    tcp_transport.rs:423:       transport.write_lock
handle_message():
    message_handler.rs:124      session_manager.write_lock
create_session()
    session.rs:45           server_state.write_lock

thread 2:
spawn_reading_loop_task
    tcp_transport.rs:423        transport.write_lock
close_session:
    session.rs:337          server_state.write_lock
    session.rs:345          session_manager.read_lock
locka99 commented 1 year ago

I'll take it although looking at server_state in the code it could probably even be a read-only lock in this scenario.

locka99 commented 1 year ago

Thanks for this - deadlocks can be a pain to id sometimes