Fixing out of memory errors during CSV data import


I have tried to import one CSV data file about 1GB into a VoltDB cluster with 2 nodes both having 16GB RAM and got out of memory errors.

After examining the details of CSV import process, I found that when the CSV data is not very clear (such as many duplicate records) and may cause many failures (such as CONSTRAINT VIOLATION). The failed queue used to hold individual rows for insertion will be soon fully filled too many requests that consume too much memory on the machine. 

This PR is intended to fix this problem. I also noticed that invalid rows are kept in memory until data insertion is done and then are flushed in to a file on disk. It also consumes too much memory space when there are too many invalid rows. So this PR makes modification on that behavior to progressively flush invalid rows into file.

handleError() can be called from client callback, which runs on the network thread. Doing file IO on the same thread could block network message processing.

You can change m_errorInfo to a LinkedBlockingQueue with a bounded size, and offer the error in handleError, have another dedicated thread to write the errors to disk.