Currently append() succeeds on a file with the last block that has no replicas. But the subsequent updatePipeline() fails as there are no replicas with the exception "Unable to retrieve blocks locations for last block". This leaves the file unclosed, and others can not do anything with it until its lease expires.
The solution is to check replicas of the last block on the NameNode and fail during append() rather than during updatePipeline().
How many replicas should be present before NN allows to append? I see two options:
- min-replication: allow append if the last block is minimally replicated (1 by default)
- full-replication: allow append if the last block is fully replicated (3 by default)