@@ -20,11 +20,14 @@ package org.apache.spark.network.nio
20
20
import java .net ._
21
21
import java .nio ._
22
22
import java .nio .channels ._
23
+ import java .util .concurrent .ConcurrentLinkedQueue
23
24
import java .util .LinkedList
24
25
25
26
import org .apache .spark ._
26
27
28
+ import scala .collection .JavaConversions ._
27
29
import scala .collection .mutable .{ArrayBuffer , HashMap }
30
+ import scala .util .control .NonFatal
28
31
29
32
private [nio]
30
33
abstract class Connection (val channel : SocketChannel , val selector : Selector ,
@@ -51,7 +54,7 @@ abstract class Connection(val channel: SocketChannel, val selector: Selector,
51
54
52
55
@ volatile private var closed = false
53
56
var onCloseCallback : Connection => Unit = null
54
- var onExceptionCallback : (Connection , Exception ) => Unit = null
57
+ val onExceptionCallbacks = new ConcurrentLinkedQueue [ (Connection , Throwable ) => Unit ]
55
58
var onKeyInterestChangeCallback : (Connection , Int ) => Unit = null
56
59
57
60
val remoteAddress = getRemoteAddress()
@@ -130,20 +133,24 @@ abstract class Connection(val channel: SocketChannel, val selector: Selector,
130
133
onCloseCallback = callback
131
134
}
132
135
133
- def onException (callback : (Connection , Exception ) => Unit ) {
134
- onExceptionCallback = callback
136
+ def onException (callback : (Connection , Throwable ) => Unit ) {
137
+ onExceptionCallbacks.add( callback)
135
138
}
136
139
137
140
def onKeyInterestChange (callback : (Connection , Int ) => Unit ) {
138
141
onKeyInterestChangeCallback = callback
139
142
}
140
143
141
- def callOnExceptionCallback (e : Exception ) {
142
- if (onExceptionCallback != null ) {
143
- onExceptionCallback(this , e)
144
- } else {
145
- logError(" Error in connection to " + getRemoteConnectionManagerId() +
146
- " and OnExceptionCallback not registered" , e)
144
+ def callOnExceptionCallbacks (e : Throwable ) {
145
+ onExceptionCallbacks foreach {
146
+ callback =>
147
+ try {
148
+ callback(this , e)
149
+ } catch {
150
+ case NonFatal (e) => {
151
+ logWarning(" Ignored error in onExceptionCallback" , e)
152
+ }
153
+ }
147
154
}
148
155
}
149
156
@@ -323,7 +330,7 @@ class SendingConnection(val address: InetSocketAddress, selector_ : Selector,
323
330
} catch {
324
331
case e : Exception => {
325
332
logError(" Error connecting to " + address, e)
326
- callOnExceptionCallback (e)
333
+ callOnExceptionCallbacks (e)
327
334
}
328
335
}
329
336
}
@@ -348,7 +355,7 @@ class SendingConnection(val address: InetSocketAddress, selector_ : Selector,
348
355
} catch {
349
356
case e : Exception => {
350
357
logWarning(" Error finishing connection to " + address, e)
351
- callOnExceptionCallback (e)
358
+ callOnExceptionCallbacks (e)
352
359
}
353
360
}
354
361
true
@@ -393,7 +400,7 @@ class SendingConnection(val address: InetSocketAddress, selector_ : Selector,
393
400
} catch {
394
401
case e : Exception => {
395
402
logWarning(" Error writing in connection to " + getRemoteConnectionManagerId(), e)
396
- callOnExceptionCallback (e)
403
+ callOnExceptionCallbacks (e)
397
404
close()
398
405
return false
399
406
}
@@ -420,7 +427,7 @@ class SendingConnection(val address: InetSocketAddress, selector_ : Selector,
420
427
case e : Exception =>
421
428
logError(" Exception while reading SendingConnection to " + getRemoteConnectionManagerId(),
422
429
e)
423
- callOnExceptionCallback (e)
430
+ callOnExceptionCallbacks (e)
424
431
close()
425
432
}
426
433
@@ -577,7 +584,7 @@ private[spark] class ReceivingConnection(
577
584
} catch {
578
585
case e : Exception => {
579
586
logWarning(" Error reading from connection to " + getRemoteConnectionManagerId(), e)
580
- callOnExceptionCallback (e)
587
+ callOnExceptionCallbacks (e)
581
588
close()
582
589
return false
583
590
}
0 commit comments