Great work Steven! Closing Go bugs is always appreciated by the community. > On Nov 18, 2024, at 11:49 AM, Jason E. Aten <j.e.a...@gmail.com> wrote: > > Brilliant. Yes, that was my bug. Thank you Steven! > > On Monday, November 18, 2024 at 11:30:18 AM UTC-6 Steven Hartland wrote: > I believe the problem you have is that your readFull can return a partial > read if an error occurs e.g. timeout so when that happens you lose data by > overwriting the partial result with the next read. > > If you apply something like the following, which returns the bytes read and > continues the read from that offset you should be good: > --- main.go.timeout-race 2024-11-18 14:07:03 > +++ main.go 2024-11-18 17:24:09 > @@ -25,7 +25,7 @@ func service(conn net.Conn) { > func service(conn net.Conn) { > > cliGoroNumBytes := make([]byte, 8) > - err := readFull(conn, cliGoroNumBytes, nil) > + _, err := readFull(conn, cliGoroNumBytes, nil) > if err != nil { > panic(err) > } > @@ -115,8 +115,10 @@ func client(id int) { > // need to periodically check for other events, e.g. > shutdown, pause, etc. > // > // When we do so, we observe data loss. > + var offset int > for { > - err := readFull(conn, buff, &timeout) > + n, err := readFull(conn, buff[offset:], &timeout) > + offset += n > if err != nil { > //fmt.Printf("err = '%v'; current i=%v; prev > j=%v\n", err, i, j) > r := err.Error() > @@ -153,8 +155,7 @@ func readFull(conn net.Conn, buf []byte, timeout *time > var zeroTime = time.Time{} > > // readFull reads exactly len(buf) bytes from conn > -func readFull(conn net.Conn, buf []byte, timeout *time.Duration) error { > - > +func readFull(conn net.Conn, buf []byte, timeout *time.Duration) (int, > error) { > if timeout != nil && *timeout > 0 { > conn.SetReadDeadline(time.Now().Add(*timeout)) > } else { > @@ -172,13 +173,13 @@ func readFull(conn net.Conn, buf []byte, timeout *time > if err != nil { > panic(err) > } > - return nil > + return total, nil > } > if err != nil { > - return err > + return total, err > } > } > - return nil > + return total, nil > } > > func startClients() { > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com > <mailto:golang-nuts+unsubscr...@googlegroups.com>. > To view this discussion visit > https://groups.google.com/d/msgid/golang-nuts/dff6feb2-b561-4115-9e45-6403d34e6519n%40googlegroups.com > > <https://groups.google.com/d/msgid/golang-nuts/dff6feb2-b561-4115-9e45-6403d34e6519n%40googlegroups.com?utm_medium=email&utm_source=footer>.
-- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/golang-nuts/950F003B-5BEE-441D-9D8A-AA4EF147FE0D%40ix.netcom.com.