Repository navigation
IGNITE-29199 Fix local IndexQuery returning binary objects for a cache not in keep-binary mode - #13744
Merged
Conversation
rezataroosheh
marked this pull request as ready for review
October 23, 2026 22:05
…e not in keep-binary mode
timoninmaxim
requested changes
Oct 25, 2026
| /** Should keep binary values for a cache in keep-binary mode. */ | ||
| @Test | ||
| public void testLocalQueryKeepBinaryReturnsBinaryValues() { | ||
| IgniteCache<Long, Person> cache = crd.createCache(ccfg(CacheMode.REPLICATED)); |
Member
There was a problem hiding this comment.
This test don't check binary key. Long should be replaced with POJO
Contributor
Author
There was a problem hiding this comment.
Thanks! Replaced the Long key with a PersonId POJO. Both tests now check the key and the value: the first checks that they deserialize; the keep-binary one checks that they come back as BinaryObject.
rezataroosheh
force-pushed
the
IGNITE-29199
branch
from
October 25, 2026 19:03
7c30d02 to
dac577d
Compare
|
|
||
| @Override protected Object onNext() throws IgniteCheckedException { | ||
| IgniteBiTuple<K, V> entry = iter.nextX(); | ||
| IgniteBiTuple<K, V> entry = (IgniteBiTuple<K, V>)cctx.unwrapBinaryIfNeeded(iter.nextX(), qry.keepBinary(), false, null); |
Member
There was a problem hiding this comment.
Key/Value can be unwrap separately to avoid allocation of an additional tuple.
Contributor
Author
There was a problem hiding this comment.
Done. The key and value are now unwrapped separately and passed directly to CacheEntryImpl, so no extra tuple is created.
timoninmaxim
approved these changes
Oct 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
A local
IndexQuery(setLocal(true)) on a cache that is not in keep-binary mode now returns deserialized keys and values, the same as the distributed query. Queries throughwithKeepBinary()still returnBinaryObjects.Why
IndexQueryProcessor#queryLocalalways returns rows in binary form. On the distributed path, the query future converts them using the query'skeepBinaryflag (GridCacheQueryFutureAdapter#unwrapIfNeeded). The local path (GridCacheQueryManager#indexQueryLocal) skipped that step, so a typed read of a local result failed withClassCastException. It was reported on the dev list.The fix applies the same
unwrapBinaryIfNeeded(..., qry.keepBinary(), ...)call inindexQueryLocal.IndexQueryProcessoris not changed, because it also serves the remote side of distributed queries.Compatibility: code that reads local results of a non-keep-binary cache as
BinaryObjectwill now get the cache's own classes. Such code can usewithKeepBinary(), which keeps the binary form.Note: this touches the same method as #13735 (IGNITE-29191), so whichever is merged second needs a small rebase.
Tests
New tests in
IndexQueryLocalTest:testLocalQueryReturnsDeserializedValues: a local query on a non-keep-binary cache returnsPersonvalues. It fails without the fix (the values areBinaryObjects).testLocalQueryKeepBinaryReturnsBinaryValues: a local query throughwithKeepBinary()still returnsBinaryObjects.The Contribution Checklist
The description explains WHAT and WHY was made instead of HOW.
The following pattern must be used:
IGNITE-XXXX Change summarywhereXXXX- number of JIRA issue.(see the Maintainers list)
the
green visaattached to the JIRA ticket (see tabPR Checkat TC.Bot - Instance 1 or TC.Bot - Instance 2)Notes
If you need any help, please email dev@ignite.apache.org or ask any advice on https://the-asf.slack.com #ignite channel.