mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-24 16:23:40 +01:00
Restart offline pop_messages when there is mismatch between select and delete
When another connection is inserting something to spool at this same time as we do pop_messages, it's possible that insert will happen between we fetch messages and delete them, so we effectively will delete it without delivering it to client. This change catch this situation and restart transaction, so we should always have consistent results.
This commit is contained in:
parent
cb1c0a3188
commit
22980ed8a5
@ -267,9 +267,15 @@ get_and_del_spool_msg_t(LServer, LUser) ->
|
||||
ejabberd_sql:sql_query_t(
|
||||
?SQL("select @(username)s, @(xml)s from spool where "
|
||||
"username=%(LUser)s and %(LServer)H order by seq;")),
|
||||
ejabberd_sql:sql_query_t(
|
||||
?SQL("delete from spool where"
|
||||
" username=%(LUser)s and %(LServer)H;")),
|
||||
Result
|
||||
DResult =
|
||||
ejabberd_sql:sql_query_t(
|
||||
?SQL("delete from spool where"
|
||||
" username=%(LUser)s and %(LServer)H;")),
|
||||
case {Result, DResult} of
|
||||
{{selected, Rs}, {updated, DC}} when length(Rs) /= DC ->
|
||||
ejabberd_sql:restart(concurent_insert);
|
||||
_ ->
|
||||
Result
|
||||
end
|
||||
end,
|
||||
ejabberd_sql:sql_transaction(LServer, F).
|
||||
|
Loading…
Reference in New Issue
Block a user