The DataNode should mark short-circuit replicas that have been unlinked as stale. This would prevent replicas that had been deleted from lingering in the DFSClient cache. (At least for DFSClients that use shared memory; those without shared memory will still have to use the timeout method.)
Note that when a replica is stale, any ongoing reads or mmaps can still complete. But stale replicas will be removed from the DFSClient cache once they're no longer in use.