CARVIEW |
Select Language
HTTP/2 200
date: Sat, 19 Jul 2025 04:09:48 GMT
content-type: text/html; charset=utf-8
cache-control: max-age=0, private, must-revalidate
content-security-policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/
link: ; rel=preload; as=fetch; crossorigin=use-credentials
referrer-policy: no-referrer-when-downgrade
server-timing: issue_layout-fragment;desc="issue_layout fragment";dur=258.257577,issue_conversation_content-fragment;desc="issue_conversation_content fragment";dur=414.861657,issue_conversation_sidebar-fragment;desc="issue_conversation_sidebar fragment";dur=58.612988,nginx;desc="NGINX";dur=0.68483,glb;desc="GLB";dur=95.460747
strict-transport-security: max-age=31536000; includeSubdomains; preload
vary: X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, X-Requested-With, Accept,Accept-Encoding, Accept, X-Requested-With
x-content-type-options: nosniff
x-frame-options: deny
x-voltron-version: fd8fbbc
x-xss-protection: 0
server: github.com
content-encoding: gzip
accept-ranges: bytes
set-cookie: _gh_sess=HrJyKQxAtT7ojMqhVuXzp6KWZMSm76%2BKQtEy04U9BrQpaxGRJ0XtnnGjJek0vjujOosFtCIpFJkk2k%2BcvWVu84FINjw03GJVHOs6EGjweaRx3ISGaL6C%2FQZGI%2FCXt1g58gQJXwWHHDQOyzimVNy%2Bz21krQL1MmG7mfKFJc70Bymq06Pv2EUF%2FUk2Bq%2F2dlgEJYu16ujnT7X5yjTM2jG4nb2hAKQdEArzGLNRk7sGL%2F67JEXmH9Gvq9Xz7OSs1Zmsu8yA6JEX1GInL9LwQWpedA%3D%3D--rjaO01kZ6cPTzglK--sz5eXehgZTnoBvXTwQx%2Fxw%3D%3D; Path=/; HttpOnly; Secure; SameSite=Lax
set-cookie: _octo=GH1.1.159266035.1752898187; Path=/; Domain=github.com; Expires=Sun, 19 Jul 2026 04:09:47 GMT; Secure; SameSite=Lax
set-cookie: logged_in=no; Path=/; Domain=github.com; Expires=Sun, 19 Jul 2026 04:09:47 GMT; HttpOnly; Secure; SameSite=Lax
x-github-request-id: B67C:249704:82A28:B6C2B:687B1A8B
[Java] 1.6.0 -> 1.6.1 Backwards compatibility change when decoding nested groups · Issue #754 · aeron-io/simple-binary-encoding · GitHub
No one assignedNo labelsNo typeNo projectsNo milestoneNone yetNo branches or pull requests
Skip to content
Navigation Menu
{{ message }}
-
Notifications
You must be signed in to change notification settings - Fork 542
Closed
Description
Hi,
When upgrading to SBE 1.6.1 from 1.6.0, two of our backwards compatibility tests failed.
Looking into this in more detail, we believe it is to do with commit 6852773
Given version 1 of a schema
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
<messageSchema package="com.transficc.sbecompatibility.test2.protocol.v1"
id="0"
version="1"
semanticVersion="1.0"
description="Unit Test For Compatibility"
byteOrder="littleEndian">
<types>
<composite name="messageHeader" description="Message identifiers and length of message root">
<type name="blockLength" primitiveType="uint16"/>
<type name="templateId" primitiveType="uint16"/>
<type name="schemaId" primitiveType="uint16"/>
<type name="version" primitiveType="uint16"/>
</composite>
<composite name="groupSizeEncoding" description="Repeating group dimensions">
<type name="blockLength" primitiveType="uint16"/>
<type name="numInGroup" primitiveType="uint8" semanticType="NumInGroup"/>
</composite>
</types>
<message name="Message" id="2" description="Message">
<field name="longField1" id="0100000000" type="int64"/>
<group dimensionType="groupSizeEncoding" name="group1" id="0300000000">
<field name="longField1" id="0301000000" type="int64"/>
</group>
</message>
</messageSchema>
And version 2 of the schema where we add a nested group
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
<messageSchema package="com.transficc.sbecompatibility.test2.protocol.v2"
id="0"
version="2"
semanticVersion="1.1"
description="Unit Test For Compatibility"
byteOrder="littleEndian">
<types>
<composite name="messageHeader" description="Message identifiers and length of message root">
<type name="blockLength" primitiveType="uint16"/>
<type name="templateId" primitiveType="uint16"/>
<type name="schemaId" primitiveType="uint16"/>
<type name="version" primitiveType="uint16"/>
</composite>
<composite name="groupSizeEncoding" description="Repeating group dimensions">
<type name="blockLength" primitiveType="uint16"/>
<type name="numInGroup" primitiveType="uint8" semanticType="NumInGroup"/>
</composite>
</types>
<message name="Message" id="2" description="Message">
<field name="longField1" id="0100000000" type="int64"/>
<group dimensionType="groupSizeEncoding" name="group1" id="0300000000">
<field name="longField1" id="0301000000" type="int64"/>
<group dimensionType="groupSizeEncoding" name="nestedGroup" id="0304000000" presence="optional" sinceVersion="2">
<field name="longField1" id="0304010000" type="int64" presence="optional" sinceVersion="2"/>
</group>
</group>
</message>
</messageSchema>
When we use the version 1 encoder to encode a message and the version 2 decode to decode the message, the generated decoder for the nested group thinks there is an entry for the repeated group and attempts to decode. This occurs because the hasNext
has been changed to check return index < count
rather than return (index + 1) < count;\n"
I have a unit test that proves this but wasn't sure where in the SBE code base to to add:
@Test
void shouldNotAttemptToDecodeNestedGroupForMessageEncodedUsingV1Encoder()
{
final int expectedLongField1Value = 435;
final int expectedGroupCount = 1;
final int expectedGroupLongField1Value = 678;
final int expectedNestedGroupCount = 0;
final MutableDirectBuffer buffer = new ExpandableArrayBuffer(1024);
//Encode using v1 encoder
final MessageEncoder v1MessageEncoder = new MessageEncoder();
final MessageHeaderEncoder v1HeaderEncoder = new MessageHeaderEncoder();
v1MessageEncoder.wrapAndApplyHeader(buffer, OFFSET, v1HeaderEncoder);
v1MessageEncoder.longField1(expectedLongField1Value);
final MessageEncoder.Group1Encoder group1Encoder = v1MessageEncoder.group1Count(expectedGroupCount);
group1Encoder
.next()
.longField1(expectedGroupLongField1Value);
//Decode using v2 decode
final MessageDecoder v2MessageDecoder = new MessageDecoder();
final MessageHeaderDecoder v2HeaderDecoder = new MessageHeaderDecoder();
v2HeaderDecoder.wrap(buffer, OFFSET);
v2MessageDecoder.wrap(buffer, OFFSET + v2HeaderDecoder.encodedLength(), v2HeaderDecoder.blockLength(), v2HeaderDecoder.version());
Assertions.assertEquals(expectedLongField1Value, v2MessageDecoder.longField1());
final MessageDecoder.Group1Decoder v2Group1Decoder = v2MessageDecoder.group1();
Assertions.assertEquals(expectedGroupCount, v2Group1Decoder.count());
for (final MessageDecoder.Group1Decoder decoder : v2Group1Decoder)
{
Assertions.assertEquals(expectedGroupLongField1Value, decoder.longField1());
final MessageDecoder.Group1Decoder.NestedGroupDecoder v2NestedGroupDecoder1 = decoder.nestedGroup();
Assertions.assertEquals(v2NestedGroupDecoder1.count(), expectedNestedGroupCount);
for (final MessageDecoder.Group1Decoder.NestedGroupDecoder nestedGroupDecoder : v2NestedGroupDecoder1)
{
final long nestedGroupField = nestedGroupDecoder.longField1();
Assertions.fail("Should never enter this loop. Read value for nested group field: " + nestedGroupField);
}
}
}
Was this change in behaviour expected / intentional?
Thanks,
Tom
Metadata
Metadata
Assignees
Labels
No labels
Type
Projects
Milestone
Relationships
Development
Issue actions
You can’t perform that action at this time.