During WT-3435, the way we check for uncommitted updates during reconciliation changed.
That check was updated in WT-3406 to fix a bug that caused updates to be written into page images, if the transaction that wrote the update rolled back concurrent with reconciliation of a page.
Here is the original description:
Reconciliation reads upd->txnid into a local variable, then the transaction rolls back (say), setting upd->txnid = WT_TXN_ABORTED. Then txn_global->last_running is updated so the cached txnid is older than the oldest running transaction, causing __wt_txn_committed to return true.
At this point, reconciliation thinks it has a committed update (based on the cached txnid) but the actual transaction has rolled back.
I believe we have reintroduced this bug by not checking uncommitted and instead relying on __wt_txn_visible_all, which has the same race as in WT-3406 (by the time we determine that a cached copy of some transaction ID is more recent than the oldest, it can have rolled back in the WT_UPDATE).