multiformats / go-multistream

an implementation of the multistream protocol in go
MIT License
40 stars 27 forks source link

deprecate NegotiateLazy #85

Closed marten-seemann closed 2 years ago

marten-seemann commented 2 years ago

Negotiate and NegotiateLazy both

  1. block until they've read the first "/multistream/1.0.0" from rwc
  2. write the "/multistream/1.0.0" response
  3. read tokens from rwc in a loop, echoing the the token if the protocol is supported, or send "na" if the protocol is not supported

The only difference between these two function is that Negotiate performs writes synchronously, whereas NegotiateLazy spawns a separate Go routine to perform these writes, and returns before these writes have finishes.

That means that NegotiateLazy is only faster than Negotiate if we assume that any of these writes would block / take significant time. I would argue that this is not the case, as we're either writing to a network.SecureConn or a network.Stream, both of which probably are buffered, or wouldn't block under normal circumstances.

Deprecating NegotiateLazy would allow us to easily fix the race condition (#83) by just deleting the faulty code path :)

Stebalien commented 2 years ago

Let me page in the context here. IIRC, there was a very good reason not to do that.