| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|\ |
|
|/
|
|
| |
list_component/1 and removing list_strict/2 altogether, plus a few bits of therefore dead code.
|
|\ |
|
| | |
|
|/ |
|
|\ |
|
| |\ |
|
| | |\ |
|
| | |/ |
|
| | |
| | |
| | |
| | | |
that the parameter exists.
|
| |/ |
|
|/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Specifically in all the cases where handle_other might have changed
the connection_state.
This is most straightforward and obvious to guarantee by always
invoking recvloop after handle_other, unless we are stopping.
This does expose an inconsistency in the various non-throw/exit
termination cases: two of them were returning State, the other
ok. Let's go with the latter; it's easiest.
We also take the opportunity to eliminate 'Deb' from the handle_other
signature. This is only needed in the {system, ...} message case,
which we now handle specially.
|
|\ |
|
| | |
|
| | |
|
| |
| |
| |
| | |
boot/0 or start/0, create a new process to hold the name instead.
|
|/
|
|
| |
stopping.
|
|\ |
|
|/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
...so messages with an expiry that are at the head of the queue after
a basic.get do not get stuck there in the absence of other queue
activity.
Rather than simply adding a call to drop_expired_messages/1 after the
call to fetch/1 in the basic_get code, we insert the call into
fetch/1, which allows us to remove it from the other call site. Thus
fetch/1 preserves the invariant we are after, namely that whenever a
queue has a message at the head with an expiry, there is a timer set
to drop said message.
Note that the message count returned by basic.get does not reflect the
dropping of expired messages after the fetched message. That's ok
since we make no guarantee that messages are expired straight
away. And note that on 'default' (rather than 'stable') the behaviour
is actually different; due to various other changes there we will in
fact return the reduced count.
|
|\ |
|
| | |
|
|/ |
|
|\ |
|
|/ |
|
| |
|
|\ |
|
| |\ |
|
| |/
| |
| |
| | |
rather than exploding.
|
|/ |
|
| |
|
| |
|
|\ |
|
| |
| |
| |
| | |
which will decide not to send...
|
|\ \ |
|
| | | |
|
|\ \ \
| |/ /
| | /
| |/
|/| |
|
|/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The "we have sent a close/close_ok" state is indicated by
state=closing. Well, not quite...
The channel gets into the 'closing' state via notify_queues. That is
called in three places:
- 'terminate' - uninteresting since we don't send/do anything after
that anyway
- handle_exception when encountering a channel level error, i.e. when
we send a channel.close
- when receiving a 'channel.close'. Note that this isn't quite the
same as sending a channel.close_ok. That in fact happens later,
after a handshake with the reader. But for our purposes it's good
enough. Certainly logically it is perfectly ok for us to stop
sending things to the client once we have *seen* a 'close'.
So how do we prevent sending in the 'closing' state?
Firstly, we introduce a 'send' helper that replaces all
rabbit_writer:send_command/2 invocations and is a no-op when
state=closing. There is one notable exception - the sending of
'channel.close', which happens when state has already been set to
'closing'.
rabbit_writer:send_command/2 isn't the only way to send commands to
the writer though. The channel uses a few others:
- send_command_sync - this is used to send channel.close_ok. We are in
fact in the 'closing' state at that point and nevertheless must send
that command (this is the tail end of the aforementioned
handshake). So it's fine to leave this invocation as is.
- send_command_and_notify - this is used to send messages with
basic.deliver. We make that entire code a no-op in the no-op case,
i.e. any messages sent by queues to the channel while it is
'closing' are simply dropped on the floor. This is TRTTD since it
results in a minimum amount of work and is perfectly safe - no
different to the channel terminating while those messages were in
flight.
- send_command/3 - this is used to send a basic.get_ok. That entire
code - part of handle_method - is already guarded by a 'closing'
state check that no-ops. It is also used to send basic.returns,
which only happens in handling a basic.publish, which in turn is
subject to the same handle_method guard.
Finally, we add some optimisations to the 'confirm' and 'tx' code, so
that all the logic for aggregating confirms and sending acks/nacks (or
tx.commit / tx.commit failures) gets skipped when closing.
|
|\ |
|
| | |
|
|\ \
| |/ |
|
| | |
|
|\ \
| |/
|/| |
|
|/
|
|
| |
when the former is asked to terminate by the reader
|
|
|
|
| |
accidentally committed on 'stable' instead of bug25360 branch
|
|
|
|
| |
when the former is asked to terminate by the reader
|
|\ |
|
|/ |
|
|\ |
|
| |\ |
|