<div dir="ltr">I believe this is coming from the Erlang client, in amqp_channel:rpc_bottom_half/2. I can&#39;t tell you why your program is doing this, only where the error message originates. It seems to be happening in response to receiving a tx.select_ok, AFAICS.<br>
<br>If you look at the code for rpc_bottom_half (reproduced at the end of this email for convenience), the line <br><br><span style="font-family: courier new,monospace;">{{value, {From,_}}, NewRequestQueue} = queue:out(RequestQueue)</span><br>
<br>will create the error message you are seeing if RequestQueue is empty. This can clearly be seen in the shell:<br><br><span style="font-family: courier new,monospace;">1&gt; EmptyQ = queue:new().</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">{[],[]}</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">2&gt; {{value, {From,_}}, NewRequestQueue} = queue:out(EmptyQ).</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">** exception error: no match of right hand side value </span><b style="font-family: courier new,monospace;">{empty,{[],[]}}</b><br><br>I don&#39;t know if this is a bug or one of those &quot;can&#39;t happen&quot; things that just didn&#39;t give a nice error message. I suspect the latter, because the code just cannot continue without the value of &quot;From&quot; to send a reply to. Why should the function have been called with a reply if the reply queue is empty? Something&#39;s wrong somewhere.<br>
<br>In addition, maybe I am too tired to see straight, but this looks really suspect:<br><br><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; catch case queue:head(NewRequestQueue) of</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; empty -&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {NewFrom,Method} -&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Do2(Writer,Method)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; end,</span><br><br>This is because queue:head/1 exits when it is empty and does not return &#39;empty&#39;, so the catch will return an EXIT:<br><br><span style="font-family: courier new,monospace;">1&gt; catch queue:head(queue:new()).</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">{&#39;EXIT&#39;,{empty,[{queue,head,[{[],[]}]},</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {erl_eval,do_apply,5},</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {erl_eval,expr,5},</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {shell,exprs,6},</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {shell,eval_exprs,6},</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {shell,eval_loop,3}]}}</span><br style="font-family: courier new,monospace;">
<br>I think this should be <br><br><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; catch case queue:head(NewRequestQueue) of</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&#39;EXIT&#39;, {empty,_}} -&gt;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {NewFrom,Method} -&gt;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Do2(Writer,Method)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; end,<br><br></span>Maybe an empty queue is one of those things that should never happen, but like I said, I am really tired...<br><br><br><b>Code reproduced from amqp_channel.erl</b><br>
<br><span style="font-family: courier new,monospace;">rpc_bottom_half(Reply, State = #channel_state{writer_pid = Writer,</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rpc_requests = RequestQueue,</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do2 = Do2}) -&gt;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; <b>{{value, {From,_}}, NewRequestQueue} = queue:out(RequestQueue),</b></span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; gen_server:reply(From, Reply),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; catch case queue:head(NewRequestQueue) of</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; empty -&gt;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {NewFrom,Method} -&gt;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Do2(Writer,Method)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; end,</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; NewState = State#channel_state{rpc_requests = NewRequestQueue},</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; {noreply, NewState}.</span><br><br><br><div class="gmail_quote">On Mon, Sep 22, 2008 at 10:24 PM, Valentino Volonghi <span dir="ltr">&lt;<a href="mailto:dialtone@gmail.com">dialtone@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">-----BEGIN PGP SIGNED MESSAGE-----<br>
Hash: SHA1<br>
<br>
so I&#39;m trying to add support for transactions to my simple forwarding<br>
application, I started by<br>
implementing the &#39;commit every 500 messages&#39; in the following way:<br>
<br>
handle_info(#&#39;tx.select_ok&#39;{}, State) -&gt;<br>
 &nbsp; &nbsp; {noreply, State};<br>
<br>
handle_info(#&#39;tx.commit_ok&#39;{}, State) -&gt;<br>
 &nbsp; &nbsp; {noreply, State};<br>
<br>
handle_info({#&#39;basic.deliver&#39;{routing_key = RoutingKey,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; delivery_tag = DeliveryTag},<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#content{payload_fragments_rev = [Payload]}},<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; State = #shovel_state{local = LocalBroker,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; remote = RemoteBroker,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exchange = Exchange,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sent = Sent,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ack = Acks}) -&gt;<br>
 &nbsp; &nbsp; deliver(State, RoutingKey, DeliveryTag, Payload, LocalBroker,<br>
RemoteBroker, Exchange, Sent, Acks).<br>
<br>
deliver(State, RoutingKey, DeliveryTag, Payload, _LocalBroker,<br>
RemoteBroker, Exchange, 0, []) -&gt;<br>
 &nbsp; &nbsp; amqp:tx_select(RemoteBroker),<br>
 &nbsp; &nbsp; amqp:send_message(RemoteBroker, RoutingKey, Payload, Exchange),<br>
 &nbsp; &nbsp; NewState = State#shovel_state{sent=1, ack=[DeliveryTag]},<br>
 &nbsp; &nbsp; {noreply, NewState};<br>
<br>
deliver(State, RoutingKey, DeliveryTag, Payload, LocalBroker,<br>
RemoteBroker, Exchange, 499, Acks) -&gt;<br>
 &nbsp; &nbsp; amqp:send_message(RemoteBroker, RoutingKey, Payload, Exchange),<br>
 &nbsp; &nbsp; amqp:tx_commit(RemoteBroker),<br>
 &nbsp; &nbsp; lists:foreach(fun(X) -&gt; amqp:ack(LocalBroker, X) end,<br>
[DeliveryTag|Acks]),<br>
 &nbsp; &nbsp; NewState = State#shovel_state{sent=0, ack=[]},<br>
 &nbsp; &nbsp; {noreply, NewState};<br>
<br>
deliver(State, RoutingKey, DeliveryTag, Payload, _LocalBroker,<br>
RemoteBroker, Exchange, Sent, Acks) -&gt;<br>
 &nbsp; &nbsp; amqp:tx_select(RemoteBroker),<br>
 &nbsp; &nbsp; amqp:send_message(RemoteBroker, RoutingKey, Payload, Exchange),<br>
 &nbsp; &nbsp; NewState = State#shovel_state{sent=Sent+1, ack=[DeliveryTag|Acks]},<br>
 &nbsp; &nbsp; {noreply, NewState}.<br>
<br>
and I implemented ack and tx_commit/tx_select like this:<br>
<br>
ack({_Connection, Channel, _Ticket}, DeliveryTag) -&gt;<br>
 &nbsp; &nbsp; BasicAck = #&#39;basic.ack&#39;{delivery_tag = DeliveryTag, multiple =<br>
false},<br>
 &nbsp; &nbsp; ok = amqp_channel:cast(Channel, BasicAck).<br>
<br>
tx_select({_Connection, Channel, _Ticket}) -&gt;<br>
 &nbsp; &nbsp; ok = amqp_channel:cast(Channel, #&#39;tx.select&#39;{}).<br>
<br>
tx_commit({_Connection, Channel, _Ticket}) -&gt;<br>
 &nbsp; &nbsp; ok = amqp_channel:cast(Channel, #&#39;tx.commit&#39;{}).<br>
<br>
Unfortunately when I try to run this code, during the forwarding I get<br>
the following exception:<br>
<br>
=ERROR REPORT==== 22-Sep-2008::19:23:11 ===<br>
** Generic server &lt;0.150.0&gt; terminating<br>
** Last message in was {method,{&#39;tx.select_ok&#39;},none}<br>
** When Server state == {channel_state,1,&lt;0.146.0&gt;,&lt;0.148.0&gt;,&lt;0.151.0&gt;,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #Fun&lt;amqp_network_driver.do.2&gt;,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #Fun&lt;amqp_network_driver.do.3&gt;,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #Fun&lt;amqp_network_driver.close_channel.1&gt;,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {[],[]},<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {[],[]},<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {dict,0,16,16,8,80,48,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {[],[],[],[],[],[],[],[],[],[],[],[],<br>
[],[],[],<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[]},<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {{[],[],[],[],[],[],[],[],[],[],[],[],<br>
[],[],<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [],[]}}},<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; false,undefined,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {dict,0,16,16,8,80,48,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {[],[],[],[],[],[],[],[],[],[],[],[],<br>
[],[],[],<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[]},<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {{[],[],[],[],[],[],[],[],[],[],[],[],<br>
[],[],<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [],[]}}}}<br>
** Reason for termination ==<br>
** {{badmatch,{empty,{[],[]}}},<br>
 &nbsp; &nbsp; [{amqp_channel,rpc_bottom_half,2},<br>
 &nbsp; &nbsp; &nbsp;{gen_server,handle_msg,5},<br>
 &nbsp; &nbsp; &nbsp;{proc_lib,init_p,5}]}<br>
<br>
Which clearly means that I badly matched somewhere... my best guess is<br>
the tx_select/tx_commit<br>
functions but then how should I fix them? (sorry for this newb<br>
question).<br>
<br>
- --<br>
Valentino Volonghi aka Dialtone<br>
Now running MacOS X 10.5<br>
Home Page: <a href="http://www.twisted.it" target="_blank">http://www.twisted.it</a><br>
<a href="http://www.adroll.com" target="_blank">http://www.adroll.com</a><br>
<br>
-----BEGIN PGP SIGNATURE-----<br>
Version: GnuPG v1.4.9 (Darwin)<br>
<br>
iEYEARECAAYFAkjYU3sACgkQ9Llz28widGUvqACZAaF5i6y0RCeq6S515PPERjsy<br>
09kAoLHg1ohSFpGpDd2SGCe6I2s6Vqw6<br>
=lGsw<br>
-----END PGP SIGNATURE-----<br>
<br>
_______________________________________________<br>
rabbitmq-discuss mailing list<br>
<a href="mailto:rabbitmq-discuss@lists.rabbitmq.com">rabbitmq-discuss@lists.rabbitmq.com</a><br>
<a href="http://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss" target="_blank">http://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss</a><br>
<br>
</blockquote></div><br></div>