Skip to content

Commit 11c24e8

Browse files
feat : handle thread safe issue for getCurrentFutures (#1843)
### 📝 Description improve thread safe issue for getCurrentFutures current implementation get the values form cachemap for dataloaders. And make it flatten. But when we get the values it's just iterator, not all the elements is obtained. So when we run flatten, it traverse the each iterator, and it make ```ArrayIndexOutOfBoundException``` Following is error message ``` aused by: java.lang.ArrayIndexOutOfBoundsException: Index 279 out of bounds for length 279 at java.base/java.util.HashMap.valuesToArray(HashMap.java:973) at java.base/java.util.HashMap$Values.toArray(HashMap.java:1050) at java.base/java.util.ArrayList.addAll(ArrayList.java:670) at kotlin.collections.CollectionsKt__MutableCollectionsKt.addAll(MutableCollections.kt:116) at kotlin.collections.CollectionsKt__IterablesKt.flatten(Iterables.kt:49) at com.expediagroup.graphql.dataloader.KotlinDataLoaderRegistry.getCurrentFutures(KotlinDataLoaderRegistry.kt:67) at com.expediagroup.graphql.dataloader.KotlinDataLoaderRegistry.dispatchAll(KotlinDataLoaderRegistry.kt:78) at graphql.execution.instrumentation.dataloader.FieldLevelTrackingApproach.dispatch(FieldLevelTrackingApproach.java:242) at graphql.execution.instrumentation.dataloader.FieldLevelTrackingApproach$1.onFieldValuesInfo(FieldLevelTrackingApproach.java:150) at graphql.execution.AsyncExecutionStrategy.lambda$execute$1(AsyncExecutionStrategy.java:72) at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) ... 50 common frames omitted ``` ### 🔗 Related Issues #1837
1 parent 8cc8169 commit 11c24e8

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

executions/graphql-kotlin-dataloader/src/main/kotlin/com/expediagroup/graphql/dataloader/KotlinDataLoaderRegistry.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ class KotlinDataLoaderRegistry(
6161
* @return list of current completable futures.
6262
*/
6363
fun getCurrentFutures(): List<CompletableFuture<*>> =
64-
synchronized(registry.dataLoaders) {
65-
registry.dataLoaders.map { dataLoader ->
66-
dataLoader.cacheMap.all
67-
}.flatten()
68-
}
64+
registry.dataLoaders.map { dataLoader ->
65+
synchronized(dataLoader) {
66+
dataLoader.cacheMap.all.toList()
67+
}
68+
}.flatten()
6969

7070
/**
7171
* This will invoke [DataLoader.dispatch] on each of the registered [DataLoader]s,

0 commit comments

Comments
 (0)