This weekend, I paid a very enjoyable visit to a friends site, and tried to get the LS2CAPI test harness working on an iSeries. This harness takes the pain out of making direct C-API calls from LotusScript using the 'declare function' keyword. Well. Some good news and some bad news.
- Just as Normunds found all those years ago, its almost impossible within lotusscript to deal with a function that takes in pointers. For instance, the relatively innocous function ConvertTimeDateToText expects two pointers as arguments. And even if you set them to NULL, you still have to get the stack correctly populated. And you just cant pass in a Byte Array.
- It is possible to actually crash a Domino server instance on an iSeries by passing in badly formed argumens. This is the first time in 10 years my friend had seen the Domino instance on iSeries crash. I think this is why folks pay big bucks for the big tin - its almost 'self healing'. Every time we crashed it, it called the hotfix site looking for any relevant hotfixes it could automatically download and implement. Wow.
- I do wish Lotus would actually fix this somehow - writing a 'wrapper' script as Normunds had to is not attractive to iSeries customers. They dont like slapping on unknown and unsupported code on their boxes.
- What I had to do in the end was create a new datatype in my wrapper class - 'pointer' - and basically look for pointer operaions on iSeries - and not execute them. So folks will at least have a failure message that doesnt take their server out.
- Whats also very strange is that the iSeries appears to be running a lot of Java when it kicks off an agent - they seem to take a long time - 10-20 seconds to initialise, and every time I ran the 'Execute' statement, it seemed to load another new instance into memory. We saw CPU (on a $400,000 box) peak at over 137%, and we only saw one 'evaulate' being completed every couple of seconds. So basically code that would run on any other platform (that I've tested - thats them all bar zSeries) that would take less than 800mb took 20 seconds or so to run. I dont think this can be seen as a 'bad' thing - its just how it performs on iSeries.
- In the short term, this means that our product - FirM - cannot run on an iSeries. Which isi a bit of a blow, but since we've found a lot of iSeries customers have to run BES services on Windows, they're not unduly bothered about lack of iSeries support. Bear in mind thiat we can still perform all MANAGEMENT functions for users on iSeries - we just have to find a non-iSeries box to run our stuff on.
- I'll get an update of the LS2CAPI library out in the next few days, with these enhancements in place.
I have new found respect for the iSeries platform. Whilst I did finally manage to crash it, it did recover completely, quickly, and then tried to self-heal. This is an amazing amount of stability and resilience. I still dont know enough about iSeries to actually install Domino on it, but I have a huge amount of respect now.
Moving on, I'd love to engage wih someone from the Lous Domino iSeries team about this and see if we can get a little more information on (a) Passing pointers and (b) perormance stuff. Whilst its been a long-running issue (since at least r5), I would love to see this nailed. After all, there's tons of Notes C-API stuff out there that we dont have exposed in LotusScript (Writing replica ID's as notes/date time fields, password recovery, password refresh, and so on).