in removeBlock()/ dropOldBlock()/ dropFromMemory()
all have the same logic:
1. info = blockInfo.get(id)
2. if (info != null)
there may be a possibility that while one thread got info.lock while the previous thread already removed from blockinfo in info.lock.
but one thing in current code, That not check info is null or not, while get info.lock to remove block, will not cause any errors.