An Attempt at a More Useful UUID

December 9th, 2010

Ringmaster

Late yesterday I was talking with my manager about the use of the endpoint-based UUID in the communication with the Broker. In the original implementation, we used a random 128-bit UUID with the system call:

  #include <uuid/uuid.h>
 
  void UUID::fill()
  {
    uuid_generate(uint8_t *)mBlocks);
  }

to populate the ivar data that was very simply:

  private:
    uint64_t      mBlocks[2];

and it worked fine, but the point was raised: Can't we make this more useful? and so we thought about packing the TCP socket endpoint data (address and port) as well as a sequence number into the same 128-bits. The data would look something like this where the MSB byte is byte 0 and the LSB is byte 15:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Local Addr Port Remote Addr Port Counter

The code for generating this is a little tricky, as it needs to be populated most naturally in network byte order, but the machine needs it eventually in host byte order. So I came up with the idea of creating hton() and ntoh() for the uint128_t values. All was working as we had planned. The endpoints were being properly encoded into the UUID and the counter attempted to keep them unique.

But there was a nasty truth about the ephemeral ports used - they would be pooled and re-used by the application if it restarted. Likewise, the "sequence numbers" would too. Unfortunately, this made it possible to run the application several times in succession and get the exact same UUIDs based on the endpoints. Not good. Not horrible, but the big point was to make it easy in the logs to see who was connecting to whom and all. For that, it was a failure.

Add to that, the fact that with the random UUID we could create the UUID before the socket connection was established. With the endpoint-based solution, we had to wait until after. This made the code a lot more complex, and I'm not a big fan of complexity.

So we decided that it was probably better to forego the endpoint-based UUIDs and just stick with the random ones. It's not ideal, but it's actually better than the possible disinformation that the endpoint-based UUIDs might have brought.

Finally Got the ZeroMQ Patch in for Recovery Interval in Milliseconds

December 9th, 2010

ZeroMQ

Yesterday, Martin has looking at the patch I submitted for the Recovery Interval in Milliseconds feature, and he was talking with the OpenPGM guru of the project - Steven, about the correct default setting on the ZMQ_RECOVERY_IVL_MSEC value. Should it be 0 (as I had it), or should it be -1?

Honestly, I don't care, and when Martin came back with the answer of "make it -1", I went into the code... again... and got the master branch and applied the changes I had, and then updated the options to allow for an int32_t as opposed to an uint32_t. Then I changed the default from 0 to -1 in the options class constructor. Done.

I then built it, verified it. Then repackaged the changes into a new tarball for building the RPMs, and built them. Installed them, and then build the jzmq Java client libraries and deployed them on my boxes.

It's not hard, but there's a lot of little things to do. Someday I may actually automate this.

What a Motley Crew

December 9th, 2010

I got this picture from my little sister (the one in red) this morning. The photo was from my oldest sister (in the back) but the email was from Little Red. I'm the one int he middle. Pretty amazing to see how time flies.

The Beaty Clan

I honestly have no idea when this picture was taken, but knowing the hairstyles, I'm guessing I'm 8 or 9 years old here. Funny. I wonder why I seem to be the happiest?

Polishing Ticker Plant

December 8th, 2010

Today I spent most of my time polishing the Ticker Plant - specifically, adding support scripts for the operations folks, and putting in the initial cut of the IRC client in the ticker plant so that I'd have a framework of how to extend the capabilities of the IRC interface as I needed a more capable interface to the application. Currently, you can set and inquire about the logging level, get help, and that's about it. But as I start to talk to the support folks, and they express what it is they need to be able to see and do, I'll be expanding this to accommodate their needs.

Also, I talked to the guy re-writing the Broker and he's decided that the channel ID being composed of socket-level details is a nice idea, but we can really loose uniqueness of channel ID in a lot of cases. That's not good, so I need to look at reverting that in the morning.

Lots to do and keep busy.

Crankshaft for V8 in Google Chrome

December 8th, 2010

V8 Javascript Engine

I have to admit, Google Chrome is a fantastic browser. It has been really good since the 4.x series, but it wasn't horrible in the 1.x series, which is where I started using it for Javascript-heavy AJAX web systems I was working on. I've seen it get better and better, and while at any one time it might not have been the fastest or cleanest, I can say that the engineers at Google have gone at this with a passion. They have consistently made this better, faster than virtually anything else out there.

It simply passed up Firefox without so much as a word. It's close to Safari, but Safari's integration with the OS is better and the focus on rendering is greater. But it's close.

Yesterday, Google announced that the engineers had once again made significant enhancements to the V8 JavaScript engine that is the engine for Chrome. Amazing stuff... a continuously monitoring optimizer to see what sections of code are getting hit a lot and then to re-optimize them to make them faster. The longer a big page is in the browser, the faster it will get. Amazing.

I'm tempted to get back into AJAX development. It was a blast.

They say I should see it in the Mac versions of Chrome dev soon. Very interesting.

Fantastic New Slider on github

December 7th, 2010

I saw a tweet today from the guys at github and they have created a fantastic bit of JavaScript that "slides" the contents of folders right and left as opposed to fetching a new page on each "drill down" into a folder. It's amazingly neat in that they also made the browser's "back button" work. Pretty amazing stuff.

Patching ZeroMQ – Pretty Neat (cont.)

December 7th, 2010

ZeroMQ

This morning I finished patching ZeroMQ for the Recovery Interval in Milliseconds option that I was looking to have in order to control the memory usage. I was able to build the code into the shared library, and then by carefully placing it in the project's lib directory, I was able to get the loader to pick it up as opposed to the RPM-installed older version. With this, I was able to verify that the option worked and the savings in memory was, once again, quite substantial. Most excellent!

