Replacing full encoding with structural value is a good way to provide an
opportunity for a fast past. File a starter JIRA?

The equals check should be retained since it will sometimes be even faster,
and structural value falls back to full encoding.

On Tue, Jun 20, 2017 at 8:19 AM, Lukasz Cwik <lc...@google.com.invalid>
wrote:

> I think the mutation detector could be updated to use the coder's
> structural value and the coder could then provide a structural value which
> wraps the message and does the equality comparison however it chooses.
> https://github.com/apache/beam/blob/01b3f87f977d44eac23eb5488074bb
> c638858a9d/sdks/java/core/src/main/java/org/apache/beam/sdk/
> coders/Coder.java#L252
>
> On Tue, Jun 20, 2017 at 8:16 AM, Lukasz Cwik <lc...@google.com> wrote:
>
> > Either Java object equality or its coder needs to be deterministic for
> > that check to hold.
> >
> > On Tue, Jun 20, 2017 at 7:49 AM, Reuven Lax <re...@google.com.invalid>
> > wrote:
> >
> >> Him
> >>
> >> That is only a fast path. If equals returns false, it then encodes the
> >> values to a byte array and checks the byte array for equality. So as
> long
> >> as you havev a correct coder, this should work.
> >>
> >> On Tue, Jun 20, 2017 at 2:06 AM, Jean-Baptiste Onofré <j...@nanthrax.net>
> >> wrote:
> >>
> >> > Hi Kenn,
> >> >
> >> > I checked in MutationDetectors, and we use the
> >> > CodedValueMutationDetector(T value, Coder<T> coder).
> >> >
> >> > To verify mutation, we use the verifyUnmodified() method calling
> >> > verifyUnmodifiedThrowingCheckedExceptions().
> >> >
> >> > In the verifyUnmodifiedThrowingCheckedExceptions() method, basically,
> >> we
> >> > do:
> >> >
> >> >       if (Objects.equals(possiblyModifiedObject,
> clonedOriginalObject)
> >> >           || Objects.equals(clonedOriginalObject,
> >> > possiblyModifiedObject)) {
> >> >         return;
> >> >       }
> >> >
> >> > (populated with CoderUtils).
> >> >
> >> > So, in a test, I mimic the MutationDetector doing:
> >> >
> >> >     Message message = Message.Factory.create();
> >> >     message.setBody(new AmqpValue("test"));
> >> >     byte[] encoded = CoderUtils.encodeToByteArray(coder, message);
> >> >     Message clone = CoderUtils.decodeFromByteArray(coder, encoded);
> >> >     assertTrue(Objects.equals(message, clone));
> >> >     assertTrue(Objects.equals(clone, message));
> >> >
> >> > And it fails as Message doesn't provide a custom equals() method.
> >> >
> >> > So, I guess the only way is to extend Message to provide equals
> method.
> >> >
> >> > I'm experimenting this now.
> >> >
> >> > Regards
> >> > JB
> >> >
> >> > On 06/19/2017 07:57 AM, Kenneth Knowles wrote:
> >> >
> >> >> Last I checked, equals() was used only as a shortcut. If the two are
> >> not
> >> >> equals() then their encoded forms should be checked. If neither
> >> equals()
> >> >> nor the coder can work for this, you will have a bad time.
> >> >>
> >> >> On Sun, Jun 18, 2017 at 10:14 PM, Jean-Baptiste Onofré <
> >> j...@nanthrax.net>
> >> >> wrote:
> >> >>
> >> >> Hi team,
> >> >>>
> >> >>> The direct runner checks that there's no mutation on elements in a
> >> >>> PCollection thanks to ImmutabilityEnforcementFactory.
> >> >>> This factory uses CodedValueMutationDetector to detect if an element
> >> has
> >> >>> been changed or not.
> >> >>>
> >> >>> The CodedValueMutationDetector uses equals (in the
> >> >>> verifyUnmodifiedThrowingCheckedExceptions() method) for that.
> >> >>>
> >> >>> However, in an IO on which I'm working on, the element class doesn't
> >> >>> override equals and it fails with:
> >> >>>
> >> >>> org.apache.beam.sdk.util.IllegalMutationException: PTransform
> >> >>> AmqpIO.Write/ParDo(Write)/ParMultiDo(Write) illegaly mutated value
> >> >>> Message{body=AmqpValue{Test 0}} of class class
> >> >>> org.apache.qpid.proton.message.impl.MessageImpl. Input values must
> >> not
> >> >>> be
> >> >>> mutated in any way.
> >> >>>
> >> >>> So, basically my question is:
> >> >>>
> >> >>> 1. Do I need to wrap the message in a custom wrapper overriding the
> >> >>> equals() method ?
> >> >>> 2. Maybe we could improve a bit the checker in the direct runner ?
> >> >>>
> >> >>> Thanks
> >> >>> Regards
> >> >>> JB
> >> >>> --
> >> >>> Jean-Baptiste Onofré
> >> >>> jbono...@apache.org
> >> >>> http://blog.nanthrax.net
> >> >>> Talend - http://www.talend.com
> >> >>>
> >> >>>
> >> >>
> >> > --
> >> > Jean-Baptiste Onofré
> >> > jbono...@apache.org
> >> > http://blog.nanthrax.net
> >> > Talend - http://www.talend.com
> >> >
> >>
> >
> >
>

Reply via email to