Hi, Thanks for pointing that out!
I checked the code where BYTE_ARR_FLAG = (8 << 8) so I set flags = 2048 in my C client program - linking libmemcached library; so that Apache Ignite would recognize the SET value as byte array successfully. i.e. rc = memcached_set(connection, key2, strlen(key2), value2, strlen(value2), (time_t)0, (uint32_t)2048); Regards, On Thu, Oct 18, 2018 at 6:12 PM Ilya Kasnacheev <ilya.kasnach...@gmail.com> wrote: > Hello! > > It will just take two first bytes from extras and turn them into a numeric > variable. > > Later on, if flags & 0xff00 == 0x1000000b, then it is byte array, else it > is string. > > You should find a way to make your implementation send '-128' as fourth > byte (If I understand endianness correctly). You could look it up in > tcpdump. > > Regards, > > -- > Ilya Kasnacheev > > > чт, 18 окт. 2018 г. в 10:33, Michael Fong <mcfong.o...@gmail.com>: > >> Hi, >> >> Thanks for pointing out the mistake about the string data type. I used >> python3 which supports bytes type and run the test case. Ignite would seems >> still treat the received value as String type and would decode the data >> correctly. I would like to try with a some simple C client program and see >> how It works. >> >> In addition, I checked the source code, and it seems the data type of key >> or value is >> 1. computed via U.bytesToShort() method @ >> https://github.com/apache/ignite/blob/ignite-2.6/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestParser.java#L664 >> 2. retrieved the type flag via masking bits off @ >> https://github.com/apache/ignite/blob/ignite-2.6/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestParser.java#L749 >> >> Could someone share some insight of what U.bytesToShort() does ? >> >> Thanks. >> >> >> On Wed, Oct 17, 2018 at 8:29 PM Павлухин Иван <vololo...@gmail.com> >> wrote: >> >>> Hi Michael, >>> >>> The troubles could be related to Python library. It seems in Python 2.7 >>> there is no such thing as "byte array". And value passed to the client is >>> string in this case. >>> I checked that Ignite recognizes bytes array type and stores in as byte >>> array internally. I did following experiment with Spymemcached [1]. >>> public class Memcached { >>> public static void main(String[] args) throws IOException { >>> MemcachedClient client = new MemcachedClient( >>> new BinaryConnectionFactory(), >>> AddrUtil.getAddresses("127.0.0.1:11211")); >>> >>> client.add("a", Integer.MAX_VALUE, new byte[]{1, 2, 3}); >>> client.add("b", Integer.MAX_VALUE, "123"); >>> >>> System.out.println(Arrays.toString((byte[])client.get("a"))); >>> System.out.println(client.get("b")); >>> >>> System.exit(0); >>> } >>> } >>> >>> And I see expected output: >>> [1, 2, 3] >>> 123 >>> >>> [1] https://mvnrepository.com/artifact/net.spy/spymemcached/2.12.3 >>> >>> ср, 17 окт. 2018 г. в 10:25, Павлухин Иван <vololo...@gmail.com>: >>> >>>> Hi Michael, >>>> >>>> Answering one of your questions. >>>> > Does ignite internally have a way to store the data type when cache >>>> entry is stored? >>>> Yes, internally Ignite maintains data types for stored keys and values. >>>> >>>> Could you confirm that for real memcached your example works as >>>> expected? I will try reproduce your Python example. It should not be hard >>>> to check what exactly is stored inside Ignite. >>>> >>>> ср, 17 окт. 2018 г. в 5:25, Michael Fong <mcfong.o...@gmail.com>: >>>> >>>>> bump :) >>>>> >>>>> Could anyone please help to answer a newbie question? Thanks in >>>>> advance! >>>>> >>>>> On Mon, Oct 15, 2018 at 4:22 PM Michael Fong <mcfong.o...@gmail.com> >>>>> wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> I kind of able to reproduce it with a small python script >>>>>> >>>>>> import pylibmc >>>>>> >>>>>> client = pylibmc.Client (["127.0.0.1:11211"], binary=True) >>>>>> >>>>>> >>>>>> ##abc >>>>>> val = "abcd".decode("hex") >>>>>> client.set("pyBin1", val) >>>>>> >>>>>> print "val decode w/ iso-8859-1: %s" % val.encode("hex") >>>>>> >>>>>> get_val = client.get("pyBin1") >>>>>> >>>>>> print "Value for 'pyBin1': %s" % get_val.encode("hex") >>>>>> >>>>>> >>>>>> where the the program intends to insert a byte[] into ignite using >>>>>> memcache binary protocol. >>>>>> The output is >>>>>> >>>>>> val decode w/ iso-8859-1: abcd >>>>>> Value for 'pyBin1': *efbfbdefbfbd* >>>>>> >>>>>> where, 'ef bf bd' are the replacement character for UTF-8 String. >>>>>> Therefore, the value field seems to be treated as String in Ignite. >>>>>> >>>>>> Regards, >>>>>> >>>>>> Michael >>>>>> >>>>>> >>>>>> >>>>>> On Thu, Oct 4, 2018 at 9:38 PM Maxim.Pudov <pudov....@gmail.com> >>>>>> wrote: >>>>>> >>>>>>> Hi, it looks strange to me. Do you have a reproducer? >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Sent from: http://apache-ignite-users.70518.x6.nabble.com/ >>>>>>> >>>>>> >>>> >>>> -- >>>> Best regards, >>>> Ivan Pavlukhin >>>> >>> >>> >>> -- >>> Best regards, >>> Ivan Pavlukhin >>> >>