I then followed the submission guidelines and sent a nice patch to the mailing list. One thing I noted was the Signed-Off-By tag and it's usage in the project. I can see why they have it in git - being generated from the kernel group, but also for a project like this. I really like this kind of stuff - to have the SCM tool understand the needs of it's users and anticipate them.

After I got the one patch submitted, I got a message on IRC from Martin saying I needed to subscribe to the mailing list. Oddly enough, I mentioned to him, that I was subscribed. He then asked me what email? I responded with my general incoming drop box, and then he pointed out that the email was coming from my Comcast account. Ah! Got it.

Rather than use my Comcast account for anything more, I decided to subscribe on my GMail account as it's not going to change, and then send in emails to the list on that same account. It's far easier to use that and then not worry about it than to worry about Comcast going away because of some better ISP in Naperville. I spent a little time trying to get outgoing email at EasyDNS, my DNS service, but that turned out to be a bit dodgey, and realized it's probably better to just stick with GMail and let that be it.

OK... one patch down, one to go - the Java client needs to have the same capabilities to set the Recovery Interval in Milliseconds, and while it used JNI to get to the C library under the covers, it needed to have a few things added to make it really work. Not nearly as difficult as the C library, but still, I followed the same guidelines and submitted a patch for that - now on my GMail address.

I saw a few minutes later that my patch was in the mailing list digest, which confirms that I got everything right with the GMail switch-over... nice. We're running with the changes on our boxes, but if they happen to make changes in the near future we'll just have to deal with it as that's the cost of being a submitter.

Neat stuff. Fun.

[3:30pm] UPDATE: I have to say... just when you think you have it all under control, life pops up and shows you you aren't as put-together as you think. Case in point: today I thought I had a good set of patches to ZeroMQ and it's Java client, but then I tried to receive the data and it was all a mess. I then had to send something to the mailing list that said "I'm a dufus", and then back out all the changes and verify that my code worked.

It didn't, and so I spent a good 30 mins finding out why not - only to see that one of the options on ZMQ was really not all that well documented - the Ignore Loopback option. They didn't mean the loopback interface, they meant any other client on the same box. So I had to drop that option and then things started working.

Well, at that point, it made sense to try and see if I could get the fixes in ZMQ back in and working. It didn't take long, and sure enough, it's working. So I sent in another patch with a few additional changes, and that should be good to go.

Nothing like being shown to be a dufus in front of people you'd like to impress. Yeah... class act all the way.

Cyberduck 3.8.1 is Out

December 7th, 2010

This morning I saw that Cyberduck 3.8.1 is out, and while I had gotten 3.8, I hadn't written about it because I hadn't really even fired it up. I have to say that while I didn't mind the nagware screen asking for you to register the product, the little tag on the title bar is a new level of intrusive.

Cyberduck 3.8.1

OK... I'm not a registered user, but then again, I'm a Transmit user and pay for all it's updates, etc. Cyberduck is an emergency back-up when Transmit might not get the job done. But to be fair, for those that don't want to pay for an FTP client, and I know a lot of people in that boat, this is a great tool. It's fast and capable, and the nagging is the equivalent of in-app adds on the iPhone. Something I hate, and will pay to see removed, but something that is just fine with a lot of folks.

Google Chrome dev 9.0.597.10 is Out

December 7th, 2010

This morning I noticed that Google Chrome dev 9.0.597.10 was out, and the release notes indicate that it's just stability fixes and a few UI tweaks. Fair enough... not every release can be amazing, and it's getting into it's final form. There hasn't been a big change in the UI in quite a while, and the improvements in the V8 engine or other infrastructure components are going to be constantly ongoing.

Still... it's nice to see progress.

Patching ZeroMQ – Pretty Neat

December 6th, 2010

ZeroMQ

This morning I was chatting with Martin S. on the ZeroMQ IRC channel and there was a suggestion of how to handle the "socket recovery interval in msec" option in the code. He pointed out that I'd need to change the ZeroMQ code, and why didn't I do that and then send the patch to the mailing list and he'd incorporate it.

Sweet! A request for a (simple) patch to the codebase by the primary maintainer. I like this stuff. It's not hard, but there are a few wrinkles, and the coding standards are at least in existance, which is a huge help to the project. I just need to get a few things figured out, write the code, compile it all up, and then make the diff for the mailing list.

I'm sure there's going to be a lot of little details I learn as I do this, but it's nice to get a chance to contribute to another nice open source project.

UPDATE: I've pretty much got it all done, but the hint I received from the guy that really knows OpenPGM in the group is a little sketchy. He gave me an equation which includes the size of the transport package:

Easy workaround is to calculate the buffer size in sequence numbers in 0MQ and pass that onto OpenPGM. Then you can export socket options for 0MQ to set the buffer size in seconds, milliseconds, etc.

int sqns = (secs * max_rte) / tpdu_size;
pgm_setsockopt (sock, IPPROTO_PGM, PGM_TXW_SQNS, &sqns, sizeof (sqns));

I think I found what should go in that spot, but I wasn't 100% sure. So I replied to the guy on the mailing list and now I'm waiting for confirmation/correction from him. It shouldn't take too much longer to finish this up, and then I'll have a way to set the ZMQ_RECOVERY_IVL_MSEC - which, with a non-zero value, will override the ZMQ_RECOVERY_IVL value and use the value in milliseconds. Should be pretty easy to finish.