[rabbitmq-discuss] Python AMQPLib causes exception when trying to declare queue with X-Expires

Stephen Day stevvooe at gmail.com
Mon Aug 30 19:01:38 BST 2010


Anyone on this? Is there a place I should file a bug?

On Sun, Aug 29, 2010 at 1:57 AM, Stephen Day <stevvooe at gmail.com> wrote:
> Small correction:
>
> x-expires granularity is in milliseconds, so changing to a 4 byte
> integer will limit the expiry range to 24 days, which doesn't provide
> as much headroom.
>
> On Sun, Aug 29, 2010 at 1:50 AM, Stephen Day <stevvooe at gmail.com> wrote:
>> Here is the traceback showing the exception as thrown by amqplib, with
>> the channel exception code:
>>
>>>>> ch.queue_declare('bdirect', arguments={"x-expires": 600})
>> Traceback (most recent call last):
>>  File "<stdin>", line 1, in <module>
>>  File "/usr/lib/pymodules/python2.6/amqplib/client_0_8/channel.py",
>> line 1294, in queue_declare
>>    (50, 11),    # Channel.queue_declare_ok
>>  File "/usr/lib/pymodules/python2.6/amqplib/client_0_8/abstract_channel.py",
>> line 105, in wait
>>    return amqp_method(self, args)
>>  File "/usr/lib/pymodules/python2.6/amqplib/client_0_8/channel.py",
>> line 273, in _close
>>    (class_id, method_id))
>> amqplib.client_0_8.exceptions.AMQPChannelException: (406,
>> u"PRECONDITION_FAILED - invalid arg 'x-expires' for queue 'bdirect' in
>> vhost '/': expires_not_of_type_long", (50, 10),
>> 'Channel.queue_declare')
>>
>> In the library code, it looks like it properly packs the integer, but
>> 0-8 doesn't support the desired integer type:
>>
>> amqplib/client_0_8/serialization.py
>>
>> 372             elif isinstance(v, (int, long)):
>> 373                 table_data.write('I')
>> 374                 table_data.write(pack('>i', v))
>>
>> The problem might actually lie in the server side parser code:
>>
>> src/rabbit_binary_parser.erl
>>
>> 99 parse_field_value(<<"l", Value:64/signed, Rest/binary>>) ->
>> 100     {long, Value, Rest};
>>
>> The 0-8 specification doesn't define a long type outside of the "I"
>> type, so this excludes this feature (which is a *great* feature) from
>> older clients.
>>
>> You should probably just have x-expires look for a regular 0-8
>> supported, 4-byte "I"-type integer. It will limit queue time expiry
>> maximum to 68 years, but one has to make design tradeoffs every once
>> and awhile ;).
>>
>> Good work on the 2.0 release. Its looking fantastic thus far.
>>
>> Stephen
>>
>


More information about the rabbitmq-discuss mailing list