Hi there. I'm building the 0.8 version of a client to nodejs. I never coded
for node and most of my code is following what the prozees guys did (I'm
talking to them on updating the lib)

But, I'm facing some errors when I test a very simple metadata request. I'm
getting this exception on kafka:

java.nio.BufferUnderflowException
at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:145)
 at java.nio.ByteBuffer.get(ByteBuffer.java:694)
at kafka.api.ApiUtils$.readShortString(ApiUtils.scala:38)
 at
kafka.api.TopicMetadataRequest$$anonfun$readFrom$1.apply(TopicMetadataRequest.scala:44)
at
kafka.api.TopicMetadataRequest$$anonfun$readFrom$1.apply(TopicMetadataRequest.scala:43)
 at scala.collection.immutable.Range$ByOne$class.foreach(Range.scala:282)
at scala.collection.immutable.Range$$anon$2.foreach(Range.scala:265)
 at kafka.api.TopicMetadataRequest$.readFrom(TopicMetadataRequest.scala:43)
at kafka.api.RequestKeys$$anonfun$4.apply(RequestKeys.scala:37)
 at kafka.api.RequestKeys$$anonfun$4.apply(RequestKeys.scala:37)
at kafka.network.RequestChannel$Request.<init>(RequestChannel.scala:49)
 at kafka.network.Processor.read(SocketServer.scala:345)
at kafka.network.Processor.run(SocketServer.scala:245)
 at java.lang.Thread.run(Thread.java:722)

My test sends a metadatarequest (api code 3) using a clientId "foo",
correlationId 0 and topicName "myTopic"

I don't know where I'm missing something. Please find the js code bellow
and also a java counter version that I've created just for the sake of my
lack of experience with node and js. I get the same error with the java
version:

Request.prototype.toBytes = function() {
    var encoded = new BufferMaker()
        .Int16BE(this.apiKey)
        .Int16BE(API_VERSION)
        .Int32BE(this.correlationId)
        .Int16BE(Buffer.byteLength(this.clientId,'UTF-8'))
        .string(this.clientId)
        .string(this.requestMessage.toBytes()).make();
    var bytes = new
BufferMaker().Int32BE(encoded.length).string(encoded).make();

MetadataRequest.prototype.toBytes = function () {
    var bytes = new
BufferMaker().Int16BE(Buffer.byteLength(this.topicName,'UTF-8')).string(this.topicName).make();
    return bytes;
}

var req = new Request(3,0,"foo",new MetadataRequest("myTopic"));
var status = connection.write(req.toBytes());

Here's the content of the buffer:

<Buffer 00 00 00 16 00 03 00 00 00 00 00 00 00 03 66 6f 6f 00 07 6d 79 54
6f 70 69 63>

And the java version (using vertx netclient):

Buffer writeBuffer = new Buffer()

     .appendShort((short) 3) //metadataRequest

     .appendShort((short) 0) //ApiVersion

     .appendInt(0) //Correlation

     .appendShort((short) "foo".getBytes("UTF-8").length).appendString("foo"
, "UTF-8") //ShortString clientId

     .appendShort((short) "myTopic".getBytes("UTF-8").length).appendString(
"myTopic", "UTF-8"); //ShortString topicName

    Buffer message = new Buffer();

    message.appendInt(writeBuffer.length()); //add total Message size to
buffer

    System.out.println(writeBuffer.length());

    message.appendBuffer(writeBuffer);

    socket.write(message);


-- 
The intuitive mind is a sacred gift and the
rational mind is a faithful servant. We have
created a society that honors the servant and
has forgotten the gift.

Reply via email to