You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@spark.apache.org by dbtsai <gi...@git.apache.org> on 2018/05/14 17:33:09 UTC

[GitHub] spark pull request #21322: [SPARK-24225][CORE] Support closing AutoClosable ...

Github user dbtsai commented on a diff in the pull request:

    https://github.com/apache/spark/pull/21322#discussion_r188034118
  
    --- Diff: core/src/test/scala/org/apache/spark/storage/MemoryStoreSuite.scala ---
    @@ -526,4 +526,84 @@ class MemoryStoreSuite
           }
         }
       }
    +
    +  test("[SPARK-24225]: remove should close AutoCloseable object") {
    +
    +    val (store, _) = makeMemoryStore(12000)
    +
    +    val id = BroadcastBlockId(0)
    +    val tracker = new CloseTracker()
    +    store.putIteratorAsValues(id, Iterator(tracker), ClassTag.Any)
    +    assert(store.contains(id))
    +    store.remove(id)
    +    assert(tracker.getClosed())
    +  }
    +
    +  test("[SPARK-24225]: remove should close AutoCloseable objects even if they throw exceptions") {
    +
    +    val (store, _) = makeMemoryStore(12000)
    +
    +    val id = BroadcastBlockId(0)
    +    val tracker = new CloseTracker(true)
    +    store.putIteratorAsValues(id, Iterator(tracker), ClassTag.Any)
    +    assert(store.contains(id))
    +    store.remove(id)
    +    assert(tracker.getClosed())
    +  }
    +
    +  test("[SPARK-24225]: clear should close AutoCloseable objects") {
    +
    +    val (store, _) = makeMemoryStore(12000)
    +
    +    val id = BroadcastBlockId(0)
    +    val tracker = new CloseTracker
    +    store.putIteratorAsValues(id, Iterator(tracker), ClassTag.Any)
    +    assert(store.contains(id))
    +    store.clear()
    +    assert(tracker.getClosed())
    +  }
    +
    +  test("[SPARK-24225]: clear should close all AutoCloseable objects put together in an iterator") {
    +
    +    val (store, _) = makeMemoryStore(12000)
    +
    +    val id1 = BroadcastBlockId(1)
    +    val tracker2 = new CloseTracker
    +    val tracker1 = new CloseTracker
    +    store.putIteratorAsValues(id1, Iterator(tracker1, tracker2), ClassTag.Any)
    +    assert(store.contains(id1))
    +    store.clear()
    +    assert(tracker1.getClosed())
    +    assert(tracker2.getClosed())
    +  }
    +
    +  test("[SPARK-24225]: clear should close AutoCloseable objects even if they throw exceptions") {
    +
    +    val (store, _) = makeMemoryStore(12000)
    +
    +    val id1 = BroadcastBlockId(1)
    +    val id2 = BroadcastBlockId(2)
    +    val tracker2 = new CloseTracker(true)
    +    val tracker1 = new CloseTracker(true)
    +    store.putIteratorAsValues(id1, Iterator(tracker1), ClassTag.Any)
    +    store.putIteratorAsValues(id2, Iterator(tracker2), ClassTag.Any)
    +    assert(store.contains(id1))
    +    assert(store.contains(id2))
    +    store.clear()
    +    assert(tracker1.getClosed())
    +    assert(tracker2.getClosed())
    +  }
    +}
    +
    +private class CloseTracker (val throwsOnClosed: Boolean = false) extends AutoCloseable {
    +  var closed = false
    +  override def close(): Unit = {
    +    closed = true
    +    if (throwsOnClosed) {
    +      throw new RuntimeException("Throwing")
    +    }
    +  }
    +  def getClosed(): Boolean = {
    +    closed
    --- End diff --
    
    since `closed` is public, you might use it directly. Or you can make `closed` private. 


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org