On Tue, Aug 2, 2016 at 7:36 AM, Denis Magda <dma...@gridgain.com> wrote:
> Vova, > > By default hasCode field will be initialized this way in > BinaryObjectBuilderImpl > > /** */ > private static Integer DFLT_HASH_CODE_MAGIC = 0; > > /** */ > private Integer hashCode = DFLT_HASH_CODE_MAGIC; > > Also we will introduce the following flag in BinaryUtils > > /** Flag indicating whether as hashCode was explicitly set or not. **/ > public static final short EMPTY_HASH_CODE_FLAG = 0x0032; > > At the BinaryObjectBuilder.build() time we will perform the check below > and write hashCodeFlag. > > > short hashCodeFlag = hashCode == DFLT_HASH_CODE_MAGIC ? > BinaryUtils.EMPTY_HASH_CODE_FLAG : 0; > > // Write hashCode flag as well. > writer.postWrite(true, registeredType, hashCode, hashCodeFlag); > > Later when a BinaryObject is used as a key we can check the value of > BinaryUtils.EMPTY_HASH_CODE_FLAG > and throw an exception if it’s not empty. > > Makes sense? > It does to me. If there are no objections, then we should list this in the ticket and implement the proposed suggestion of throwing exception if a binary object without hashcode is used as a key. > > — > Denis > > > On Aug 2, 2016, at 7:09 AM, Vladimir Ozerov <voze...@gridgain.com> > wrote: > > > > Denis, > > > > I hardly can imagine how it could work in our binary protocol. Can you > > please elaborate? > > > > On Tue, Aug 2, 2016 at 5:06 PM, Denis Magda <dma...@gridgain.com> wrote: > > > >> There is a technique we already use to see if a field is initialized by > >> application code. By default a field has to be a reference to a > predefined > >> object and the reference comparison (not equals) is used to check if the > >> field is initialized by the user. > >> > >> Refer to IgniteConfiguration.failureDetectionTimeout and > >> IgniteSpiAdapter.initializeFailureDetectionTimeout for more details. > >> > >> — > >> Denis > >> > >>> On Aug 2, 2016, at 12:14 AM, Alexander Paschenko < > >> alexander.a.pasche...@gmail.com> wrote: > >>> > >>> Dmitriy, > >>> > >>> Good point, however, currently there's no way to distinguish hash code > >>> of zero which is a valid case from missing hash code. We probably > >>> should enhance binary builder for it to handle this case. > >>> > >>> - Alex > >>> > >>> 2016-08-02 9:47 GMT+03:00 Dmitriy Setrakyan <dsetrak...@apache.org>: > >>>> On Mon, Aug 1, 2016 at 11:38 PM, Vladimir Ozerov < > voze...@gridgain.com> > >>>> wrote: > >>>> > >>>>> Andrey, > >>>>> > >>>>> The question is when to print this warning. I doubt we can print a > >> warning > >>>>> when calling *BinaryObjectBuilder.build() *method, because an object > >>>>> without a hash code is normal situation. > >>>>> > >>>>> > >>>> I would not only print warning, but throw exception, if an object > >> without a > >>>> hashCode ends up on a put or read operation in cache. > >>>> > >>>> > >>>>> On Tue, Aug 2, 2016 at 9:00 AM, Andrey Gura <ag...@gridgain.com> > >> wrote: > >>>>> > >>>>>> I think we also should print some warning in case when hashCode() > >> wasn't > >>>>>> called on BinaryObject explicitly. > >>>>>> > >>>>>> On Tue, Aug 2, 2016 at 2:20 AM, Dmitriy Setrakyan < > >> dsetrak...@apache.org > >>>>>> > >>>>>> wrote: > >>>>>> > >>>>>>> On Mon, Aug 1, 2016 at 10:01 AM, Alexey Goncharuk < > >>>>>>> alexey.goncha...@gmail.com> wrote: > >>>>>>> > >>>>>>>> Dmitriy, > >>>>>>>> > >>>>>>>> The question is how do you calculate the value of the hashCode? Do > >>>>> you > >>>>>>> want > >>>>>>>> it to be specified explicitly in INSERT statement? > >>>>>>>> > >>>>>>> > >>>>>>> I think optionally we should allow to specify hashCode as part of > the > >>>>>>> INSERT statement. However, if it is not specified, we should > >> calculate > >>>>> it > >>>>>>> automatically based in the key fields defined in the schema/type. > >>>>> Agree? > >>>>>>> > >>>>>>> > >>>>>>>> > >>>>>>>> 2016-08-01 19:47 GMT+03:00 Dmitriy Setrakyan < > dsetrak...@apache.org > >>>>>> : > >>>>>>>> > >>>>>>>>> Alex, > >>>>>>>>> > >>>>>>>>> In your case, why not just explicitly set hashcode every time you > >>>>>>> create > >>>>>>>> an > >>>>>>>>> object? There is BinaryObjectBuilder.hashCode(...) method. > >>>>>>>>> > >>>>>>>>> D. > >>>>>>>>> > >>>>>>>>> On Mon, Aug 1, 2016 at 7:42 AM, al.psc < > >>>>>>> alexander.a.pasche...@gmail.com> > >>>>>>>>> wrote: > >>>>>>>>> > >>>>>>>>>> Guys, > >>>>>>>>>> > >>>>>>>>>> It seems like this problem has become an important one once > >>>>> again. > >>>>>>>>>> In the course of working on > >>>>>>>>>> https://issues.apache.org/jira/browse/IGNITE-2294 (DML support) > >>>>>>>> there's > >>>>>>>>>> need > >>>>>>>>>> to support binary marshaller. And, although we can build just > >>>>>>>>> BinaryObject > >>>>>>>>>> and put it to cache, without adequate hash code it won't be > >>>>> stored > >>>>>>>>>> properly. > >>>>>>>>>> Currently SQL MERGE works simply by deserializing newly built > >>>>>> object, > >>>>>>>> but > >>>>>>>>>> it's obviously wrong and is just a workaround rather a solution. > >>>>>>>>>> Has anyone come with possible design proposals for this > problem's > >>>>>>>>> solution? > >>>>>>>>>> > >>>>>>>>>> Thanks. > >>>>>>>>>> > >>>>>>>>>> - Alex > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> -- > >>>>>>>>>> View this message in context: > >>>>>>>>>> > >>>>>>>>> > >>>>>>>> > >>>>>>> > >>>>>> > >>>>> > >> > http://apache-ignite-developers.2346864.n4.nabble.com/All-BinaryObjects-created-by-BinaryObjectBuilder-stored-at-the-same-partition-by-default-tp8042p10304.html > >>>>>>>>>> Sent from the Apache Ignite Developers mailing list archive at > >>>>>>>>> Nabble.com. > >>>>>>>>>> > >>>>>>>>> > >>>>>>>> > >>>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>>>> -- > >>>>>> Andrey Gura > >>>>>> GridGain Systems, Inc. > >>>>>> www.gridgain.com > >>>>>> > >>>>> > >> > >> > >