[ https://issues.apache.org/jira/browse/THRIFT-1240?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Marimuthu Ponnambalam updated THRIFT-1240: ------------------------------------------ Attachment: simple.thrift Thrift IDL for simple test > TBinarySerializer.php invalid serialization due to TBufferTransport not > flushing last chunk of data into TMemoryBuffer > ---------------------------------------------------------------------------------------------------------------------- > > Key: THRIFT-1240 > URL: https://issues.apache.org/jira/browse/THRIFT-1240 > Project: Thrift > Issue Type: Bug > Components: PHP - Library > Affects Versions: 0.6.1 > Environment: Cent OS and Mac OS 10.5 > Reporter: Marimuthu Ponnambalam > Priority: Critical > Labels: TBinarySerializer, invalid, serialization > Fix For: 0.6.1 > > Attachments: simple.thrift > > > Simple Serialization errors out, due to the TBufferTransport not flushing the > data into TMemoryBuffer after $object->write($protocol) in TBinarySerializer. > Please find the error output of my test program below. It fixed after I added > the following line on the serialize method in TBinarySerializer. > $protocol->getTransport()->flush(); > This because of TBinaryProtocolAccelerated internally wraps TMemoryBuffer > within TBufferTransport in its constructor. > TBufferTransport write only if the wbuf_ is full (512 bytes) into > TMemoryBuffer. Hence data smaller than 512 will not get written into > TMemoryBuffer. While getting serialized data from TMemoryBuffer it might not > have the last chunk of data which is less than 512 bytes. > This outputs invalid serialized data > TestSchema$ php testsimple.php > Serialized . > mari > Fatal error: Uncaught exception 'TTransportException' with message > 'TMemoryBuffer: Could not read 512 bytes from buffer.' in > /Users/mponnambalam/work/eclipse/workspace/thrift0.6.1/lib/php/src/transport/TMemoryBuffer.php > on line 58 > TTransportException: TMemoryBuffer: Could not read 512 bytes from buffer. in > /Users/mponnambalam/work/eclipse/workspace/thrift0.6.1/lib/php/src/transport/TMemoryBuffer.php > on line 58 > Call Stack: > 0.0003 636976 1. {main}() > /Users/mponnambalam/work/eclipse/workspace/TestSchema/testsimple.php:0 > 0.0043 1509728 2. TBinarySerializer::deserialize() > /Users/mponnambalam/work/eclipse/workspace/TestSchema/testsimple.php:47 > 0.0043 1511808 3. thrift_protocol_read_binary() > /Users/mponnambalam/work/eclipse/workspace/thrift0.6.1/lib/php/src/protocol/TBinarySerializer.php:62 > thrift_protoco_read_binary disabled ( I commented extension in > thrift_protocol.ini) > > TestSchema$ php testsimple.php > Serialized . > Fatal error: Uncaught exception 'TTransportException' with message > 'TMemoryBuffer: Could not read 1 bytes from buffer.' in > /Users/mponnambalam/work/eclipse/workspace/thrift0.6.1/lib/php/src/transport/TMemoryBuffer.php > on line 58 > TTransportException: TMemoryBuffer: Could not read 1 bytes from buffer. in > /Users/mponnambalam/work/eclipse/workspace/thrift0.6.1/lib/php/src/transport/TMemoryBuffer.php > on line 58 > Call Stack: > 0.0003 636976 1. {main}() > /Users/mponnambalam/work/eclipse/workspace/TestSchema/testsimple.php:0 > 0.0041 1509944 2. TBinarySerializer::deserialize() > /Users/mponnambalam/work/eclipse/workspace/TestSchema/testsimple.php:47 > 0.0041 1512248 3. Person->read() > /Users/mponnambalam/work/eclipse/workspace/thrift0.6.1/lib/php/src/protocol/TBinarySerializer.php:66 > 0.0041 1512472 4. TBinaryProtocol->readFieldBegin() > /Users/mponnambalam/work/eclipse/workspace/TestSchema/gen-php/simple/simple_types.php:45 > 0.0041 1512472 5. TBinaryProtocol->readByte() > /Users/mponnambalam/work/eclipse/workspace/thrift0.6.1/lib/php/src/protocol/TBinaryProtocol.php:231 > 0.0041 1512520 6. TBufferedTransport->readAll() > /Users/mponnambalam/work/eclipse/workspace/thrift0.6.1/lib/php/src/protocol/TBinaryProtocol.php:283 > 0.0041 1512568 7. TTransport->readAll() > /Users/mponnambalam/work/eclipse/workspace/thrift0.6.1/lib/php/src/transport/TBufferedTransport.php:109 > 0.0041 1512744 8. TMemoryBuffer->read() > /Users/mponnambalam/work/eclipse/workspace/thrift0.6.1/lib/php/src/transport/TTransport.php:87 -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira