Avoid occasionnal deadlocks (1 in 256)
This commit is contained in:
parent
6292303a31
commit
ad8461491b
3 changed files with 9 additions and 9 deletions
|
@ -453,17 +453,16 @@ func (a *Account) eventInternal(event *Event) error {
|
|||
|
||||
var cache_key string
|
||||
if event.Id != "" {
|
||||
// Use mx_room_id as a lock slot key, because this section is
|
||||
// concurrent with the part that sends events out in server.go,
|
||||
// and at that point we don't know the event's ID yet
|
||||
// since it will be attributed by the backend during the call to send
|
||||
dbLockSlot(mx_room_id)
|
||||
defer dbUnlockSlot(mx_room_id)
|
||||
|
||||
// If the event has an ID, make sure it is processed only once
|
||||
cache_key = fmt.Sprintf("%s/event_seen/%s/%s",
|
||||
a.Protocol, mx_room_id, event.Id)
|
||||
slot_key := dbKvSlotKey(cache_key)
|
||||
|
||||
dbLockSlot(slot_key)
|
||||
defer dbUnlockSlot(slot_key)
|
||||
|
||||
if dbKvGet(cache_key) == "yes" {
|
||||
// false: cache key was not modified, meaning we
|
||||
// already saw the event
|
||||
|
|
|
@ -166,6 +166,7 @@ func handleTxnEvent(e *mxlib.Event) error {
|
|||
ev.Author = acct.Conn.User()
|
||||
ev.Room = room.RoomID
|
||||
|
||||
// use room id as lock slot key, see account.go in eventInternal
|
||||
dbLockSlot(e.RoomId)
|
||||
defer dbUnlockSlot(e.RoomId)
|
||||
|
||||
|
@ -173,7 +174,7 @@ func handleTxnEvent(e *mxlib.Event) error {
|
|||
if err == nil && created_ev_id != "" {
|
||||
cache_key := fmt.Sprintf("%s/event_seen/%s/%s",
|
||||
room.Protocol, e.RoomId, created_ev_id)
|
||||
dbKvPut(cache_key, "yes")
|
||||
dbKvPutLocked(cache_key, "yes")
|
||||
}
|
||||
return err
|
||||
} else {
|
||||
|
|
6
util.go
6
util.go
|
@ -27,15 +27,15 @@ func ezbrSystemRoom(user_mx_id string) (string, error) {
|
|||
}
|
||||
|
||||
widget_kv_key := "ezbr_widget_on:" + mx_room_id
|
||||
if config.WebURL != "" && dbKvTestAndSet(widget_kv_key, "yes") {
|
||||
if config.WebURL != "" && dbKvGet(widget_kv_key) != "yes" {
|
||||
widget := map[string]interface{}{
|
||||
"type": "m.easybridge",
|
||||
"url": config.WebURL,
|
||||
"name": "Easybridge account configuration dashboard",
|
||||
}
|
||||
err = mx.PutStateAs(mx_room_id, "im.vector.modular.widgets", "ezbr_widget", widget, ezbrMxId())
|
||||
if err != nil {
|
||||
dbKvPut(widget_kv_key, "")
|
||||
if err == nil {
|
||||
dbKvPut(widget_kv_key, "yes")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue