HOME | WEBCAM | CONTACT
 

iManage Records Manager Data Loader

December 30, 2009 by Dave Kane

The iManage Records Manager Data Loader is a tool that we use extensively in converting legacy records systems to iRM. There are some great features about the tool and some short comings we learn about with every conversion. The biggest issue with Data Loader is that it’s slow. You feed it an XML file to process and the application does a lot of validation before and during the processing of that file. It is very SQL intensive.

We are currently working with iRM 5.2, and I know in later versions they’ve increased the OS compatibility. With this version, we are limited to Windows Server 2003 (32-bit) and Microsoft SQL Server 2005. We are constrained by 4 Mb of RAM and a single threaded process. We’ve been able to increase performance by stripping down and dedicating one of our VM Host servers for the conversion, working with the data in-house and delivering a completed database back to the client.

Until Autonomy improves the tool, the only solution to increase performance is to throw bigger hardware at it. The faster the processors and the faster the disks you have on the server, the better you’ll do. We’ve been able to run two instances of the Data Loader on one server, and that helps. But, if you try and run three you run into that database locking issue and nothing really runs.

ADV 15th Anniversary

December 29, 2009 by Jerry Dolezal

It hardly seems possible, but as of this November ADV has been in business for fifteen very fast-paced years.  Time has flown so fast that it is easy to forget how much things have changed.  For instance, the news from November 1994 (from Wikipedia) included the following items. 

  • November 4 – San Francisco: The first conference devoted entirely to the subject of the commercial potential of the World Wide Web opens. Featured speakers include Marc Andreessen of Netscape, Mark Graham of Pandora Systems, and Ken McCarthy of E-Media.
  • November 5 – A letter by former U.S. President Ronald Reagan, announcing that he has Alzheimer’s disease, is released.
  • November 5 – George Foreman wins the WBA and IBF World Heavyweight Championships by KO’ing Michael Moorer, becoming the oldest heavyweight champion in history.
  • November 5 – Johan Heyns, an influential Afrikaner theologian and critic of apartheid, is assassinated.
  • November 7 – WXYC, the student radio station of the University Of North Carolina At Chapel Hill, provides the world’s first internet radio broadcast.
  • November 8 – Georgia Representative Newt Gingrich leads the United States Republican Party in taking control of both the House of Representatives and the Senate in midterm congressional elections, the first time in 40 years the Republicans secure control of both houses of Congress. George W. Bush is elected Governor of Texas.
  • November 13 – Voters in Sweden decide to join the European Union in a referendum.
  • November 13 – The first passengers travel through the Channel Tunnel.
  • November 13 – Michael Schumacher wins his first Formula One World Championship.
  • November 16 – A Federal judge issues a temporary restraining order, prohibiting the State of California from implementing Proposition 187, that would have denied most public services to illegal aliens.
  • November 20 – The Angolan government and UNITA rebels sign the Lusaka Protocol.
  • November 28 – Voters in Norway decide not to join the European Union in a referendum.

This look back at the news shows just how dramatically the world has changed.  But because we are living it day to day, change seems to evolve slowly.   While skills and technology at ADV have evolved as well, the the one surviving constant is a focus on you, our client partners.  Your issues, your challenges and your opportunities have kept us  young, engaged and up-to-date.  So, this anniversary is a celebration for us but also a chance to thank our customers – both old friends and new acquaintences – for helping us survive and grow.  Thanks from all of us at ADV!

eDocs 5.2.1 CU3 Performance Issue

December 18, 2009 by Dave Kane

After upgrading a couple of clients to the latest version of eDocs 5.2.1 CU3, we had some performance issues reported when trying to profile a new document or update the profile of an existing document. It would take 10-20 seconds to be able to tab from validation field to validation field. The CPU usage for the DM.exe process would spike and the amount of memory would also jump with each press of the tab key. The workstation would appear to lock up for that time.

 There appears to be an issue in the new Save User Interface. Open Text is working on a hotfix for the issue and I’ve gotten an advance release I’m testing with two of our clients. The hotfix appears to have resolved the issue and we are currently waiting for OT to make the official release.

