You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@spark.apache.org by a1k0n <gi...@git.apache.org> on 2016/03/04 01:31:44 UTC

[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

GitHub user a1k0n opened a pull request:

    https://github.com/apache/spark/pull/11505

    [SPARK-13631] [CORE] Thread-safe getLocationsWithLargestOutputs

    ## What changes were proposed in this pull request?
    
    If a job is being scheduled in one thread which has a dependency on an
    RDD currently executing a shuffle in another thread, Spark would throw a
    NullPointerException. This patch synchronizes access to `mapStatuses` and
    skips null status entries (which are in-progress shuffle tasks).
    
    ## How was this patch tested?
    
    Our client code unit test suite, which was reliably reproducing the race
    condition with 10 threads, shows that this fixes it. I have not found a minimal
    test case to add to Spark, but I will attempt to do so if desired.
    
    The same test case was tripping up on SPARK-4454, which was fixed by
    making other DAGScheduler code thread-safe.
    
    @shivaram @srowen 

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/a1k0n/spark SPARK-13631

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/spark/pull/11505.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #11505
    
----
commit 7fad8fa5734559b87cf05b030a8e4c716880c60f
Author: Andy Sloane <as...@tetrationanalytics.com>
Date:   2016-03-04T00:16:35Z

    [SPARK-13631] [CORE] Thread-safe getLocationsWithLargestOutputs
    
    If a job is being scheduled in one thread which has a dependency on an
    RDD currently executing a shuffle in another thread, Spark would throw a
    NullPointerException.

----


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192073623
  
    **[Test build #52427 has finished](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/52427/consoleFull)** for PR 11505 at commit [`8add38a`](https://github.com/apache/spark/commit/8add38a2d8eaec2742eb2b0fe7c91cccb54c0c08).
     * This patch **fails Spark unit tests**.
     * This patch merges cleanly.
     * This patch adds no public classes.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by a1k0n <gi...@git.apache.org>.
Github user a1k0n commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192044829
  
    I have to admit I don't completely understand the design, and that this might just be treating a symptom of something else -- when `getPreferredLocations` is walking the dependency graph, should those map output statuses really be null entries? Can they be populated sooner? How does this thing work?


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by srowen <gi...@git.apache.org>.
Github user srowen commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192974749
  
    @zsxwing looks good to me, sounds like you're OK with it too


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192074328
  
    Test FAILed.
    Refer to this link for build results (access rights to CI server needed): 
    https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/52427/
    Test FAILed.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by zsxwing <gi...@git.apache.org>.
Github user zsxwing commented on a diff in the pull request:

    https://github.com/apache/spark/pull/11505#discussion_r55262387
  
    --- Diff: core/src/main/scala/org/apache/spark/MapOutputTracker.scala ---
    @@ -386,28 +384,36 @@ private[spark] class MapOutputTrackerMaster(conf: SparkConf)
           fractionThreshold: Double)
         : Option[Array[BlockManagerId]] = {
     
    -    if (mapStatuses.contains(shuffleId)) {
    -      val statuses = mapStatuses(shuffleId)
    -      if (statuses.nonEmpty) {
    -        // HashMap to add up sizes of all blocks at the same location
    -        val locs = new HashMap[BlockManagerId, Long]
    -        var totalOutputSize = 0L
    -        var mapIdx = 0
    -        while (mapIdx < statuses.length) {
    -          val status = statuses(mapIdx)
    -          val blockSize = status.getSizeForBlock(reducerId)
    -          if (blockSize > 0) {
    -            locs(status.location) = locs.getOrElse(status.location, 0L) + blockSize
    -            totalOutputSize += blockSize
    +    val statuses = mapStatuses.get(shuffleId).orNull
    +    if (statuses != null) {
    +      statuses.synchronized {
    +        if (statuses.nonEmpty) {
    +          // HashMap to add up sizes of all blocks at the same location
    +          val locs = new HashMap[BlockManagerId, Long]
    +          var totalOutputSize = 0L
    +          var mapIdx = 0
    +          while (mapIdx < statuses.length) {
    +            val status = statuses(mapIdx)
    +            // status may be null here if we are called between registerShuffle, which creates an
    +            // array with null entries for each output, and registerMapOutputs, which populates it
    +            // with valid status entries. This is possible if one thread schedules a job which
    +            // depends on an RDD which is currently being computed by another thread.
    +            if (status != null) {
    --- End diff --
    
    Maybe we should review RDD's codes and add defense codes to make it thread safe.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by zsxwing <gi...@git.apache.org>.
Github user zsxwing commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-193650717
  
    LGTM


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192037835
  
    **[Test build #52425 has started](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/52425/consoleFull)** for PR 11505 at commit [`7fad8fa`](https://github.com/apache/spark/commit/7fad8fa5734559b87cf05b030a8e4c716880c60f).


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by zsxwing <gi...@git.apache.org>.
Github user zsxwing commented on a diff in the pull request:

    https://github.com/apache/spark/pull/11505#discussion_r54973858
  
    --- Diff: core/src/main/scala/org/apache/spark/MapOutputTracker.scala ---
    @@ -386,28 +384,32 @@ private[spark] class MapOutputTrackerMaster(conf: SparkConf)
           fractionThreshold: Double)
         : Option[Array[BlockManagerId]] = {
     
    -    if (mapStatuses.contains(shuffleId)) {
    -      val statuses = mapStatuses(shuffleId)
    -      if (statuses.nonEmpty) {
    -        // HashMap to add up sizes of all blocks at the same location
    -        val locs = new HashMap[BlockManagerId, Long]
    -        var totalOutputSize = 0L
    -        var mapIdx = 0
    -        while (mapIdx < statuses.length) {
    -          val status = statuses(mapIdx)
    -          val blockSize = status.getSizeForBlock(reducerId)
    -          if (blockSize > 0) {
    -            locs(status.location) = locs.getOrElse(status.location, 0L) + blockSize
    -            totalOutputSize += blockSize
    +    val statuses = mapStatuses.get(shuffleId).orNull
    +    if (statuses != null) {
    +      statuses.synchronized {
    --- End diff --
    
    nice catch


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by a1k0n <gi...@git.apache.org>.
Github user a1k0n commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192136179
  
    Jenkins, retest this please


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by a1k0n <gi...@git.apache.org>.
Github user a1k0n commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192094056
  
    rebasing to pick up flaky test fix


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192270319
  
    Merged build finished. Test PASSed.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192078053
  
    Test FAILed.
    Refer to this link for build results (access rights to CI server needed): 
    https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/52425/
    Test FAILed.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by srowen <gi...@git.apache.org>.
Github user srowen commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-193649424
  
    OK, well unless there's a moderately strong objection, I think we can go ahead and merge this, even for 1.6. It's a cheap defensive measure and I don't see a downside.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192131731
  
    **[Test build #52444 has finished](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/52444/consoleFull)** for PR 11505 at commit [`4f78803`](https://github.com/apache/spark/commit/4f7880340f9c05e54b0758a308493b3d8dced83d).
     * This patch **fails Spark unit tests**.
     * This patch merges cleanly.
     * This patch adds no public classes.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192225891
  
    **[Test build #52462 has started](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/52462/consoleFull)** for PR 11505 at commit [`4f78803`](https://github.com/apache/spark/commit/4f7880340f9c05e54b0758a308493b3d8dced83d).


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192042208
  
    **[Test build #52427 has started](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/52427/consoleFull)** for PR 11505 at commit [`8add38a`](https://github.com/apache/spark/commit/8add38a2d8eaec2742eb2b0fe7c91cccb54c0c08).


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192131987
  
    Test FAILed.
    Refer to this link for build results (access rights to CI server needed): 
    https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/52444/
    Test FAILed.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by zsxwing <gi...@git.apache.org>.
Github user zsxwing commented on a diff in the pull request:

    https://github.com/apache/spark/pull/11505#discussion_r54973831
  
    --- Diff: core/src/main/scala/org/apache/spark/MapOutputTracker.scala ---
    @@ -386,28 +384,32 @@ private[spark] class MapOutputTrackerMaster(conf: SparkConf)
           fractionThreshold: Double)
         : Option[Array[BlockManagerId]] = {
     
    -    if (mapStatuses.contains(shuffleId)) {
    -      val statuses = mapStatuses(shuffleId)
    -      if (statuses.nonEmpty) {
    -        // HashMap to add up sizes of all blocks at the same location
    -        val locs = new HashMap[BlockManagerId, Long]
    -        var totalOutputSize = 0L
    -        var mapIdx = 0
    -        while (mapIdx < statuses.length) {
    -          val status = statuses(mapIdx)
    -          val blockSize = status.getSizeForBlock(reducerId)
    -          if (blockSize > 0) {
    -            locs(status.location) = locs.getOrElse(status.location, 0L) + blockSize
    -            totalOutputSize += blockSize
    +    val statuses = mapStatuses.get(shuffleId).orNull
    +    if (statuses != null) {
    +      statuses.synchronized {
    +        if (statuses.nonEmpty) {
    +          // HashMap to add up sizes of all blocks at the same location
    +          val locs = new HashMap[BlockManagerId, Long]
    +          var totalOutputSize = 0L
    +          var mapIdx = 0
    +          while (mapIdx < statuses.length) {
    +            val status = statuses(mapIdx)
    +            if (status != null) {
    --- End diff --
    
    Could you clarify in which situation `status` will be null?


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192035576
  
    Can one of the admins verify this patch?


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192270323
  
    Test PASSed.
    Refer to this link for build results (access rights to CI server needed): 
    https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/52462/
    Test PASSed.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by asfgit <gi...@git.apache.org>.
Github user asfgit closed the pull request at:

    https://github.com/apache/spark/pull/11505


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192131985
  
    Merged build finished. Test FAILed.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by markhamstra <gi...@git.apache.org>.
Github user markhamstra commented on a diff in the pull request:

    https://github.com/apache/spark/pull/11505#discussion_r55564271
  
    --- Diff: core/src/main/scala/org/apache/spark/MapOutputTracker.scala ---
    @@ -386,28 +384,36 @@ private[spark] class MapOutputTrackerMaster(conf: SparkConf)
           fractionThreshold: Double)
         : Option[Array[BlockManagerId]] = {
     
    -    if (mapStatuses.contains(shuffleId)) {
    -      val statuses = mapStatuses(shuffleId)
    -      if (statuses.nonEmpty) {
    -        // HashMap to add up sizes of all blocks at the same location
    -        val locs = new HashMap[BlockManagerId, Long]
    -        var totalOutputSize = 0L
    -        var mapIdx = 0
    -        while (mapIdx < statuses.length) {
    -          val status = statuses(mapIdx)
    -          val blockSize = status.getSizeForBlock(reducerId)
    -          if (blockSize > 0) {
    -            locs(status.location) = locs.getOrElse(status.location, 0L) + blockSize
    -            totalOutputSize += blockSize
    +    val statuses = mapStatuses.get(shuffleId).orNull
    +    if (statuses != null) {
    +      statuses.synchronized {
    +        if (statuses.nonEmpty) {
    +          // HashMap to add up sizes of all blocks at the same location
    +          val locs = new HashMap[BlockManagerId, Long]
    +          var totalOutputSize = 0L
    +          var mapIdx = 0
    +          while (mapIdx < statuses.length) {
    +            val status = statuses(mapIdx)
    +            // status may be null here if we are called between registerShuffle, which creates an
    +            // array with null entries for each output, and registerMapOutputs, which populates it
    +            // with valid status entries. This is possible if one thread schedules a job which
    +            // depends on an RDD which is currently being computed by another thread.
    +            if (status != null) {
    --- End diff --
    
    I'm a bit late to this, but I'll note that there is a pattern that can be applied on the user side to avoid both the race and unnecessary recomputation of the same RDD.  Putting the RDD actions into a Guava-style loading cache will allow the RDD to be computed just once while multiple threads can fetch the needed results from the loading-cached RDD -- the RDD itself, not the data produced as a result of the action.  That way all but the first attempt to evaluate the action will instead run on an RDD for which mapOutputs are already available, Stages can be skipped, etc.
    
    Some of the same ideas are covered in a different context in https://issues.apache.org/jira/browse/SPARK-11838  


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by zsxwing <gi...@git.apache.org>.
Github user zsxwing commented on a diff in the pull request:

    https://github.com/apache/spark/pull/11505#discussion_r55262278
  
    --- Diff: core/src/main/scala/org/apache/spark/MapOutputTracker.scala ---
    @@ -386,28 +384,36 @@ private[spark] class MapOutputTrackerMaster(conf: SparkConf)
           fractionThreshold: Double)
         : Option[Array[BlockManagerId]] = {
     
    -    if (mapStatuses.contains(shuffleId)) {
    -      val statuses = mapStatuses(shuffleId)
    -      if (statuses.nonEmpty) {
    -        // HashMap to add up sizes of all blocks at the same location
    -        val locs = new HashMap[BlockManagerId, Long]
    -        var totalOutputSize = 0L
    -        var mapIdx = 0
    -        while (mapIdx < statuses.length) {
    -          val status = statuses(mapIdx)
    -          val blockSize = status.getSizeForBlock(reducerId)
    -          if (blockSize > 0) {
    -            locs(status.location) = locs.getOrElse(status.location, 0L) + blockSize
    -            totalOutputSize += blockSize
    +    val statuses = mapStatuses.get(shuffleId).orNull
    +    if (statuses != null) {
    +      statuses.synchronized {
    +        if (statuses.nonEmpty) {
    +          // HashMap to add up sizes of all blocks at the same location
    +          val locs = new HashMap[BlockManagerId, Long]
    +          var totalOutputSize = 0L
    +          var mapIdx = 0
    +          while (mapIdx < statuses.length) {
    +            val status = statuses(mapIdx)
    +            // status may be null here if we are called between registerShuffle, which creates an
    +            // array with null entries for each output, and registerMapOutputs, which populates it
    +            // with valid status entries. This is possible if one thread schedules a job which
    +            // depends on an RDD which is currently being computed by another thread.
    +            if (status != null) {
    --- End diff --
    
    Mostly because of the checkpoint stuff :(


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192074321
  
    Merged build finished. Test FAILed.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by a1k0n <gi...@git.apache.org>.
Github user a1k0n commented on a diff in the pull request:

    https://github.com/apache/spark/pull/11505#discussion_r54974660
  
    --- Diff: core/src/main/scala/org/apache/spark/MapOutputTracker.scala ---
    @@ -386,28 +384,32 @@ private[spark] class MapOutputTrackerMaster(conf: SparkConf)
           fractionThreshold: Double)
         : Option[Array[BlockManagerId]] = {
     
    -    if (mapStatuses.contains(shuffleId)) {
    -      val statuses = mapStatuses(shuffleId)
    -      if (statuses.nonEmpty) {
    -        // HashMap to add up sizes of all blocks at the same location
    -        val locs = new HashMap[BlockManagerId, Long]
    -        var totalOutputSize = 0L
    -        var mapIdx = 0
    -        while (mapIdx < statuses.length) {
    -          val status = statuses(mapIdx)
    -          val blockSize = status.getSizeForBlock(reducerId)
    -          if (blockSize > 0) {
    -            locs(status.location) = locs.getOrElse(status.location, 0L) + blockSize
    -            totalOutputSize += blockSize
    +    val statuses = mapStatuses.get(shuffleId).orNull
    +    if (statuses != null) {
    +      statuses.synchronized {
    +        if (statuses.nonEmpty) {
    +          // HashMap to add up sizes of all blocks at the same location
    +          val locs = new HashMap[BlockManagerId, Long]
    +          var totalOutputSize = 0L
    +          var mapIdx = 0
    +          while (mapIdx < statuses.length) {
    +            val status = statuses(mapIdx)
    +            if (status != null) {
    --- End diff --
    
    Sure. Let me add a comment.



---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by srowen <gi...@git.apache.org>.
Github user srowen commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192225099
  
    Jenkins, retest this please


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by zsxwing <gi...@git.apache.org>.
Github user zsxwing commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192037363
  
    ok to test


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by srowen <gi...@git.apache.org>.
Github user srowen commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-194227218
  
    Merged to master/1.6


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192078050
  
    Merged build finished. Test FAILed.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192270064
  
    **[Test build #52462 has finished](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/52462/consoleFull)** for PR 11505 at commit [`4f78803`](https://github.com/apache/spark/commit/4f7880340f9c05e54b0758a308493b3d8dced83d).
     * This patch passes all tests.
     * This patch merges cleanly.
     * This patch adds no public classes.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by srowen <gi...@git.apache.org>.
Github user srowen commented on a diff in the pull request:

    https://github.com/apache/spark/pull/11505#discussion_r55261972
  
    --- Diff: core/src/main/scala/org/apache/spark/MapOutputTracker.scala ---
    @@ -386,28 +384,36 @@ private[spark] class MapOutputTrackerMaster(conf: SparkConf)
           fractionThreshold: Double)
         : Option[Array[BlockManagerId]] = {
     
    -    if (mapStatuses.contains(shuffleId)) {
    -      val statuses = mapStatuses(shuffleId)
    -      if (statuses.nonEmpty) {
    -        // HashMap to add up sizes of all blocks at the same location
    -        val locs = new HashMap[BlockManagerId, Long]
    -        var totalOutputSize = 0L
    -        var mapIdx = 0
    -        while (mapIdx < statuses.length) {
    -          val status = statuses(mapIdx)
    -          val blockSize = status.getSizeForBlock(reducerId)
    -          if (blockSize > 0) {
    -            locs(status.location) = locs.getOrElse(status.location, 0L) + blockSize
    -            totalOutputSize += blockSize
    +    val statuses = mapStatuses.get(shuffleId).orNull
    +    if (statuses != null) {
    +      statuses.synchronized {
    +        if (statuses.nonEmpty) {
    +          // HashMap to add up sizes of all blocks at the same location
    +          val locs = new HashMap[BlockManagerId, Long]
    +          var totalOutputSize = 0L
    +          var mapIdx = 0
    +          while (mapIdx < statuses.length) {
    +            val status = statuses(mapIdx)
    +            // status may be null here if we are called between registerShuffle, which creates an
    +            // array with null entries for each output, and registerMapOutputs, which populates it
    +            // with valid status entries. This is possible if one thread schedules a job which
    +            // depends on an RDD which is currently being computed by another thread.
    +            if (status != null) {
    --- End diff --
    
    Is that true? It's conceptually immutable, so that's a little surprising. Is it worth making this change anyway as a very cheap defensive step?


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by srowen <gi...@git.apache.org>.
Github user srowen commented on a diff in the pull request:

    https://github.com/apache/spark/pull/11505#discussion_r55181294
  
    --- Diff: core/src/main/scala/org/apache/spark/MapOutputTracker.scala ---
    @@ -376,8 +376,6 @@ private[spark] class MapOutputTrackerMaster(conf: SparkConf)
        * @param numReducers total number of reducers in the shuffle
        * @param fractionThreshold fraction of total map output size that a location must have
        *                          for it to be considered large.
    -   *
    -   * This method is not thread-safe.
    --- End diff --
    
    Are we sure this makes it thread-safe? I agree it seems to resolve a problem that could arise when calling this from multiple threads, but I am not as clear it solves all of them. I'm OK with removing this if we have no particular reason to believe it's not thread-safe at this point.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by a1k0n <gi...@git.apache.org>.
Github user a1k0n commented on a diff in the pull request:

    https://github.com/apache/spark/pull/11505#discussion_r55241498
  
    --- Diff: core/src/main/scala/org/apache/spark/MapOutputTracker.scala ---
    @@ -376,8 +376,6 @@ private[spark] class MapOutputTrackerMaster(conf: SparkConf)
        * @param numReducers total number of reducers in the shuffle
        * @param fractionThreshold fraction of total map output size that a location must have
        *                          for it to be considered large.
    -   *
    -   * This method is not thread-safe.
    --- End diff --
    
    I don't see any reason to believe it's not thread-safe; it's kind of neither explicitly thread-safe nor explicitly unsafe IMO. It's possible that individual `status` entries might change their size from underneath this function, but I don't see any problem with that. I am not necessarily the best person to ask, though.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by zsxwing <gi...@git.apache.org>.
Github user zsxwing commented on a diff in the pull request:

    https://github.com/apache/spark/pull/11505#discussion_r55260516
  
    --- Diff: core/src/main/scala/org/apache/spark/MapOutputTracker.scala ---
    @@ -386,28 +384,36 @@ private[spark] class MapOutputTrackerMaster(conf: SparkConf)
           fractionThreshold: Double)
         : Option[Array[BlockManagerId]] = {
     
    -    if (mapStatuses.contains(shuffleId)) {
    -      val statuses = mapStatuses(shuffleId)
    -      if (statuses.nonEmpty) {
    -        // HashMap to add up sizes of all blocks at the same location
    -        val locs = new HashMap[BlockManagerId, Long]
    -        var totalOutputSize = 0L
    -        var mapIdx = 0
    -        while (mapIdx < statuses.length) {
    -          val status = statuses(mapIdx)
    -          val blockSize = status.getSizeForBlock(reducerId)
    -          if (blockSize > 0) {
    -            locs(status.location) = locs.getOrElse(status.location, 0L) + blockSize
    -            totalOutputSize += blockSize
    +    val statuses = mapStatuses.get(shuffleId).orNull
    +    if (statuses != null) {
    +      statuses.synchronized {
    +        if (statuses.nonEmpty) {
    +          // HashMap to add up sizes of all blocks at the same location
    +          val locs = new HashMap[BlockManagerId, Long]
    +          var totalOutputSize = 0L
    +          var mapIdx = 0
    +          while (mapIdx < statuses.length) {
    +            val status = statuses(mapIdx)
    +            // status may be null here if we are called between registerShuffle, which creates an
    +            // array with null entries for each output, and registerMapOutputs, which populates it
    +            // with valid status entries. This is possible if one thread schedules a job which
    +            // depends on an RDD which is currently being computed by another thread.
    +            if (status != null) {
    --- End diff --
    
    I just realized this issue is because using the same RDD in two threads at the same time. Right? If so, I would like to say that's not a valid usage. RDD itself is not thread-safe.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by andy256 <gi...@git.apache.org>.
Github user andy256 commented on a diff in the pull request:

    https://github.com/apache/spark/pull/11505#discussion_r55281552
  
    --- Diff: core/src/main/scala/org/apache/spark/MapOutputTracker.scala ---
    @@ -386,28 +384,36 @@ private[spark] class MapOutputTrackerMaster(conf: SparkConf)
           fractionThreshold: Double)
         : Option[Array[BlockManagerId]] = {
     
    -    if (mapStatuses.contains(shuffleId)) {
    -      val statuses = mapStatuses(shuffleId)
    -      if (statuses.nonEmpty) {
    -        // HashMap to add up sizes of all blocks at the same location
    -        val locs = new HashMap[BlockManagerId, Long]
    -        var totalOutputSize = 0L
    -        var mapIdx = 0
    -        while (mapIdx < statuses.length) {
    -          val status = statuses(mapIdx)
    -          val blockSize = status.getSizeForBlock(reducerId)
    -          if (blockSize > 0) {
    -            locs(status.location) = locs.getOrElse(status.location, 0L) + blockSize
    -            totalOutputSize += blockSize
    +    val statuses = mapStatuses.get(shuffleId).orNull
    +    if (statuses != null) {
    +      statuses.synchronized {
    +        if (statuses.nonEmpty) {
    +          // HashMap to add up sizes of all blocks at the same location
    +          val locs = new HashMap[BlockManagerId, Long]
    +          var totalOutputSize = 0L
    +          var mapIdx = 0
    +          while (mapIdx < statuses.length) {
    +            val status = statuses(mapIdx)
    +            // status may be null here if we are called between registerShuffle, which creates an
    +            // array with null entries for each output, and registerMapOutputs, which populates it
    +            // with valid status entries. This is possible if one thread schedules a job which
    +            // depends on an RDD which is currently being computed by another thread.
    +            if (status != null) {
    --- End diff --
    
    It is true. I'm willing to say that my team is using spark wrong, and this isn't necessarily a valid condition.
    
    There's a larger discussion to be had here, which is why we are doing this: mainly because there's no good way to produce two concurrent output files from essentially the same job DAG. I'd like to have finer grained access to the runJob machinery, possibly deferring job creation so multiple rdd.save() calls can go into the same job. Anyway I'll make a post on spark-user or wherever is best to have that discussion.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192077494
  
    **[Test build #52425 has finished](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/52425/consoleFull)** for PR 11505 at commit [`7fad8fa`](https://github.com/apache/spark/commit/7fad8fa5734559b87cf05b030a8e4c716880c60f).
     * This patch **fails Spark unit tests**.
     * This patch merges cleanly.
     * This patch adds no public classes.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


[GitHub] spark pull request: [SPARK-13631] [CORE] Thread-safe getLocationsW...

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the pull request:

    https://github.com/apache/spark/pull/11505#issuecomment-192095362
  
    **[Test build #52444 has started](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/52444/consoleFull)** for PR 11505 at commit [`4f78803`](https://github.com/apache/spark/commit/4f7880340f9c05e54b0758a308493b3d8dced83d).


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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