Fix duplicate ATTACH messages when attaching before connection is established #1099
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR fixes a duplicate ATTACH message issue that occurred when
channel.attach()was called before the connection was established.Problem
When a channel was attached before the connection was fully established, the following sequence would result in duplicate ATTACH messages:
channel.attach()while connection is stillconnectingattachingstateconnectedConnectionManagercallssetConnected()on all channelssetConnected()callsattach(true, null)on all "reattachable" channels (including those inattachingstate)Root Cause
The
setConnected()method was usingstate.isReattachable()which returnstruefor channels inattaching,attached, orsuspendedstates. However, channels already inattachingstate should continue their existing attach process rather than starting a new one.Solution
Modified
setConnected()to only re-attach channels that are inattachedorsuspendedstates, excluding channels already inattachingstate:This ensures compliance with Ably specifications:
Testing
Added test
attach_before_connect_no_duplicate_attach()that:RawProtocolMonitorchannel.attach()before connection is establishedChanges
setConnected()method to prevent duplicate ATTACH for channels inattachingstateThis fix works in conjunction with the existing duplicate ATTACH prevention in
ConnectionManager.sendQueuedMessages()(from PR #1052) to fully resolve the duplicate ATTACH issue.Fixes #1018.
Warning
Firewall rules blocked me from connecting to one or more addresses
I tried to connect to the following addresses, but was blocked by firewall rules:
dl.google.com/usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -Xmx1536M -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-8.7-all/aan3ydargesu18aqyqjwhr3pc/gradle-8.7/lib/gradle-launcher-8.7.jar -javaagent:/home/REDACTED/.gradle/wrapper/dists/gradle-8.7-all/aan3ydargesu18aqyqjwhr3pc/gradle-8.7/lib/agents/gradle-instrumentation-agent-8.7.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.7(dns block)If you need me to access, download, or install something from one of these locations, you can either:
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.