todo: need to take snapshot when reading