aboutsummaryrefslogtreecommitdiff
path: root/core/src/test/scala
diff options
context:
space:
mode:
authorXiangrui Meng <meng@databricks.com>2016-12-09 07:51:46 -0800
committerXiangrui Meng <meng@databricks.com>2016-12-09 07:51:46 -0800
commitfd48d80a6145ea94f03e7fc6e4d724a0fbccac58 (patch)
tree000474455efdb56d0bf6417c3e365c78b202a5a7 /core/src/test/scala
parentb162cc0c2810c1a9fa2eee8e664ffae84f9eea11 (diff)
downloadspark-fd48d80a6145ea94f03e7fc6e4d724a0fbccac58.tar.gz
spark-fd48d80a6145ea94f03e7fc6e4d724a0fbccac58.tar.bz2
spark-fd48d80a6145ea94f03e7fc6e4d724a0fbccac58.zip
[SPARK-17822][R] Make JVMObjectTracker a member variable of RBackend
## What changes were proposed in this pull request? * This PR changes `JVMObjectTracker` from `object` to `class` and let its instance associated with each RBackend. So we can manage the lifecycle of JVM objects when there are multiple `RBackend` sessions. `RBackend.close` will clear the object tracker explicitly. * I assume that `SQLUtils` and `RRunner` do not need to track JVM instances, which could be wrong. * Small refactor of `SerDe.sqlSerDe` to increase readability. ## How was this patch tested? * Added unit tests for `JVMObjectTracker`. * Wait for Jenkins to run full tests. Author: Xiangrui Meng <meng@databricks.com> Closes #16154 from mengxr/SPARK-17822.
Diffstat (limited to 'core/src/test/scala')
-rw-r--r--core/src/test/scala/org/apache/spark/api/r/JVMObjectTrackerSuite.scala73
-rw-r--r--core/src/test/scala/org/apache/spark/api/r/RBackendSuite.scala31
2 files changed, 104 insertions, 0 deletions
diff --git a/core/src/test/scala/org/apache/spark/api/r/JVMObjectTrackerSuite.scala b/core/src/test/scala/org/apache/spark/api/r/JVMObjectTrackerSuite.scala
new file mode 100644
index 0000000000..6a979aefe6
--- /dev/null
+++ b/core/src/test/scala/org/apache/spark/api/r/JVMObjectTrackerSuite.scala
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.spark.api.r
+
+import org.apache.spark.SparkFunSuite
+
+class JVMObjectTrackerSuite extends SparkFunSuite {
+ test("JVMObjectId does not take null IDs") {
+ intercept[IllegalArgumentException] {
+ JVMObjectId(null)
+ }
+ }
+
+ test("JVMObjectTracker") {
+ val tracker = new JVMObjectTracker
+ assert(tracker.size === 0)
+ withClue("an empty tracker can be cleared") {
+ tracker.clear()
+ }
+ val none = JVMObjectId("none")
+ assert(tracker.get(none) === None)
+ intercept[NoSuchElementException] {
+ tracker(JVMObjectId("none"))
+ }
+
+ val obj1 = new Object
+ val id1 = tracker.addAndGetId(obj1)
+ assert(id1 != null)
+ assert(tracker.size === 1)
+ assert(tracker.get(id1).get.eq(obj1))
+ assert(tracker(id1).eq(obj1))
+
+ val obj2 = new Object
+ val id2 = tracker.addAndGetId(obj2)
+ assert(id1 !== id2)
+ assert(tracker.size === 2)
+ assert(tracker(id2).eq(obj2))
+
+ val Some(obj1Removed) = tracker.remove(id1)
+ assert(obj1Removed.eq(obj1))
+ assert(tracker.get(id1) === None)
+ assert(tracker.size === 1)
+ assert(tracker(id2).eq(obj2))
+
+ val obj3 = new Object
+ val id3 = tracker.addAndGetId(obj3)
+ assert(tracker.size === 2)
+ assert(id3 != id1)
+ assert(id3 != id2)
+ assert(tracker(id3).eq(obj3))
+
+ tracker.clear()
+ assert(tracker.size === 0)
+ assert(tracker.get(id1) === None)
+ assert(tracker.get(id2) === None)
+ assert(tracker.get(id3) === None)
+ }
+}
diff --git a/core/src/test/scala/org/apache/spark/api/r/RBackendSuite.scala b/core/src/test/scala/org/apache/spark/api/r/RBackendSuite.scala
new file mode 100644
index 0000000000..085cc267ca
--- /dev/null
+++ b/core/src/test/scala/org/apache/spark/api/r/RBackendSuite.scala
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.spark.api.r
+
+import org.apache.spark.SparkFunSuite
+
+class RBackendSuite extends SparkFunSuite {
+ test("close() clears jvmObjectTracker") {
+ val backend = new RBackend
+ val tracker = backend.jvmObjectTracker
+ val id = tracker.addAndGetId(new Object)
+ backend.close()
+ assert(tracker.get(id) === None)
+ assert(tracker.size === 0)
+ }
+}