In HDFS CacheReplicationMonitor, rescan is expensive. Sometimes, setNeedsRescan is called multiple times, for example, in FSNamesystem#modifyCacheDirective, there are 3 times. In monitor thread of CacheReplicationMonitor, if it checks needsRescan is true, rescan will happen, but needsRescan is set to false before real scan. Meanwhile, the 2nd or 3rd time setNeedsResacn may set needsRescan to true. So after the scan finish, in next loop, a new rescan will be triggered, that's not necessary at all and inefficient for rescan twice.