I think GBeanMBean is a much better name. I keep seeing GMBean as GBean when reading this code. If there are no objection, I going to make this change so we, well I, can remain sane.

-dain

/*************************
 * Dain Sundstrom
 * Partner
 * Core Developers Network
 *************************/

On Jan 14, 2004, at 9:23 AM, David Jencks wrote:

The naming conventions for standard mbean require, for a class Foo, an interface named FooMBean describing Foo's management interface. This hack is not needed for dynamic mbeans such as GMBean and might confuse people into thinking GBeanMBean is a standard mbean interface for GBean which it certainly is not. I think a glossary entry or a little more documentation would be more useful than this proposed name change.

thanks
david jencks

On Wednesday, January 14, 2004, at 03:26 AM, n. alex rupp wrote:

Hey guys,

I thought I might point out that by convention, the "MBean" suffix gets tacked
on to whatever the normal class is called. Renaming GMBean to GBeanMBean might
reduce some of the confusion in regards to the relationship between GBean and
GMBean. I know it's a bit verbose, but that's middleware for ya.


Try it out.  If you like it, sweet.  If not . . . (shrugs)

Cheers,
--
N. Alex Rupp ([EMAIL PROTECTED])






----- Original Message ----- From: "Ed Letifov" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Tuesday, January 13, 2004 1:27 PM Subject: Re: GMBeanEndPoint - ConcurrentModification


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