Agree with Denis.

   - by default, all non-transient key fields should participate in the
   hashcode generation
   - when working on DDL, then the primary key fields should participate in
   the hashcode
   - we should add a resolver to override the default behavior (please
   propose the interface in Jira)
   - we should print out a warning, only once per type, the the hashcode
   has been automatically generated based on which fields and which formula

D.

On Tue, Sep 27, 2016 at 5:42 PM, Denis Magda <dma...@gridgain.com> wrote:

> Hi Alexander,
>
> Vladimir’s proposal sounds reasonable to me. However we must keep in mind
> one important thing. Binary objects were designed to address the following
> disadvantages a regular serializer, like optimized marshaller, has:
> necessity to deserialize an object on a server side every time it’s needed.
> necessity to hold an object in both serialized and deserialized forms on
> the server node.
> necessity to restart the whole cluster each time an object version is
> changed (new field is added or an old one is removed).
> If it will be needed to perform step 3 for a default implementation of the
> binary resolver just because the resolver has to consider new fields or
> ignore old ones then such an implementation sucks. Overall, the default
> implementation should use the reflection coming over all the fields a key
> has ignoring the ones that are marked with “transient” keyword. If a user
> wants to control the default resolver's logic then he can label all the
> fields that mustn’t be of a final has code value with “transient”. This has
> to be well-documented for sure.
>
> Makes sense?
>
> —
> Denis
>
> > On Sep 26, 2016, at 12:40 PM, Alexander Paschenko <
> alexander.a.pasche...@gmail.com> wrote:
> >
> > Hello Igniters,
> >
> > As DML support is near, it's critical that we agree on how we generate
> > hash codes for new keys in presence of binary marshaller. Actually,
> > this discussion isn't new - please see its beginning here:
> >
> > http://apache-ignite-developers.2346864.n4.nabble.
> com/All-BinaryObjects-created-by-BinaryObjectBuilder-stored-
> at-the-same-partition-by-default-td8042.html
> >
> > Still, I'm creating this new thread to make getting to the final
> > solution as simple and fast as possible.
> >
> > I remind everyone that the approach that has got the least critics was
> > the one proposed by Vladimir Ozerov:
> >
> > <quote>
> > I think we can do the following:
> > 1) Add "has hash code" flag as Denis suggested.
> > 2) If object without a hash code is put to cache, throw an exception.
> > 3) Add *BinaryEqualsHashCodeResolver *interface.
> > 4) Add default implementation which will auto-generate hash code. *Print
> a
> > warning when auto-generation occurs*, so that user is aware that he is
> > likely to have problems with normal GETs/PUTs.
> > 5) Add another implementation which will use encoded string to calculate
> a
> > hash code. E.g. *new BinaryEqualsHashCodeResolver("{a} * 31 + {b}")*.
> > Originally proposed by Yakov some time ago.
> > </quote>
> >
> > After that, Sergi suggested that instead of a "formula" we keep just a
> > list of the "fields" that participate in hash code evaluation, and
> > with that list, we simply calculate hash code just like IDE does -
> > with all its bit shifts and additions.
> >
> > I'm planning on settling down with this combined Vlad-Sergi approach.
> > Any objections?
> >
> > And an extra question I have: Vlad, you suggest that we both throw an
> > exception on cache code absence and that we might generate it as the
> > last resort. Do I understand you correctly that you suggest generating
> > random code only in context of SQL, but throw exception for keys
> > without codes on ordinary put?
> >
> > And yes, built-in hash codes for JDK types are supported as well as
> > items 1-2 from Vlad's list (there's already fixed issue of IGNITE-3633
> > for the flag and its presence check).
> >
> > - Alex
>
>

Reply via email to