-
Bug
-
Resolution: Done
-
Major
-
JDG 7.0.0 ER5
-
None
When data is put into the cache while javascript execution on the server over JS Client, i.e. the data is put into the cache in executable js file, then the put data is not readable from the client itself.
For example, if the https://github.com/infinispan/js-client/blob/master/spec/tests.js files execPutGet function is changed this way:
exports.execPutGet = function(path, prefix, client, expectFun) { return function(done) { var scriptName = prefix + '-typed-put-get.js'; var params = {k: prefix + '-typed-key', v: prefix + '-typed-value'}; client .then(t.loadAndExec(path, scriptName)) .then(t.assert(t.exec(scriptName, params), expectFun)) .then(t.assert(t.get(prefix + "-typed-key"), t.toBe(prefix + "-typed-value"))) /*.then(function(cli) { return cli.iterator(1).then( function(it) { function loop(promise, fn) { // Simple recursive loop over iterator's next() call return promise.then(fn).then(function (entry) { return !entry.done ? loop(it.next(), fn) : entry.value; }); } return loop(it.next(), function (entry) { console.log('iterator.next()=' + JSON.stringify(entry)); return entry; }); } ) })*/ .catch(t.failed(done)).finally(done); } };
then the assertion will fail with error:
Expected undefined to be 'dist-cluster-typed-value'.
If you will comment the line with get, and uncomment the iterator part, then the following exception is thrown on the server side:
16:36:19,785 ERROR [org.infinispan.server.hotrod.HotRodEncoder] (HotRodServerWorker-8-5) ISPN005022: Exception writing response with messageId=77: java.lang.ClassCastException: java.lang.String cannot be cast to [B at org.infinispan.server.hotrod.Encoder2x$$anonfun$writeResponse$9.apply(Encoder2x.scala:364) at org.infinispan.server.hotrod.Encoder2x$$anonfun$writeResponse$9.apply(Encoder2x.scala:343) at scala.collection.immutable.List.foreach(List.scala:381) at org.infinispan.server.hotrod.Encoder2x$.writeResponse(Encoder2x.scala:343) at org.infinispan.server.hotrod.HotRodEncoder.encode(HotRodEncoder.scala:45) at io.netty.handler.codec.MessageToByteEncoder.write(MessageToByteEncoder.java:107) at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:619) at io.netty.channel.AbstractChannelHandlerContext.access$1800(AbstractChannelHandlerContext.java:32) at io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.write(AbstractChannelHandlerContext.java:904) at io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:956) at io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:889) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:358) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:374) at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) at java.lang.Thread.run(Thread.java:745)
Seems that the data which is put from the executable js (no matter whether the data which is put is passed as a parameter or was just written in the js itself), is stored in the cache as a byte. And the get operation directly from that script works, but from client itself doesn't.
The issue appears for both local and clustered modes.