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

Search Discussions

  • Stephen Day at Aug 29, 2010 at 8:57 am
    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 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
  • Stephen Day at Aug 30, 2010 at 6:01 pm
    Anyone on this? Is there a place I should file a bug?
    On Sun, Aug 29, 2010 at 1:57 AM, Stephen Day 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 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
  • Matthias Radestock at Aug 30, 2010 at 6:19 pm
    Stephen,

    Stephen Day wrote:
    Anyone on this?
    it's a bank holiday in the UK ...
    Is there a place I should file a bug?
    I have filed a bug. The type of the "x-expires" argument should indeed
    be 'I'. No idea how it ended up being 'l' since that is actually signed.


    Regards,

    Matthias.
  • Stephen Day at Aug 30, 2010 at 7:41 pm
    My apologies good sir; enjoy your holiday!

    Thank you for the response.

    On Mon, Aug 30, 2010 at 11:19 AM, Matthias Radestock
    wrote:
    Stephen,

    Stephen Day wrote:
    Anyone on this?
    it's a bank holiday in the UK ...
    Is there a place I should file a bug?
    I have filed a bug. The type of the "x-expires" argument should indeed be
    'I'. No idea how it ended up being 'l' since that is actually signed.


    Regards,

    Matthias.

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouprabbitmq-discuss @
categoriesrabbitmq
postedAug 29, '10 at 8:50a
activeAug 30, '10 at 7:41p
posts5
users2
websiterabbitmq.com
irc#rabbitmq

2 users in discussion

Stephen Day: 4 posts Matthias Radestock: 1 post

People

Translate

site design / logo © 2021 Grokbase