siddhi-io / siddhi

Stream Processing and Complex Event Processing Engine
http://siddhi.io
Apache License 2.0
1.52k stars 527 forks source link

sending data concurrently to multiple streams for pattern may lead to deadlock #1790

Closed Allan-QLB closed 1 year ago

Allan-QLB commented 2 years ago

Description: sending data concurrently for pattern may lead to deadlock

Affected Siddhi Version: 5.x.x

OS, DB, other environment details and versions:
N/A

Steps to reproduce:

The cause is as follow

Thread1:

  1. ProcessStreamReceiver#process
  2. lock the "lockWrapper"
  3. SingleProcessStreamReceiver#processAndClear
  4. synchronize "patternSyncObject"

Thread2:

  1. MultiProcessStreamReceiver#receive
  2. synchronize "patternSyncObject"
  3. MultiProcessStreamReceiver#process
  4. lock "lockWrapper"

the deadlock occur when Thread1,Thread2 are both between step 2 and step 4

It's easy to reproduce , just sleep for a while before synchronizing "patternSyncObject" in SingleProcessStreamReceiver#processAndClear, then send data in different threads

script is like this:

@App:name('Test')
define stream RegulatorStateChangeStream(time long, deviceID long,
roomNo int, tempSet double, action string);
define stream RoomKeyStream(time long, deviceID long, roomNo int,
action string);

@sink(type='log')
define stream RegulatorActionStream(time long, roomNo int, action string);

from every (e1=RegulatorStateChangeStream[ action == 'on' ]
-> e2=RoomKeyStream
[ e1.roomNo == roomNo and action == 'removed' ]
or e3=RegulatorStateChangeStream
[ e1.roomNo == roomNo and action == 'off'])
select eventTimestamp() as time, e1.roomNo,
ifThenElse( e2 is null, 'none', 'stop' ) as action
having action != 'none'
insert into RegulatorActionStream;`

the deadlock occur when sending data to RegulatorStateChangeStream and RoomKeyStream in different thread