Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
2.7.1
-
None
Description
The logic in CacheManager#checkLimit is not correct. In this method, it does with these three logic:
First, it will compute needed bytes for the specific path.
CacheDirectiveStats stats = computeNeeded(path, replication);
But the param replication is not used here. And the bytesNeeded is just one replication's vaue.
return new CacheDirectiveStats.Builder() .setBytesNeeded(requestedBytes) .setFilesCached(requestedFiles) .build();
Second, then it should be multiply by the replication to compare the limit size because the method computeNeeded was not used replication.
pool.getBytesNeeded() + (stats.getBytesNeeded() * replication) > pool.getLimit()
Third, if we find the size was more than the limit value and then print warning info. It divided by replication here, while the stats.getBytesNeeded() was just one replication value.
throw new InvalidRequestException("Caching path " + path + " of size " + stats.getBytesNeeded() / replication + " bytes at replication " + replication + " would exceed pool " + pool.getPoolName() + "'s remaining capacity of " + (pool.getLimit() - pool.getBytesNeeded()) + " bytes.");