I found that current RAMCloud read may return a value which is not replicated to backups.
If a master crashes between ObjectManager::writeObject() and sync(), the new data may have been read by other client. After crash recovery, the old data will appear.
The solution without messing up with HashBucketLock (bad for transactions and multi-op) would be checking the last committed log point for every read operation. If we read data not synced, we may wait or return STATUS_RETRY.