Meet Me In St. Louis!

by Jerry Dolezal

(originally written: 9/1/09)

I pulled rank and assigned myself the fun duty of exhibiting at this year’s Region 3 ALA (Association of Legal Administrators) show in St. Louis!!

There are over 10,000 worldwide members of this organization, including professionals from law firms, corporate legal departments and government legal agencies. Region 3 encompasses IL, IN, IA, KS, MI, MN, MS, ND, OH, SD, WV WI, and NB. 

In case any of you haven’t heard, the show starts on Thursday October 8th and wraps up at the end of day on Friday the 10th.  It will be held at the Chase Park Plaza Hotel in St. Louis.  If you’re going to, please stop by and say Hi!

 We’ve been a strong supporter of the Minnesota Group, MLAA, for quite a number of years now.  A core mission for MLAA is education, and I’ve certainly learned a lot through my association with this energetic group!   The importance of MLAA as a support network for the legal administrator cannot be stressed enough. The various active committees working within the organization offer resources and guidance not otherwise available to the legal administrator at the local level. The monthly meetings offer the opportunity to exchange information among the legal administrators and to hear a speaker present a topic, which assists all of us in maintaining our professionalism. Each member has experiences and attributes that are available for the asking.  You can find out more about the Minnesota group at:  http://www.mlaa-ala.org/  or the worldwide group at: http://www.alanet.org/default.aspx

Moving to New Orleans

by Bryce Ostenson

(originally written 9/23/09)

I realized today that it’s been just over 3 months since I began the transition from Minneapolis to New Orleans, that it’s went incredibly quickly, and that both ADV and I have been adapting well.  For this installment, I’m just going to reflect a little bit on some of the expected and unexpected things:

  1. As expected, the technology works really well.In the past, I’ve done plenty of occasional remote access for a day at home here or there, and of course, a lot of remote access to client systems.  But I’m still amazed by the overall performance of our DMS across a VPN, web applications, occasional remote desktop / VNC back to the office, and so forth.  But most surprising was when I just plugged in a VOIP phone to my router, tied to the same number as in Minneapolis, and it just plain worked.  Great stuff.  My product plug of the day : OpenVPN.  Specifically, OpenVPN Access Server (http://www.openvpn.net/).  It’s OpenVPN but manageable and inexpensive.  We’ve been using it for years and more than once, we’ve had new and old employees comment on how well our VPN works.One of these days, we’ll get the video conferencing online.  I’m looking forward to that!
  2. As expected, our culture was stressed by the move.ADV works a lot as a team and, while we’ve encouraged people to take advantage of remote access, we’ve had a really strong culture of collaboration at the office.  My move to New Orleans obviously creates some stresses on that culture.  My first direct experience with that was when everyone assumed our company meeting, which I usually lead, was cancelled because I was in not in Minneapolis!  On those first 2 return trips, I also found that I spent a lot of my time in Minneapolis catching up on meetings.  I suspect people were holding things for meetings when I returned.  That was a surprise but probably shouldn’t have been one.  On the last trip, I didn’t notice it as much.  It seems to be returning to business as usual now though.  Given that it’s only been 3 months and I’m just now up to 75% in New Orleans, I suspect I’ll still see a few unexpected changes.  I’m curious how adding our first employee since my move will go.Supporting a remote employee required a culture shift for us.  It’s hard enough to bring someone new into the company culture, better not to compound it by also working through the company’s cultural change in support a of a remote worker at the same time.  I think it’s been good that someone already inside ADV has been through this first.
  3. Unexpectedly, I think I’m more productive working at home.I worried that working at home would be full of distractions but so far, no.  Overall, I probably spend less time chatting and work more hours on a whole.  Oddly, when I first started, I listened to Pandora, MPR, or mp3’s a lot.  I find myself doing that less and being more comfortable with the silence.  I’m better able to focus on the work at hand and with fewer distractions.  Admission: I wouldn’t be surprised to hear that I was the biggest distraction in the office.
  4. Unexpectedly, I’m more interested in communicating.More often than I’d like to admit, I feel rather overwhelmed by my todo list.  Of course, once I actually got going on it and saw some progress, it always looked a lot more manageable.  But getting started can sometimes be daunting.  So, back at the office, I’d find myself almost dreading the phone ringing and the likelihood that it meant more work or work requiring an immediate action.  With more and larger blocks of time to be productive, the todo list is starting to seem more manageable and in turn, I’m not dreading the phone call.  Or maybe I’m just a bit lonely.  ;)

