You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tuscany.apache.org by Jean-Sebastien Delfino <js...@apache.org> on 2007/10/08 22:22:59 UTC
To copy or not to copy, that is the question, was: Pass-by-value
interceptor
Raymond Feng wrote:
> More comments inline.
>
> Thanks,
> Raymond
>
> ----- Original Message ----- From: "Scott Kurz" <sc...@gmail.com>
> To: <tu...@ws.apache.org>
> Sent: Friday, October 05, 2007 1:57 PM
> Subject: Re: Pass-by-value interceptor
>
>
>> Maybe it would help for me to point out that I'd opened 1678,79,80
>> before
>> the refactoring for
>> TUSCANY-1559 was performed.
>>
>> As I have the time I'll try to understand to what degree if any 1559 may
>> have addressed the issues I mentioned.
>>
>> But Raymond, on the surface it seems like you're suggesting going
>> back to
>> how it was pre-1559, though with
>> a per-implementation-type extension instead of just the old
>> PassByValueInvoker associated with the Java implementation.
>
> Yes.
>
>>
>> To me it seemed like one not-too-hard change to address 1678 would
>> be to
>> have a flag in the Message SPI
>> that says, "there's no need to do a copy". This would be off by
>> default but
>> a binding impl or databinding transform could switch it on.
>
> We're trying hard to avoid additional fields on the Message unless
> it's absolutely necessary.
>
>>
>>
>
> I'm not sure if it's a good idea to rely on the pass-by-value
> interceptor to deal with object marshaling/unmarshaling accross
> classloaders. To handle the optimization for co-located components
> (different classloader) in the same VM, we probably should add an
> "marshaling interceptor" on the client side and "unmarshling
> interceptor" on the service side.
>
>>
>> On 10/5/07, Raymond Feng <en...@gmail.com> wrote:
>>>
>>> Hi,
>>>
>>> I'm looking into JIRA TUSCANY-1678, TUSCANY-1679, TUCANY-1680. At this
>>> moment, the pass-by-value interceptor is added by the
>>> DataBindingRuntimeWireProcessor. I start to wonder if it's the right
>>> approach. The pass-by-value semantics is somehow
>>> implementation-specific
>>> and
>>> it also requires some metadata from the Implementation (for example,
>>> @AllowsPassByReference in java components). It seems that the
>>> implementation
>>> type extension will have more knowledge to enforce the pass-by-value.
>>>
>>> Does it make better sense to have implementation type extension be
>>> responsible to set up the pass-by-value interceptor?
>>>
>>> Thanks,
>>> Raymond
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
>>> For additional commands, e-mail: tuscany-dev-help@ws.apache.org
>>>
A few thoughts... If I understand correctly, we're trying to guarantee
that business data flowing through a remote interface is guaranteed to
not be changed.
Looking at a number of scenarios, I'm making the following observations:
- Some bindings can guarantee it because they're just writing the data
to a network connection.
- Other bindings can't guarantee it because they're passing a pointer to
the data in memory to somebody else.
- Some component implementations can guarantee that, for example if I
remember correctly a BPEL process will not modify its input data, a
mediation component if we had one would probably not change its input
data either.
- Other component implementations will pass a pointer to the data in
memory to user code, and can't guarantee that the user code won't change it.
- Some component implementations (e.g. Java) have defined a way for the
application developer to declare that he'll be nice and won't modify the
data (see @AllowsPassByReference).
- In some cases, whatever the binding or component implementation say,
the Tuscany databinding machinery must convert the data from one
representation to another, indirectly protecting the original data
against any changes.
- The same extends to other types of interceptors, for example an
encryption or compression interceptor naturally protects the data
against changes as it passes an encrypted or compressed representation
of the data in place of the original data.
- Finally, all the above conditions must be evaluated on a business
operation basis.
Considering all this, I think bindings, implementations, and all
interceptors in an invocation chain should state if they are going to
protect data against changes or not, and we need that information on an
operation basis. I'd suggest to add a method to oat.sca.invocation.Invoker {
// I'm not sure about the best name for this method.
boolean allowsPassByReference();
or
boolean doesNotChangeInputData();
or
boolean protectsInputData();
}
The wire algorithm will have to call that method on the Invokers in an
invocation chain to decide if it's safe to pass the original data or if
a copy of the data should be passed instead. If an invoker claims to
protect the data then we can pass the original data, if no invoker in
the invocation chain claims to protect the data then we need to copy it.
Now the next question is: Who should perform the copy?
I don't think it's fair to require bindings and implementations to know
how to copy all the different data representations supported in Tuscany
:) I think it's better to have a generic CopyInterceptor to do that,
leveraging the databinding framework.
On the other hand, if a particular implementation recognizes a specific
data representation and wants to make the copy itself, it can still do
it simply by having its Invoker.allowsPassByReference() return true.
Thoughts?
--
Jean-Sebastien
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-dev-help@ws.apache.org
Re: To copy or not to copy, that is the question, was: Pass-by-value
interceptor
Posted by Jean-Sebastien Delfino <js...@apache.org>.
Jean-Sebastien Delfino wrote:
> Raymond Feng wrote:
>> More comments inline.
>>
>> Thanks,
>> Raymond
>>
>> ----- Original Message ----- From: "Scott Kurz" <sc...@gmail.com>
>> To: <tu...@ws.apache.org>
>> Sent: Friday, October 05, 2007 1:57 PM
>> Subject: Re: Pass-by-value interceptor
>>
>>
>>> Maybe it would help for me to point out that I'd opened 1678,79,80
>>> before
>>> the refactoring for
>>> TUSCANY-1559 was performed.
>>>
>>> As I have the time I'll try to understand to what degree if any 1559
>>> may
>>> have addressed the issues I mentioned.
>>>
>>> But Raymond, on the surface it seems like you're suggesting going
>>> back to
>>> how it was pre-1559, though with
>>> a per-implementation-type extension instead of just the old
>>> PassByValueInvoker associated with the Java implementation.
>>
>> Yes.
>>
>>>
>>> To me it seemed like one not-too-hard change to address 1678 would
>>> be to
>>> have a flag in the Message SPI
>>> that says, "there's no need to do a copy". This would be off by
>>> default but
>>> a binding impl or databinding transform could switch it on.
>>
>> We're trying hard to avoid additional fields on the Message unless
>> it's absolutely necessary.
>>
>>>
>>>
>>
>> I'm not sure if it's a good idea to rely on the pass-by-value
>> interceptor to deal with object marshaling/unmarshaling accross
>> classloaders. To handle the optimization for co-located components
>> (different classloader) in the same VM, we probably should add an
>> "marshaling interceptor" on the client side and "unmarshling
>> interceptor" on the service side.
>>
>>>
>>> On 10/5/07, Raymond Feng <en...@gmail.com> wrote:
>>>>
>>>> Hi,
>>>>
>>>> I'm looking into JIRA TUSCANY-1678, TUSCANY-1679, TUCANY-1680. At this
>>>> moment, the pass-by-value interceptor is added by the
>>>> DataBindingRuntimeWireProcessor. I start to wonder if it's the right
>>>> approach. The pass-by-value semantics is somehow
>>>> implementation-specific
>>>> and
>>>> it also requires some metadata from the Implementation (for example,
>>>> @AllowsPassByReference in java components). It seems that the
>>>> implementation
>>>> type extension will have more knowledge to enforce the pass-by-value.
>>>>
>>>> Does it make better sense to have implementation type extension be
>>>> responsible to set up the pass-by-value interceptor?
>>>>
>>>> Thanks,
>>>> Raymond
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
>>>> For additional commands, e-mail: tuscany-dev-help@ws.apache.org
>>>>
>
> A few thoughts... If I understand correctly, we're trying to guarantee
> that business data flowing through a remote interface is guaranteed to
> not be changed.
>
> Looking at a number of scenarios, I'm making the following observations:
>
> - Some bindings can guarantee it because they're just writing the data
> to a network connection.
>
> - Other bindings can't guarantee it because they're passing a pointer
> to the data in memory to somebody else.
>
> - Some component implementations can guarantee that, for example if I
> remember correctly a BPEL process will not modify its input data, a
> mediation component if we had one would probably not change its input
> data either.
>
> - Other component implementations will pass a pointer to the data in
> memory to user code, and can't guarantee that the user code won't
> change it.
>
> - Some component implementations (e.g. Java) have defined a way for
> the application developer to declare that he'll be nice and won't
> modify the data (see @AllowsPassByReference).
>
> - In some cases, whatever the binding or component implementation say,
> the Tuscany databinding machinery must convert the data from one
> representation to another, indirectly protecting the original data
> against any changes.
>
> - The same extends to other types of interceptors, for example an
> encryption or compression interceptor naturally protects the data
> against changes as it passes an encrypted or compressed representation
> of the data in place of the original data.
>
> - Finally, all the above conditions must be evaluated on a business
> operation basis.
>
>
> Considering all this, I think bindings, implementations, and all
> interceptors in an invocation chain should state if they are going to
> protect data against changes or not, and we need that information on
> an operation basis. I'd suggest to add a method to
> oat.sca.invocation.Invoker {
>
> // I'm not sure about the best name for this method.
> boolean allowsPassByReference();
> or
> boolean doesNotChangeInputData();
> or
> boolean protectsInputData();
> }
>
> The wire algorithm will have to call that method on the Invokers in an
> invocation chain to decide if it's safe to pass the original data or
> if a copy of the data should be passed instead. If an invoker claims
> to protect the data then we can pass the original data, if no invoker
> in the invocation chain claims to protect the data then we need to
> copy it.
>
>
> Now the next question is: Who should perform the copy?
>
> I don't think it's fair to require bindings and implementations to
> know how to copy all the different data representations supported in
> Tuscany :) I think it's better to have a generic CopyInterceptor to do
> that, leveraging the databinding framework.
>
> On the other hand, if a particular implementation recognizes a
> specific data representation and wants to make the copy itself, it can
> still do it simply by having its Invoker.allowsPassByReference()
> return true.
>
> Thoughts?
>
More thoughts:
- At the beginning of this thread, Scott was talking about using
different classloaders in different components in a VM. Since then we've
started another discussion on classloaders in Tuscany general, see
http://marc.info/?l=tuscany-dev&m=119210552631425
- My 2c. If a binding allows in-VM in-memory cross-classloader
communication, it should be responsible for converting data across
classloaders, possibly using facilities from the Tuscany Databinding
framework, and/or the facilities offered by the underlying communication
mechanism that it's using. But before going too quickly into discussing
a solution, Scott what kind of binding were you thinking about?
--
Jean-Sebastien
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-dev-help@ws.apache.org