So based on this, we should document safe methods for exporting services, log a message using fine and reference the documentation in the message.
Peter. ----- Original message ----- > 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. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >