As Vino said, checkpoints store the state of all operators of an application.
The state of a monitoring source function is the position in the currently read split and all splits that have been received and are currently pending.
In case of a recovery, the splits are recovered and the source is reset to the split that was read when the checkpoint was taken and set to the correct reading position.
Once, that is done, records that have been read before are read again. However, that does not affect the exactly-once guarantees of the operators state because all of them have been reset to the same position.