All in all, it’s off to a nice start.  One of these days, I’ll post a few things about the move south (but not to the South since New Orleans is truly its own thing) but for now, I’ll say that the single thing that’s really made this work is the wonderful people we’ve met down here.

Software That Fails Reliably

by Bryce Ostenson

Let’s face it, software fails.  Failing can mean many things but most often it means that it’s unavailable completely or in part.  That’s not the sort of failure I’m discussing here.  At ADV, we often develop processes that move data around and typically that data is of very high value (medical records, corporate records pertaining to complex legal affair, long-term historical information).  Sometimes those processes are one-off conversions and sometimes they’re ongoing processes but regardless, we start with the assumption that the software will experience a failure.  If we’ve done our job well, that failure won’t be our failure but the result of an external factor such as a database server going offline for maintenance while we’re relying on it, a network connection failing, a power loss, or something similar.  My favorite example involved a wireless network link between two buildings (predating wifi) that was scrambling packets and, somehow, the whole stack of networking and operating system software and hardware that our application relied on to be reliable was not reporting the failure to our application.  I’m oh-so-glad the client’s networking staff discovered that and didn’t blame our software.

 Of course, we aren’t perfect either and our software has errors as well.  Such is the nature of developing software, particularly under tight budget constraints.  Thankfully, as important as some of our software is, we aren’t developing air traffic control software.  I’d love to spend time studying how they guarantee reliability but I’m not sure whether I’d like writing that software!

 Before continuing, let me clarify that while stability of software is very important, reliability is often more important.  For my purposes from here on, my assumption is that reliability does not include stability.  It’s very important that even very stable software fails and recovers reliably

 My first job involved working with financial aid applications and need analysis for private, largely parochial, high schools.  The databases at the time were flat files (DBF actually) where each file represented a single table of data.  Complicating matters was that an update might require updates to two tables.  If one table was updated but the other wasn’t, the data was inconsistent.  Today, this is easily avoided with SQL and a transaction but the environment I was working in didn’t allow for a transaction across multiple targets, even though the business requirements did.  The basic approach to solving the problem was to create a persistent (on disk) list of the steps that would be required to undo the transaction if it failed while it was in progress.  If, for example, the power went out, the application would initially look for this list and perform the recorded steps such that the system could be returned to a consistent status.  This might seem pretty arcane but it’s still relevant today, even while some systems provide very strong transactional reliability.  More on that in a moment…

What I’ve been surprised by is the number of developers I’ve worked with or whose work I’ve reviewed that have just never considered what happens when the unexpected does.  I think this is in part because systems do run so well in general or that the service that’s being provided can simply be retried by the user with no harm.  When you’re updating and moving critical data though, you just can’t assume that because it worked once or even 1 million times, that it won’t fail, or that reliable supporting systems will always be reliable.  Having just completed a small project requiring reliable failure, I thought I’d document a few of the techniques we use when software must fail reliably:

 Use reliable underlying technologies that do a good job of reporting errors. 

But, when it’s really important, don’t assume they do.  You can typically sacrifice some performance by building in a verification step after updating the data.  In my earlier example application with the failing wireless radio link, I added a step to reread the destination file to make sure that the file copy was truly successful.  Yes, the application was slower, but speed wasn’t a priority for it.

Check the errors from your underlying support systems.

