Hi, Reynold, thanks for your reply. 
Actually the StorageLevel of the block is re-constructed when its state be reported to the BlockManagerMaster here. Please see the tryToReportBlockStatus method in org.apache.spark.storage.BlockManager (https://github.com/apache/incubator-spark/blob/master/core/src/main/scala/org/apache/spark/storage/BlockManager.scala). The initial StorageLevel set by the user, such as ussMemory+useDisk,  is just a guide to the blockmanager, it tells the blockmanager which stores the block may store. The blockmanager will decide which store the blcok to the block in practice. And, the storgelevel it reported to the blockmanager is the a new constructed one based on which store the blcok to the block in practice. It seems to be either in memory or in disk, only in one store. Thus, the problem here is that the memSize and diskSize passed to the BlockStatus here are both large than 0, even if the data is only in one store. BTW, Is there any chance a block can lie in two stores at the same time?