Henry,
Hi!
I made some (imho) improvements to the OID implementation, if someone with write access would find time to review/commit the attached package, I'd be grateful.
The commit message:
- Use the UNIX epoch instead of Smalltalk epoch for timestamp part, store BE so it's pseudo-sortable by time (also, you can use getTimestamp() in mongo shell and get a sensible value)
Agreed with unix epoch. The old value was in BE also which seems to be the right choice.
- Use a per-session ID instead of localhost name for machine identification. localhost name is far from unique on some platforms (always 'localhost' on Macs), better with a unique ID per image session.
I do not agree. "NetNameResolver localHostName" does not return localhost for me. And I'd rather think the NetNameResolver does not work properly on Macs (not returning gethostname) instead of taking it as a reason to tweak client code.
Hmm, yes, it seems localHostName could be implemented better in a way that works on all platforms.
Instead of using the dedicated primitives (primHostNameSize/primHostNameResult:), it tries to lookup the localHostAddress using DNS...
On OSX, primLocalAddress was changed to always return the loopback address so one avoids ambiguities with multiple interfaces, thus, 'localhost'.
I've commit a fixed version to the Pharo 4.0 inbox.
I still don't really see the value in using it over a random number that changes when the image goes through a restart cycle, as you can't really do anything useful with it anyways, and the docs do not enforce any specific way of obtaining it.
The id per Session wouldn't have any value because there is also a process id which gives you more or less the same thing.
Just to be clear; when I said session, I meant image session, not db-connection session.
My thinking was that, when you can't actually use it to distingush clients anyways, a somewhat-guaranteed-to-be-unique machine id per image would be a better choice than guaranteed-to-be-identical for all users on Macs.
- Counter initialized with a random value.
Good idea.
A bit more effort to do this if we stick to localHostName, as I piggybacked on the unused random bits in the UUID used to replace machineIdentifier for that, the other ways of getting random numbers in a cross-platform manner is rather hit-and-miss, both wrt quality and performance.
As an added bonus, [OID new] bench should see a ~10% increase in performance.
Even better. :)
What do you think?
I can make you a commiter on the MongoTalk repo. What's your username?
henriksp is my user name.
I tinkered some more, at the cost of readability, additional optimizations (by removing temporary object creations), can result in an order of magnitude more executions during a simple #bench test.
Whether one actually needs to create 200k UIDs/second instead of 20k is another question, but in my experience, DB-interfaces can never be *too* low overhead...