[SPARK-3170][CORE][BUG]:RDD info loss in "StorageTab" and "ExecutorTab"

compeleted stage only need to remove its own partitions that are no longer cached. However, "StorageTab" may lost some rdds which are cached actually. Not only in "StorageTab", "ExectutorTab" may also lose some rdd info which have been overwritten by last rdd in a same task.
1. "StorageTab": when multiple stages run simultaneously, completed stage will remove rdd info which belong to other stages that are still running.
2. "ExectutorTab": taskcontext may lose some "updatedBlocks" info of  rdds  in a dependency chain. Like the following example:
         val r1 = sc.paralize(..).cache()
         val r2 = r1.map(...).cache()
         val n = r2.count()

When count the r2, r1 and r2 will be cached finally. So in CacheManager.getOrCompute, the taskcontext should contain "updatedBlocks" of r1 and r2. Currently, the "updatedBlocks" only contain the info of r2. 
@andrewor14 IMHO, the "getOrCompute" can be called more than once per task (indirect recursively). In this code snippet: 

       val rdd1 = sc.parallelize(...).cache()
       val rdd2 = rdd1.map(...).cache()
       val count = rdd2.count()

This code snippet will submit one stage . We take task-1 as an example. Task-1 firstly calls getOrCompute(rdd-2) , and then calls getOrCompute(rdd-1) inside "getOrCompute(rdd-2)". Therefore, it will generates and caches block rdd-1-1 and  block rdd-2-1 one by one. At the end of getOrCompute(rdd-1), the taskMetrics.updatedBlocks of task-1 will be seq(rdd-1-1). Then at the end of getOrCompute(rdd-2), the taskMetrics.updatedBlocks will be seq(rdd-1-1, rdd-2-1).