In truth, I'm not super-worried about stale iterators, and I'd 
rather not introduce the complexity of depending on a complex external 
package.  But I'm not terribly familiar with the concurrency package, so I 
figured I'd let someone else answer.  :)

Aaron

On Wed, 14 Jan 2004, Ed Letifov wrote:
> I am sorry guys, was my question too stupid, too late or too off?
> 
> On Tuesday, Jan 13, 2004, at 20:27 Europe/Amsterdam, Ed Letifov wrote:
> 
> > Hello,
> >  since copy on update will not really solve issue of having "stale" 
> > iterators around I have a sideline question:
> >  can we consider usage of ConcurrentHashMap or ConcurrentReaderHashMap 
> > from EDU.oswego.cs.dl.util.concurrent package for this?
> >  As I understand this code is in public domain and can be used, will 
> > provide a substantial concurrency level and the iterators will reflect 
> > the current state of the collection as much as possible.
> >
> > Ed Letifov.
> >
> > On Monday, Jan 12, 2004, at 19:57 Europe/Amsterdam, Aaron Mulder wrote:
> >
> >>    We may also want to consider that instead of copying the
> >> Collection at iteration time, we could copy it only at update time, 
> >> and
> >> then write the new (changed) version over the old (iterated) version,
> >> leaving the only references to the old collection with the iterators.
> >> I'm assuming that we'll have more iterating than updating, and if so, 
> >> this
> >> ought to result in less copying.
> >>
> >> Aaron
> >>
> >> On Mon, 12 Jan 2004, Dain Sundstrom wrote:
> >>> On Jan 12, 2004, at 8:14 AM, gianny DAMOUR wrote:
> >>>
> >>>> Hi,
> >>>>
> >>>> I have just checked the new GBean implementation and I do have the
> >>>> feeling that there are - potentially - some concurrency issues with
> >>>> the CollectionProxy:
> >>>
> >>> I bet there are.  It was the last one coded and in a rush so we could
> >>> get the code checked in.  I plan on reviewing all the code again over
> >>> the next few days, and writing some documentation as I go.
> >>>
> >>>> If I understand correctly, this proxy implements its own Collection 
> >>>> in
> >>>> order to solve some previous lifecycle limitations. This Collection
> >>>> returns an Iterator directly backed by an Iterator directly backed 
> >>>> by
> >>>> the values of the endpoint name to proxy Map of CollectionProxy.
> >>>>
> >>>> Unfortunately, it means that a service can not iterate safely over
> >>>> such an Iterator without risking a ConcurrentModificationException
> >>>> under some specific race conditions.
> >>>
> >>> We had that problem in the previous code also.  I'm not sure how we
> >>> want to handle this.
> >>>
> >>>> For instance, DeploymentController could iterate over its Collection
> >>>> of DeploymentPlanner and, at the same time, a DeploymentPlanner 
> >>>> could
> >>>> be unregistered, which should cause a 
> >>>> ConcurrentModificationException.
> >>>>
> >>>> One could return an Iterator backed by a copy of the actual Map.
> >>>> However, this implementation does not work:
> >>>
> >>> I have been thinking of that, or we could change the code to
> >>> synchronized on the client collection whenever making a change to the
> >>> backing collection, then the client could guarantee a safe iterator 
> >>> by
> >>> synchronizing on the collection.  The problem with the copy
> >>> implementation is we could have very old iterators sitting around, 
> >>> and
> >>> the problem with synchronization is poorly written code locking up 
> >>> the
> >>> GMBean for a long time.  I'm leaning towards the copy code.
> >>>
> >>>> Indeed, this Iterator could returned a disconnected
> >>>> ProxyMethodInterceptor if at the same time an endpoint is
> >>>> unregistered. One could use the GeronimoMBeanEndpointListener 
> >>>> feature
> >>>> in order to detect such a case.
> >>>>
> >>>> However, as endpoints are inter-connected by listening to JMX
> >>>> notifications, it is also possible to have a connected
> >>>> ProxyMethodInterceptor, which reflects a JMX invocation against an
> >>>> already unregistered MBean.
> >>>>
> >>>> Hence, I would like to know if the following could fix the previous
> >>>> issues - if there are indeed some concurrency issues:
> >>>>
> >>>> I propose to add a Mediator, whose responsibility is to track
> >>>> synchronously (no notifications involved) the availability of
> >>>> components and contact synchronously the interested components when 
> >>>> a
> >>>> GBean switch from the offline to the online state and conversaly.
> >>>>
> >>>> Could anyone confirm or disprove my concern and approach?
> >>>
> >>> I don't like this approach.  I think we will end up with way too much
> >>> synchronization in the container.  I'm also not sure it is 
> >>> possible....
> >>> This is a highly threaded system, which means that several components
> >>> could want to change state simultaneously, and if we make the system
> >>> state changes synchronous, we are bound to get a system wide 
> >>> deadlock.
> >>> Also the notification happens after the component fails or stops, so
> >>> even if we hold up the notification to get a clean system wide state
> >>> change, the component is already unavailable (just not reflected in 
> >>> the
> >>> system state).
> >>>
> >>> Besides the implementation difficulty, I don't think we want this.  I
> >>> see the current implementation as a "good enough" design.  Components
> >>> do die at the wrong time, and all you can do is respond.  This is 
> >>> how I
> >>> define a "good enough" design, "It does not solve all the problems, 
> >>> but
> >>> it is good enough to work reliably."  If you really needed to work 
> >>> with
> >>> a component, you catch the unavailable exception and fail, which is
> >>> exactly how single valued components work. If you don't really need 
> >>> to
> >>> work with a specific component, you just catch the exception and move
> >>> on.  Of course this means that people writing gbeans need to know 
> >>> what
> >>> they are doing, but I see that as the price of creating reliable
> >>> production ready services.
> >>>
> >>> -dain
> >>>
> >>
> >
> 

Reply via email to