Hi Peter,

Could you post a link to Startable? I'm on the road with sporadic connectivity.

Thanks

Dennis

Sent from my iPhone

> On Dec 18, 2013, at 7:42 PM, Peter <j...@zeus.net.au> wrote:
> 
> +1 Peter.
> 
> 
> I've been going over the Exporter implementations and Exporter interface.
> 
> The Exporter interface specifies that export and unexport behaviour is 
> defined by the implementation. 
> 
> That means it's up to the implementation to specify whether a happens before 
> edge occures before export.
> 
> I propose we document in Exporter, that if export is called during object 
> construction then that object's implementation cannot safely use final fields.
> 
> We should also provide a @see reference to Startable to reccommend its use 
> when final fields are desirable and include Startable in the spec.
> 
> We don't need to rewrite the example of exporting in net.jini.config as 
> export isn't performed during construction.
> 
> This is a minor update to the Jini Specification.
> 
> The FINE log message is an implementation detail and won't be included.
> 
> Regards,
> 
> Peter.
> 
> ----- Original message -----
>> No, an effectively immutable field is one whose reference doesn't change
>> after the service objects safe publication.
>> 
>> An immutable field is final.
>> 
>> It would be Jeri's responsibility to safely publish the service during
>> export to ensure a happens before event occurs, ensuring all non
>> volatile fields the service contains are safely published and visible.
>> 
>> It's possible to have mutable fields guarded by synchronized methods, or
>> volatile fields.
>> 
>> But it isn't possible to have final fields when exporting within the
>> constructor.
>> 
>> If the service contains effectively immutable field references, it must
>> be safely published or if another thread accesses those fields through
>> unsynchronized methods, the thread may only see their default value.
>> 
>> All our service implementations have final fields.   All our services had
>> some unsynchronized access to non volatile, non final fields.
>> 
>> Trouble is, when you can't have final fields, it's very difficult to
>> determine which fields are effectively immutable and the original
>> programmers design intent, if there's no comment.
>> 
>> Our service implementations all had unsynchronized init() methods called
>> from with the constructor that started threads and exported   Some fields
>> were final.
>> 
>> For me, a service that contains final fields and is exported after
>> construction is easier to maintain and understand.
>> 
>> I suspect, like our Jini service imlementations, most people get it
>> wrong most of the time.
>> 
>> I get that others won't want to use this method, however it would be
>> detrimental if we don't have such a method for those who would.
>> 
>> Regards,
>> 
>> Peter.
>> 
>> ----- Original message -----
>>> 
>>> I feel like we’re going down a rabbit hole here when you start talking
>>> about exporting immutable objects.    Wouldn’t it be kind of silly to
>>> export an immutable service?    Isn’t the whole point that you interact
>>> with the service (i.e. alter its state) over a remote interface?
>>> 
>>> Perhaps it’s better to say that exported services need to be
>>> thread-safe (which should be fairly obvious).    Yes, immutable objects
>>> are inherently thread-safe, so for sharing information inside a VM, it
>>> makes some sense to minimize the number of mutable objects you pass
>>> around.    But fundamentally, we’re talking about shared-state systems
>>> here.
>>> 
>>> Cheers,
>>> 
>>> Greg.
>>> 
>>>> On Dec 18, 2013, at 7:42 AM, Peter <j...@zeus.net.au> wrote:
>>>> 
>>>> Pat your comment about non final fields is interesting.
>>>> 
>>>> Isn't it also the case that we need to safely publish an effectively
>>>> immutable object to share it among threads?    That usually means
>>>> copying it to a thread safe collection or shared via a synchronized
>>>> method, volatile field, or final field in another object?
>>>> 
>>>> So we should also make sure that Jeri uses safe publication during
>>>> export.
>>>> 
>>>> That would allow a service that has no final fields to start threads,
>>>> then export from within a constructor safely, provided all operations
>>>> on non final fields happen before starting threads and exporting.
>>>> 
>>>> All our services have final fields, so Starter is more appropriate
>>>> for River's own services.
>>>> 
>>>> Regards,
>>>> 
>>>> Peter.
>>>> 
>>>> ----- Original message -----
>>>>> Hmm, good point, Startable, makes more sense.
>>>>> 
>>>>> An object can be exported using Startable.
>>>>> 
>>>>> I think we should have a policy to strongly discourage exporting
>>>>> from constructors.
>>>>> 
>>>>> Regards,
>>>>> 
>>>>> Peter.
>>>>> 
>>>>> ----- Original message -----
>>>>>> As far as I can tell, the special properties of completing a
>>>>>> constructor      in the JLS memory model are:
>>>>>> 
>>>>>> 1. A happens-before edge from the end of the constructor to the
>>>>>> start of      a finalizer. (17.4.5)
>>>>>> 
>>>>>> 2. The guarantee that any thread that only sees a reference to an
>>>>>> object      after the end of the constructor will see the
>>>>>> correctly initialized      values of all final fields. (17.5)
>>>>>> 
>>>>>> The special issue with final fields is that implementations have
>>>>>> freedom      to optimize access to final fields in ways that are
>>>>>> not permitted for      non-final fields. Strategies for thread
>>>>>> safety that work for non-final      fields do not necessarily
>>>>>> work for final fields. The requirement for      final field
>>>>>> safety is that the constructor end before another thread    
>>>>>> accesses the newly constructed object.
>>>>>> 
>>>>>> Calling a start() method after construction if the class
>>>>>> implements a    new interface seems to me to be harmless,
>>>>>> backwards compatible, and    useful. It enables the simplest and
>>>>>> most direct way of preventing access      to the new object by
>>>>>> another thread during construction.
>>>>>> 
>>>>>> The roadmap issue is whether it should be required, and if so the
>>>>>> level      of enforcement. For example, there is no reason to
>>>>>> require it if the      class does not declare any final fields.
>>>>>> 
>>>>>> Incidentally, and as a detail, "Commission" does not immediately
>>>>>> make me      think of having a start() method that should be
>>>>>> called after    construction. If you do go this way, the name
>>>>>> needs thought. "Startable"      would be more obvious, more
>>>>>> memorable, more likely to be found on      searches, and more
>>>>>> compatible with familiar interface names such as      "Cloneable"
>>>>>> and "Iterable".
>>>>>> 
>>>>>> Patricia
>>>>>> 
>>>>>> 
>>>>>>> On 12/18/2013 2:18 AM, Peter wrote:
>>>>>>> Well, now seems like a good time to have the conversation.
>>>>>>> 
>>>>>>> Yes there are other ways, but I haven't seen one safe
>>>>>>> implementation yet, so...
>>>>>>> 
>>>>>>> Does someone have a better way to solve this problem, has
>>>>>>> someone already solved this problem I'm unaware of that we can
>>>>>>> adopt, or is there a way that's more satisfactory?
>>>>>>> 
>>>>>>> If not, is there something objectionable with the Commission
>>>>>>> interface and if so, how can we fix it?
>>>>>>> 
>>>>>>> The SEVERE log message is logged by the River start package,
>>>>>>> other containers or frameworks can choose whether or not to do
>>>>>>> so, but I'd encourage them to do something similar, yes we can
>>>>>>> change it to WARN.
>>>>>>> 
>>>>>>> A much harsher option is to throw an exception during export
>>>>>>> which breaks backward compatibility.
>>>>>>> 
>>>>>>> Regards,
>>>>>>> 
>>>>>>> Peter.
>>>>>>> 
>>>>>>> ----- Original message -----
>>>>>>>> "org.apache.river.api.util.Commission is an interface
>>>>>>>> services should implement"
>>>>>>>> 
>>>>>>>> If it's a SHOULD, not a MUST, chucking out a SEVERE is
>>>>>>>> incorrect logger behaviour IMO. You could issue a WARN if you
>>>>>>>> like but for even that I'd say you need to provide a roadmap
>>>>>>>> explaining why the warning and what you intend to do in
>>>>>>>> future and what you expect of service writers such as myself.
>>>>>>>> 
>>>>>>>> Commission, at least from my point of view, is your means
>>>>>>>> (maybe the River community's - did you ask us?) for
>>>>>>>> satisfying your needs in respect of the JMM. As we've
>>>>>>>> discussed previously, there are other ways too and they work
>>>>>>>> and they are safe if you know what you're doing. Your
>>>>>>>> contention was that most don't know what they're doing
>>>>>>>> hence, presumably, Commission.
>>>>>>>> 
>>>>>>>> So the thing is, you are seemingly on a road to asserting
>>>>>>>> more structure (gosh, a standard?) on the way people write
>>>>>>>> their services. If so, you'd best start flagging that
>>>>>>>> honestly and openly via a roadmap, deprecation and
>>>>>>>> such/whatever rather than sticking out logger messages with
>>>>>>>> no clear guidance and at the cost of a certain amount of
>>>>>>>> nuisance (no admin I know likes SEVERE's being logged for
>>>>>>>> something which isn't critical cos it's noise they don't
>>>>>>>> want in log files).
>>>>>>>> 
>>>>>>>> And of course, we all know that when some entity asserts a
>>>>>>>> standard or requirement on others for entry, they may choose
>>>>>>>> not to enter. Does this help your community or hinder it? The
>>>>>>>> answer to that is, it depends. On what? Have you asked or
>>>>>>>> tested? How have you tested? What would be considered
>>>>>>>> validation or lack of support?
>>>>>>>> 
>>>>>>>> I am not out to flame or troll rather I want to see this
>>>>>>>> community demonstrating good behaviour and I'm not feeling
>>>>>>>> like what's going on around Commission (what is that big
>>>>>>>> change in version number really saying?) is such.
>>>>>>>> 
>>>>>>>>> On 18 December 2013 08:52, Peter <j...@zeus.net.au> wrote:
>>>>>>>>> 
>>>>>>>>> Just to clarify org.apache.river.api.util.Commission is an
>>>>>>>>> interface services should implement, I would encourage all
>>>>>>>>> container projects to pick up the interface and make
>>>>>>>>> suggestions for improvement if there are any issues.
>>>>>>>>> 
>>>>>>>>> Interface Commission {
>>>>>>>>> void start () throws Exception;
>>>>>>>>> }
>>>>>>>>> 
>>>>>>>>> It's called after JMM safe construction to allow the
>>>>>>>>> service to start any threads and be exported.
>>>>>>>>> 
>>>>>>>>> Regards,
>>>>>>>>> 
>>>>>>>>> Peter.
>>>>>>>>> 
>>>>>>>>> ----- Original message -----
>>>>>>>>>> 
>>>>>>>>>> The way that services are instantiated and setup is an
>>>>>>>>>> implementation detail.                    When I think of
>>>>>>>>>> compatibility I think of the API and the lookup methods.
>>>>>>>>>>                     We think of compatibility from a
>>>>>>>>>> client point of view.                    From the client
>>>>>>>>>> point of view, using a service looks like this:
>>>>>>>>>> 
>>>>>>>>>> - Use multicast of unicast discovery to find one or more
>>>>>>>>>> ServiceRegistrar instances                            -
>>>>>>>>>> Call lookup(…) on one or more of these instances to get
>>>>>>>>>> a set of service candidates    - Choose a candidate and
>>>>>>>>>> prepare() it using a ProxyPreparer, to yield a usable
>>>>>>>>>> service proxy.                            - Make calls on
>>>>>>>>>> it.                    Ideally hang on to this proxy
>>>>>>>>>> instance, so you can skip the discovery and lookup next
>>>>>>>>>> time you need it.                            - If the
>>>>>>>>>> call fails, repeat the lookup (and possibly discovery)
>>>>>>>>>> til you get a proxy that works.
>>>>>>>>>> 
>>>>>>>>>> Nowhere does the client need to know whether the service
>>>>>>>>>> instance is started up using the “com.sun.jini.start”
>>>>>>>>>> mechanism, your Commission interface, some other IOC
>>>>>>>>>> container (Rio, Harvester, Seven or RiverContainer) or
>>>>>>>>>> some unknown mechanism that starts with a static main()
>>>>>>>>>> method.
>>>>>>>>>> 
>>>>>>>>>> JSK2.0 was 2.0 because of the introduction of the proxy
>>>>>>>>>> verification mechanisms, as well as JERI.               
>>>>>>>>>>     Absent some new client usage mechanism, River doesn’t
>>>>>>>>>> need to go to 3.0.
>>>>>>>>>> 
>>>>>>>>>> Cheers,
>>>>>>>>>> 
>>>>>>>>>> Greg.
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> On Dec 17, 2013, at 1:58 PM, Peter <j...@zeus.net.au>
>>>>>>>>>> wrote:
>>>>>>>>>> 
>>>>>>>>>>> I think changing services to use safe construction
>>>>>>>>>>> techniques is enough to cause the version jump.
>>>>>>>>>>> 
>>>>>>>>>>> At this point I've allowed services to continue unsafe
>>>>>>>>>>> construction practices, while logging a SEVERE warning
>>>>>>>>>>> when the Commission interface isn't implemented, rather
>>>>>>>>>>> than fail.
>>>>>>>>>>> 
>>>>>>>>>>> This is a fundamental change to the way services are
>>>>>>>>>>> written.
>>>>>>>>>>> 
>>>>>>>>>>> Regards,
>>>>>>>>>>> 
>>>>>>>>>>> Peter.
>>>>>>>>>>> 
>>>>>>>>>>> ----- Original message -----
>>>>>>>>>>>> 
>>>>>>>>>>>> Assuming that there aren’t major incompatibilities, I
>>>>>>>>>>>> think that would be a “minor” version change
>>>>>>>>>>>> according to our versioning policy, so we’d be
>>>>>>>>>>>> looking at the “2.3” branch rather than a “3.0”
>>>>>>>>>>>> release.
>>>>>>>>>>>> 
>>>>>>>>>>>> I’m still unnerved by the massive amounts of changes
>>>>>>>>>>>> to both code and tests in the qa_refactor branch, as
>>>>>>>>>>>> well as the apparent instability of the code,
>>>>>>>>>>>> although that seems to be improving.                
>>>>>>>>>>>>                     In the next few weeks I’m going
>>>>>>>>>>>> to try and setup a cross-test case, to see what the
>>>>>>>>>>>> “2.2” tests say about the potential “2.3” release
>>>>>>>>>>>> and vice-versa.
>>>>>>>>>>>> 
>>>>>>>>>>>> I think what I’d really like to see is an incremental
>>>>>>>>>>>> approach where we update limited components of the
>>>>>>>>>>>> “2.2” branch, one at a time. Is there anything that
>>>>>>>>>>>> we could pull out piecemeal? Maybe it
>>>>>>>>> would
>>>>>>>>>>>> make sense to split out the infrastructure services,
>>>>>>>>>>>> like Reggie, Mahalo, and Outrigger into different
>>>>>>>>>>>> sub-projects that could be updated separately?
>>>>>>>>>>>> 
>>>>>>>>>>>> Any thoughts?
>>>>>>>>>>>> 
>>>>>>>>>>>> Greg.
>>>>>>>>>>>> 
>>>>>>>>>>>> On Dec 17, 2013, at 5:03 AM, Peter <j...@zeus.net.au>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>>> When the qa_refactor branch stabilises, I plan to
>>>>>>>>>>>>> merge trunk and provide a beta release for client
>>>>>>>>>>>>> compatibility testing.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Changes made have been focused on making our code
>>>>>>>>>>>>> thread safe, there are significant changes
>>>>>>>>>>>>> internally, the public api remains focused on
>>>>>>>>>>>>> backward compatibility, however it is advisable
>>>>>>>>>>>>> that client services adopt new safe construction
>>>>>>>>>>>>> techniques for services and implement the new
>>>>>>>>>>>>> Commission interface.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> What's a suitable test period for client testing?
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Peter.
> 

Reply via email to