I’m amazed how many tools go out the door that don’t check error codes or have generalized error handlers.  Sometimes you can cheat and just check the final result of a later operation but this is rarely safe in the long-run, particularly as the application evolves.  In may seem like overkill and bloat to check and handle errors but it is a necessity if the tool is doing anything non-trivial.

Compartmentalize the updating of data to as small a procedure as possible.

This may sound obvious but often the decision logic of what to update or how to update it becomes intertwined with the programming to perform the update.  If you separate the decision logic of what to update from the act of updating, your code to perform the update will typically be much more compact.  This has all sorts of side benefits: reusability, clarity, etc.

Define your transaction and rollback steps.

A transaction is a series of steps that must succeed or fail as a unit.  If your underlying subsystem can’t handle all aspects of your transaction (e.g. update a database table on server A, update a system via a web service, and write a change directly to a file), you will need to do so yourself.  Once you’ve defined the steps your transaction will need, ask yourself what will happen if the system fails (remember the power outage problem) on any single line of code until the transaction is complete.  Document what steps are required to roll the transaction back to the beginning (an undo) or what information is required to roll the transaction forward, completing it and then create a structure to store these steps.

I personally find it easiest if the rollback steps are very, very specific and don’t require the rollback code to include decision logic (E.g. action: Delete file, Parameter: file path).

Remember that the rollback infrastructure may itself be unstable.

Whether you’re writing your rollback instruction to a database table, a file, or somewhere else persistent, remember that these too can all fail.  This creates a complex question of whether you write the rollback instruction before executing the action or after and how to handle a failed write to the rollback list.  I don’t have a single approach to this as it’s usually been obvious to me in the given situation but if you study the field, I’m sure there are best practice design patterns.

Read the rollback file on application startup.

When the application starts up, I have it read the rollback file right after it verifies it meets all other basic requirements (E.g. database connections established, access to business system API’s confirmed, etc).  If there are rollback operations, they are executed to return the system to a clean state.  If it cannot be accomplished, the system shuts down again with an obvious message indicating that the system is inconsistent and likely requires manual intervention. 

I never provide an option to force the tool to run while the data is inconsistent.  Too many system administrators will try this and make recovery dramatically more difficult.

Test!

If you can interactively run the program, kill the application on each line of code within the update logic and test how the system recovers.  If you can’t run interactively, build in some debugging code where you can trigger an application exit after each line of code.  This could be a command line parameter that tells it where to immediately exit.  Repeat. 

It’s also helpful to have someone else review and test the code if at all possible.

Finally, randomly test failure.  I’ve randomly unplugged network cables, killed processes, stopped underlying systems, deleted and changed data out of sequence while the process was running, and created all manner of data issues.  Throw everything you can at making your application fail.  This doesn’t remove the need for the deliberate approach of testing but often uncovers errors in your testing.

Once you’ve done this time consuming task, consider this code locked down.  Any change to the updates code requires another time consuming and rigorous round of testing.

Log

Create a debug log for your application.  There are many high performance logging tools and the performance impact of leaving logging on is often much less than what you might expect (don’t forget to consider the privacy and security considerations of what you log though).  If you can, leave debug logging on even while the application is in production.  If there is a failure, this often provides the best clues for recovery.

If you’re using .Net, I’ll put out a recommendation for nLog: http://www.nlog-project.org/.  When I started working with .Net, I started using nLog.  I’ve been meaning to investigate whether new .Net versions have a better logger that I should evaluate.  In the meantime, nLog is fast, reliable, and extremely flexible right out of the box.  And has friendly licensing.

No one should really be writing their own logger anymore.  There are just so many high performance, flexible logging tools out there.

Backup

This should go without saying…  But in the event that something really bad happens, a backup, a log file, and any other inputs to the system that might be necessary for a redo of the updates can take you a long, long way.

If you’re dealing with life and death (or my bank account, etc), study this a lot more closely!

Whether you’re designing pacemakers, air traffic control, or banking software, I hope you take what I’ve written with a grain of salt and study the design of reliable software a lot more closely.  A quick web search will reveal a wealth of additional academic and practical research that’s well beyond my rambling blog.

/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/