Ah! I forgot about that (trying to do too many things at once). I'll file a ticket to fix it up. Thanks!
On Wed, Jan 16, 2019 at 3:47 PM Bruce Schuchardt <bschucha...@pivotal.io> wrote: > Hmm, okay but I was looking at this code in MBeanJMXAdapter: > > public static String getMemberNameOrId(DistributedMember member) { > if (member.getName() !=null && !member.getName().equals("")) { > return makeCompliantName(member.getName()); > } > return makeCompliantName(member.getId()); > } > > So if there isn't a name set in the distribution configuration it will > use the toString of the member ID. I think that's what's happening to > you. The getName() method in InternalDistributedMember doesn't return a > string like you've described. It returns whatever was configured as the > "name" in the distribution configuration properties. > > On 1/16/19 1:27 PM, Kirk Lund wrote: > > It's not using toString(). It's just using DistributedMember.getName(). > > This is implemented by InternalDistributedMember.getName() which > delegates > > to NetMember.getName(). Are you saying we should add a new method to > > DistributedMember instead of using getName()? > > > > The mbeans are categorized a type of Member or Distributed. Member means > > the mbean represents something about a member, while the other type means > > that the mbean represents something about the DistributedSystem/Cluster > > (aggregating all Members together in some way). When the type is Member, > > the ObjectName contains: > > > > "type=Member,member={0}" > > > > MBeanJMXAdapter creates the ObjectNames by filling in that parameter with > > DistributedMember.getName(). We originally documented that the > ObjectNames > > would contain the DistributedMember.getName(), but we could change that > by > > adding a new getMBeanName() method or something like that. I think we > > originally thought it would be nice for the User if they could simply > refer > > to DistributedMember.getName() as being the same value as we use in the > JMX > > ObjectName. > > > > On Tue, Jan 15, 2019 at 11:28 AM Bruce Schuchardt < > bschucha...@pivotal.io> > > wrote: > > > >> Yeah, let's fix this, but let's not require the toString() of an object > >> to never change. Let's add another method that returns a Bean > >> identifier and is documented to never change. > >> > >> On 1/15/19 9:45 AM, Kirk Lund wrote: > >>> Sorry about the confusion. I meant that the change of membership port > >>> results in DistributedMember returning a different string from its > >>> getName() method. > >>> > >>> We discovered this because the JMX layer has some error handling that > >>> results in suppressing this failure, so the failure was being hidden. > We > >>> cleaned up the error handling and saw quite a few failures in > precheckin > >>> caused by this. I figured it was more correct to fix the underlying > >> problem > >>> rather than restore the suppression of this bug. > >>> > >>> On Tue, Jan 15, 2019 at 7:47 AM Bruce Schuchardt < > bschucha...@pivotal.io > >>> > >>> wrote: > >>> > >>>> Actually the formatting code would go in InternalDistributedMember. > The > >>>> JMX code already has a special method for handling that class. I was > >>>> thrown off by the reference to a non-existant getName() method in > >>>> LonerDistributionManager. > >>>> > >>>> On 1/15/19 7:34 AM, Bruce Schuchardt wrote: > >>>>> I think we could solve this by either moving the ID formatting code > to > >>>>> the DistributionManager implementations & having > >>>>> LonerDistributionManager omit the port number or modify the > >>>>> client/server handshake to not install a port number when connecting > >>>>> to a remote GatewayReceiver. I guess the latter wouldn't work if the > >>>>> bean is in a real client cache. > >>>>> > >>>>> The installation of a port number was implemented to prevent > duplicate > >>>>> membership IDs in client caches when clients are being spun up in > >>>>> parallel on the same machine. However there is also a "unique ID" in > >>>>> LonerDistributionManager that was supposed to address this problem > but > >>>>> apparently didn't. > >>>>> > >>>>> On 1/14/19 4:45 PM, Kirk Lund wrote: > >>>>>> So I was stepping through some WAN tests in IJ debugger (on develop > >>>>>> with no > >>>>>> changes) and discovered that any MXBeans that are created before > >>>>>> starting a > >>>>>> server port (either using CacheServer or GatewayReceiver) are broken > >> and > >>>>>> fail to be updated after that -- the ObjectNames include the > >>>>>> DistributedMember.getName(). Turns out some JMX code is eating an > NPE > >>>>>> that's caused because the LonerDistributionManager changes its > >>>>>> membership > >>>>>> port when an acceptor endpoint is started up. > >>>>>> > >>>>>> Below is the method in LonerDistributionManager (with some other > >>>>>> issues as > >>>>>> well) that does this updating. We either need to make a lot of > >>>>>> changes to > >>>>>> the JMX code to fix this or we need to make one small change to > >>>>>> LonerDistributionManager (ie, to delete this method). Question: do > we > >>>>>> really need the DistributedMember of a Loner to change its getName() > >>>>>> which > >>>>>> includes the membership port that changed? > >>>>>> > >>>>>> /** > >>>>>> * update the loner port with an integer that may be more > unique > >>>>>> than the > >>>>>> default port (zero). > >>>>>> * This updates the ID in place and establishes new default > >>>>>> settings for > >>>>>> the manufacture of new > >>>>>> * IDs. > >>>>>> * > >>>>>> * @param newPort the new port to use > >>>>>> */ > >>>>>> public void updateLonerPort(int newPort) { > >>>>>> this.logger.config( > >>>>>> String.format("Updating membership port. Port changed > from > >>>>>> %s to > >>>>>> %s. ID is now %s", > >>>>>> new Object[] {this.lonerPort, newPort, getId()})); > >>>>>> this.lonerPort = newPort; > >>>>>> *this.getId().setPort(this.lonerPort);* > >>>>>> } > >>>>>> >