Skip to content

Commit 6475a79

Browse files
committed
Avoid ConcurrentModificationException in periodic dropped peers handler
1 parent 3767cc7 commit 6475a79

File tree

2 files changed

+14
-15
lines changed

2 files changed

+14
-15
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ cd ios && pod install && cd ../
3333
### Android
3434
- Open `lib/android` in Android Studio
3535
- To enable documentation for the LDK code, follow this guide: [How to attach JavaDoc to the library in Android Studio](https://medium.com/@mydogtom/tip-how-to-attach-javadoc-to-the-library-in-android-studio-5ff43c4303b3), ie.:
36-
1. Switch to `Project` view in the Project browser tool windo
36+
1. Switch to `Project` view in the Project browser tool window
3737
2. Expand `External Libraries`
3838
3. Right click on `Gradle: ./libs/LDK-release.aar` then `Library Properties…`
3939
4. Tap the ➕ button and select the `./lib/android/libs/ldk-java-javadoc.jar` file

lib/android/src/main/java/com/reactnativeldk/LdkModule.kt

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import org.ldk.enums.Currency
1010
import org.ldk.enums.Network
1111
import org.ldk.enums.Recipient
1212
import org.ldk.enums.RetryableSendFailure
13-
import org.ldk.impl.bindings.LDKPaymentSendFailure.DuplicatePayment
1413
import org.ldk.impl.bindings.get_ldk_c_bindings_version
1514
import org.ldk.impl.bindings.get_ldk_version
1615
import org.ldk.structs.*
@@ -29,6 +28,10 @@ import java.nio.file.Files
2928
import java.nio.file.Paths
3029
import java.text.SimpleDateFormat
3130
import java.util.*
31+
import java.util.concurrent.ConcurrentLinkedQueue
32+
import java.util.concurrent.ScheduledFuture
33+
import java.util.concurrent.ScheduledThreadPoolExecutor
34+
import java.util.concurrent.TimeUnit
3235

3336

3437
//MARK: ************Replicate in typescript and swift************
@@ -182,9 +185,9 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
182185
private var currentBlockchainHeight: Double? = null
183186

184187
//List of peers that "should" remain connected. Stores address: String, port: Double, pubKey: String
185-
private var addedPeers: MutableList<HashMap<String, Any>> = mutableListOf()
186-
private var currentlyConnectingPeers: MutableList<String> = mutableListOf()
187-
private var timerTaskScheduled: Boolean = false
188+
private var addedPeers = ConcurrentLinkedQueue<Map<String, Any>>()
189+
private var currentlyConnectingPeers = ConcurrentLinkedQueue<String>()
190+
private var periodicDroppedPeersHandler: ScheduledFuture<*>? = null
188191

189192
//Static to be accessed from other classes
190193
companion object {
@@ -512,14 +515,10 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
512515

513516
peerHandler = channelManagerConstructor!!.nio_peer_handler
514517

515-
//Start watching for dropped peers every 1 second
516-
if (!timerTaskScheduled) {
517-
Timer().schedule(object : TimerTask() {
518-
override fun run() {
519-
handleDroppedPeers()
520-
}
521-
}, 1000, 3000)
522-
timerTaskScheduled = true
518+
//after 1s, Start watching for dropped peers every 3 seconds
519+
if (periodicDroppedPeersHandler == null) {
520+
periodicDroppedPeersHandler = ScheduledThreadPoolExecutor(1)
521+
.scheduleWithFixedDelay(::handleDroppedPeers,1, 3, TimeUnit.SECONDS)
523522
}
524523

525524
//Cached for restarts
@@ -621,7 +620,7 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
621620
handleResolve(promise, LdkCallbackResponses.chain_sync_success)
622621
}
623622

624-
fun handleDroppedPeers() {
623+
private fun handleDroppedPeers() {
625624
peerHandler ?: return LdkEventEmitter.send(EventTypes.native_log, "Handling dropped peers error. Peer handler not initialized.")
626625

627626
LdkEventEmitter.send(EventTypes.native_log, "Checking for dropped peers")
@@ -679,7 +678,7 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
679678
currentlyConnectingPeers.remove(pubKey)
680679

681680
//Should retry if success or fail
682-
if (!addedPeers.map { it["pubKey"] as String }.contains(pubKey)) {
681+
if (addedPeers.none { it["pubKey"] as String == pubKey }) {
683682
addedPeers.add(hashMapOf(
684683
"address" to address,
685684
"port" to port,

0 commit comments

Comments
 (0)