hi,

i'm using cassandra 0.5.0 and pycassa 0.1.

i'd like to store binary data (specifically, wire-format DNS names) in
key names.  is this possible with cassandra?

i have a keyspace set up like this:

    <Keyspace Name="DNS">
        <KeysCachedFraction>0.01</KeysCachedFraction>
        <ColumnFamily CompareWith="BytesType"
                      CompareSubcolumnsWith="BytesType"
                      ColumnType="Super"
                      Name="RRsets"/>
    </Keyspace>

when i insert a key with a printable ASCII name, everything works fine,
but when i insert a key with a name containing binary data the insertion
appears to succeed, but a subsequent get for the same key name fails.

here's a test case:

    import pycassa
    conn = pycassa.connect()
    cf = pycassa.ColumnFamily(conn, 'DNS', 'RRsets', super=True)

    cf.insert('\x03www\x07example\x03com\x00', {'foo': {'bar' : 'baz'}})
    cf.get('\x03www\x07example\x03com\x00') # <-- this fails

    cf.insert('www.example.com.', {'foo': {'bar' : 'baz'}})
    cf.get('www.example.com.') # <-- this succeeds

here's the same code being executed in ipython, with each python line
interleaved with the hex dump of the TCP conversation.  (the client request hex
dump is flush, the server response hex dump is indented.)

(i don't know how the cassandra thrift protocol works, but the exact same
response was sent on the wire for the successful and the unsuccessful
insertions, so i would assume that either the insertion succeeded or the
protocol doesn't indicate insertion success?)

In [1]: import pycassa

In [2]: conn = pycassa.connect()

In [3]: cf = pycassa.ColumnFamily(conn, 'DNS', 'RRsets', super=True)

----------------------------------------------------------------------------

In [4]: cf.insert('\x03www\x07example\x03com\x00', {'foo': {'bar' : 'baz'}})
Out[4]: 1267319528

00000000  80 01 00 01 00 00 00 0c  62 61 74 63 68 5f 69 6e ........ batch_in
00000010  73 65 72 74 00 00 00 00  0b 00 01 00 00 00 03 44 sert.... .......D
00000020  4e 53 0b 00 02 00 00 00  11 03 77 77 77 07 65 78 NS...... ..www.ex
00000030  61 6d 70 6c 65 03 63 6f  6d 00 0d 00 03 0b 0f 00 ample.co m.......
00000040  00 00 01 00 00 00 06 52  52 73 65 74 73 0c 00 00 .......R Rsets...
00000050  00 01 0c 00 02 0b 00 01  00 00 00 03 66 6f 6f 0f ........ ....foo.
00000060  00 02 0c 00 00 00 01 0b  00 01 00 00 00 03 62 61 ........ ......ba
00000070  72 0b 00 02 00 00 00 03  62 61 7a 0a 00 03 00 00 r....... baz.....
00000080  00 00 4b 89 c2 e8 00 00  00 08 00 04 00 00 00 00 ..K..... ........
00000090  00                                               .

    00000000  80 01 00 02 00 00 00 0c  62 61 74 63 68 5f 69 6e ........ batch_in
    00000010  73 65 72 74 00 00 00 00  00                      sert.... .

----------------------------------------------------------------------------

In [5]: cf.get('\x03www\x07example\x03com\x00')
NotFoundException: NotFoundException()

00000091  80 01 00 01 00 00 00 09  67 65 74 5f 73 6c 69 63 ........ get_slic
000000A1  65 00 00 00 00 0b 00 01  00 00 00 03 44 4e 53 0b e....... ....DNS.
000000B1  00 02 00 00 00 11 03 77  77 77 07 65 78 61 6d 70 .......w ww.examp
000000C1  6c 65 03 63 6f 6d 00 0c  00 03 0b 00 03 00 00 00 le.com.. ........
000000D1  06 52 52 73 65 74 73 00  0c 00 04 0c 00 02 0b 00 .RRsets. ........
000000E1  01 00 00 00 00 0b 00 02  00 00 00 00 02 00 03 00 ........ ........
000000F1  08 00 04 00 00 00 64 00  00 08 00 05 00 00 00 01 ......d. ........
00000101  00                                               .

    00000019  80 01 00 02 00 00 00 09  67 65 74 5f 73 6c 69 63 ........ get_slic
    00000029  65 00 00 00 00 0f 00 00  0c 00 00 00 00 00       e....... ......

----------------------------------------------------------------------------

In [6]: cf.insert('www.example.com.', {'foo': {'bar' : 'baz'}})
Out[6]: 1267319533

00000102  80 01 00 01 00 00 00 0c  62 61 74 63 68 5f 69 6e ........ batch_in
00000112  73 65 72 74 00 00 00 00  0b 00 01 00 00 00 03 44 sert.... .......D
00000122  4e 53 0b 00 02 00 00 00  10 77 77 77 2e 65 78 61 NS...... .www.exa
00000132  6d 70 6c 65 2e 63 6f 6d  2e 0d 00 03 0b 0f 00 00 mple.com ........
00000142  00 01 00 00 00 06 52 52  73 65 74 73 0c 00 00 00 ......RR sets....
00000152  01 0c 00 02 0b 00 01 00  00 00 03 66 6f 6f 0f 00 ........ ...foo..
00000162  02 0c 00 00 00 01 0b 00  01 00 00 00 03 62 61 72 ........ .....bar
00000172  0b 00 02 00 00 00 03 62  61 7a 0a 00 03 00 00 00 .......b az......
00000182  00 4b 89 c2 ed 00 00 00  08 00 04 00 00 00 00 00 .K...... ........

    00000037  80 01 00 02 00 00 00 0c  62 61 74 63 68 5f 69 6e ........ batch_in
    00000047  73 65 72 74 00 00 00 00  00                      sert.... .

----------------------------------------------------------------------------

In [7]: cf.get('www.example.com.')
Out[7]: {'foo': {'bar': 'baz'}}

00000192  80 01 00 01 00 00 00 09  67 65 74 5f 73 6c 69 63 ........ get_slic
000001A2  65 00 00 00 00 0b 00 01  00 00 00 03 44 4e 53 0b e....... ....DNS.
000001B2  00 02 00 00 00 10 77 77  77 2e 65 78 61 6d 70 6c ......ww w.exampl
000001C2  65 2e 63 6f 6d 2e 0c 00  03 0b 00 03 00 00 00 06 e.com... ........
000001D2  52 52 73 65 74 73 00 0c  00 04 0c 00 02 0b 00 01 RRsets.. ........
000001E2  00 00 00 00 0b 00 02 00  00 00 00 02 00 03 00 08 ........ ........
000001F2  00 04 00 00 00 64 00 00  08 00 05 00 00 00 01 00 .....d.. ........

    00000050  80 01 00 02 00 00 00 09  67 65 74 5f 73 6c 69 63 ........ get_slic
    00000060  65 00 00 00 00 0f 00 00  0c 00 00 00 01 0c 00 02 e....... ........
    00000070  0b 00 01 00 00 00 03 66  6f 6f 0f 00 02 0c 00 00 .......f oo......
    00000080  00 01 0b 00 01 00 00 00  03 62 61 72 0b 00 02 00 ........ .bar....
    00000090  00 00 03 62 61 7a 0a 00  03 00 00 00 00 4b 89 c2 ...baz.. .....K..
    000000A0  ed 00 00 00 00    

----------------------------------------------------------------------------

-- 
Robert Edmonds
edmo...@debian.org

Reply via email to