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?

—
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
>>>>>> 
>>>>> 
>> 
>> 

Reply via email to