Skip to content

Synchronize Socket.sendBuffer access#105

Open
Maradox wants to merge 1 commit intodsrees:masterfrom
Maradox:fix/socketConcurrencyCrash
Open

Synchronize Socket.sendBuffer access#105
Maradox wants to merge 1 commit intodsrees:masterfrom
Maradox:fix/socketConcurrencyCrash

Conversation

@Maradox
Copy link
Copy Markdown

@Maradox Maradox commented Apr 30, 2026

Problem

The access to sendBuffer in Socket is not synchronized and might be accessed from different threads at the same time. Especially removeFromSendBuffer might be called from an OkHttp dispatcher.

Fix

Guarding the access tosendBuffer with synchronized.

Crashreports

ConcurrentModificationException

Fatal Exception: java.util.ConcurrentModificationException:
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1111)
at java.util.ArrayList$Itr.next(ArrayList.java:1064)
at org.phoenixframework.Socket.removeFromSendBuffer$JavaPhoenixClient(Socket.java:626)
at org.phoenixframework.Channel$11.invoke(Channel.java:220)
at org.phoenixframework.Channel$11.invoke(Channel.java:212)
at org.phoenixframework.Channel.trigger$JavaPhoenixClient(Channel.kt:415)
at org.phoenixframework.Channel.trigger$JavaPhoenixClient(Channel.kt:405)
at org.phoenixframework.Channel.trigger$JavaPhoenixClient$default(Channel.kt:398)
at org.phoenixframework.Socket.triggerChannelError(Socket.kt:460)
at org.phoenixframework.Socket.onConnectionError$JavaPhoenixClient(Socket.kt:608)
at org.phoenixframework.Socket$connect$3.invoke(Socket.java:320)
at org.phoenixframework.Socket$connect$3.invoke(Socket.java:320)
at org.phoenixframework.WebSocketTransport.onFailure(WebSocketTransport.java:136)
at okhttp3.internal.ws.RealWebSocket.failWebSocket(RealWebSocket.kt:644)
at okhttp3.internal.ws.RealWebSocket.failWebSocket$default(RealWebSocket.kt:617)
at okhttp3.internal.ws.RealWebSocket$connect$1.onFailure(RealWebSocket.kt:211)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:582)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1154)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:652)
at java.lang.Thread.run(Thread.java:1564)

NullPointerException

Fatal Exception: java.lang.NullPointerException: Attempt to read from field 'java.lang.Object ll.j.b' on a null object reference
at kotlin.Pair.getFirst(Pair.java:27)
at org.phoenixframework.Socket.removeFromSendBuffer$JavaPhoenixClient(Socket.java:476)
at org.phoenixframework.Channel$11.invoke(Channel.java:220)
at org.phoenixframework.Channel$11.invoke(Channel.java:212)
at org.phoenixframework.Channel.trigger$JavaPhoenixClient(Channel.kt:415)
at org.phoenixframework.Channel.trigger$JavaPhoenixClient(Channel.kt:405)
at org.phoenixframework.Channel.trigger$JavaPhoenixClient$default(Channel.kt:398)
at org.phoenixframework.Socket.triggerChannelError(Socket.kt:460)
at org.phoenixframework.Socket.onConnectionError$JavaPhoenixClient(Socket.kt:608)
at org.phoenixframework.Socket$connect$3.invoke(Socket.java:320)
at org.phoenixframework.Socket$connect$3.invoke(Socket.java:320)
at org.phoenixframework.WebSocketTransport.onFailure(WebSocketTransport.java:136)
at okhttp3.internal.ws.RealWebSocket.failWebSocket(RealWebSocket.kt:644)
at okhttp3.internal.ws.RealWebSocket.failWebSocket$default(RealWebSocket.kt:617)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:320)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.java:204)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:576)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant