Perhaps when the write pipeline completes, it should pass back the block information so that the initial commit to the NN can atomically add all the blocks.
DN's in pipe are DN1, DN2, DN3.
A block is being written, the client writes to DN1, which writes to DN2, which writes to DN3. When DN3 completes, it notifies DN2 and provides its block replica information. When DN2 completes and has DN3's response, it passes its information, along with DN3's, to DN1. When DN1 completes, and has DN2's information along with DN3's, it reports to the NN the information about all 3 replicas, and lastly returns to the original client.
This will have a few benefits:
Fewer RPC's to the NN, and therefore less NN load.
Atomic visibility of all replicas to the NN and clients.