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.

Reply via email to