When checking whether clean pages can be evicted from cache, ignore updates that are only pinned by the checkpoint transaction.
Have checkpoint skip over leaf pages that were clean at the beginning of the checkpoint but dirtied later.
Maintain a checkpoint generation in each modified page, so that application threads can evict dirty pages "ahead" of a checkpoint.
Deal with internal checkpoints, where the global generation is not incremented.
Turn on eviction of dirty pages during eviction (previously it was permitted in __rec_review, but the LRU loop would never schedule those pages for eviction).  Fix the race with using the checkpoint's session for visibility: track the smallest transaction ID skipped during reconciliation.
Fix a comment.
Merge branch 'develop' into checkpoint-optimizations
Merge branch 'develop' into checkpoint-optimizations
cleanup
Have checkpoint skip pages that were clean at the start of the checkpoint and dirtied later.
Merge branch 'develop' into checkpoint-optimizations
Add the start of a test that verifies checkpoints.
Implement more of checkpoint test program.
Split the tuning page sections into individual pages, add a perf-tuning
section to the "Writing WiredTiger applications" page.
Checkpointer test getting closer.

This test is designed to transactionally update multiple tables with
identical values. While in parallel executing checkpoints and verifying
that all tables in a checkpoint have identical content.

Supports row, column and LSM table types. Can either select multiple
of the same table type, or a mixture of table types.
Add better error handling to checkpoint test.

This should allow us to inspect databases on test failure.
Make it explicit that LSM cursors cannot read from checkpoints, at least until we make that work properly.

The main problem is that we don't have a copy of the LSM tree structure for each checkpoint, and as new chunks are added to the tree, ordinary cursors update and see more recent changes.  A secondary problem is ensuring that checkpoints correspond exactly to LSM chunk boundaries.  That way, a given chunk is either in or out of a checkpoint.
Fix some paths where EBUSY could make it out of the LSM checkpoint worker loop.
Update checkpoint tester:

* Use a string for value not a raw.
* Change the value each time the same key is updated.
* Dump key/values when logging is enabled.
Checkpoint tester updates based on review feedback.

* Use snapshot isolation in worker thread(s)
* Don't open LSM cursors on a checkpoint
* Fix code that does multiple runs in a single test
* Use the WiredTiger rand implementation, rather than our own.
* Handle deadlocks.