Its not networked
// Read the data back
fmt.Println("Fetching object back using GetObject...")
r, err := c.GetObject(context.Background(), bucketName, objectName,
minio.GetObjectOptions{})
if err != nil {
logError(testName, function, args, startTime, "", "GetObject failed",
err)
return
}
defer r.Close()
fmt.Println("GetObject successful")
// Stat the object
st, err := r.Stat()
if err != nil {
logError(testName, function, args, startTime, "", "Stat object failed", err)
return
}
fmt.Printf("Stat object successful. Object size: %d bytes\n", st.Size)
if st.Size != int64(bufSize) { // bufSize is original object size (129 MB)
logError(testName, function, args, startTime, "", fmt.Sprintf("Number of
bytes does not match, expected %d, got %d", bufSize, st.Size), err)
return
}
fmt.Println("Object size verified against expected buffer size")
--------------------------------------------------------
// Comparison function after seek
cmpData := func(r io.Reader, start, end int) {
if end-start == 0 {
fmt.Printf("cmpData: no bytes to compare (start: %d, end: %d)\n",
start, end)
return
}
fmt.Printf("cmpData: comparing bytes from %d to %d...\n", start, end)
buffer := bytes.NewBuffer([]byte{})
// This is the critical line where the error occurs
if _, err := io.CopyN(buffer, r, int64(bufSize)); err != nil {
if err != io.EOF {
logError(testName, function, args, startTime, "", "CopyN
failed", err)
return
}
// ... rest of cmpData function ...
}
if !bytes.Equal(buf[start:end], buffer.Bytes()) {
logError(testName, function, args, startTime, "", "Incorrect read
bytes v/s original buffer", err)
return
}
fmt.Println("cmpData: byte comparison successful — data matches
original buffer")
}
----------------------------------------------------------------------------
On Mon, Jul 7, 2025 at 11:29 PM Steven Hartland <[email protected]>
wrote:
> What's the source and target, are they networked if so likely a
> network issue.
>
> On Mon, 7 Jul 2025 at 18:12, Kanak Bhatia <[email protected]> wrote:
>
>> Hi all,
>>
>> I'm encountering an intermittent issue while using io.CopyN to copy 129MB
>> object from reader to writer.
>>
>> The problem:
>> On some iterations, io.CopyN(dst, src, n) fails with unexpected EOF even
>> though the same logic succeeds in most runs. The failure typically happens
>> after 125–130 MB and returns ~1MB less data than expected.
>>
>> type debugReader struct {
>> r io.Reader
>> totalBytes int64
>> nextLogMB int64
>> }
>>
>> func (d *debugReader) Read(p []byte) (int, error) {
>> n, err := d.r.Read(p)
>> d.totalBytes += int64(n)
>> if d.totalBytes >= 125*1024*1024 {
>> currentMB := d.totalBytes / (1024 * 1024)
>> if currentMB >= d.nextLogMB {
>> fmt.Printf("🔵 Read %d MB so far\n", currentMB)
>> d.nextLogMB = currentMB + 1
>> }
>> }
>> return n, err
>> }
>>
>> type debugWriter struct {
>> w io.Writer
>> totalBytes int64
>> nextLogMB int64
>> }
>>
>> func (d *debugWriter) Write(p []byte) (int, error) {
>> n, err := d.w.Write(p)
>> d.totalBytes += int64(n)
>> if d.totalBytes >= 125*1024*1024 {
>> currentMB := d.totalBytes / (1024 * 1024)
>> if currentMB >= d.nextLogMB {
>> fmt.Printf("🟡 Written %d MB so far\n", currentMB)
>> d.nextLogMB = currentMB + 1
>> }
>> }
>> return n, err
>> }
>>
>> func SafeCopyN(dst *debugWriter, src *debugReader, n int64) (int64,
>> error) {
>> fmt.Printf("\n🔁 Starting SafeCopyN for %d bytes\n", n)
>> written, err := io.CopyN(dst, src, n)
>> fmt.Printf("📊 Total bytes read: %d\n", src.totalBytes)
>> fmt.Printf("📊 Total bytes written: %d\n", dst.totalBytes)
>>
>> const allowedDrift = 128 * 1024
>>
>> if err != nil {
>> diff := n - written
>> if err == io.ErrUnexpectedEOF && diff <= allowedDrift {
>> fmt.Printf("⚠ Accepting unexpected EOF: copied %d of %d
>> bytes (drift: %d bytes)\n", written, n, diff)
>> return written, nil
>> }
>>
>> fmt.Printf("❌ CopyN failed: wrote %d of %d bytes, err: %v\n",
>> written, n, err)
>> if src.totalBytes != dst.totalBytes {
>> fmt.Printf("📉 Mismatch: %d bytes read but not written\n",
>> src.totalBytes-dst.totalBytes)
>> }
>> } else {
>> fmt.Printf("✅ Successfully copied %d bytes\n", written)
>> }
>>
>> return written, err
>> }
>>
>>
>> ---
>>
>> Here's a real log from one of the failed runs (test runs 20 times, fails
>> 2):
>>
>>
>> 🔁 Starting SafeCopyN for 135264256 bytes
>> 🔵 Read 125 MB so far
>> 🟡 Written 125 MB so far
>> 🔵 Read 126 MB so far
>> 🟡 Written 126 MB so far
>> 🔵 Read 127 MB so far
>> 🟡 Written 127 MB so far
>> 📊 Total bytes read: 134215680
>> 📊 Total bytes written: 134215680
>> ❌ CopyN failed: wrote 134215680 of 135264256 bytes, err: unexpected EOF
>> 📉 Mismatch: 0 bytes read but not written
>>
>> Notes:
>>
>> This only happens 1 to 2 times out of 20 iteration.
>>
>> No server-side encryption involved.
>> ---
>>
>> Question:
>>
>> Has anyone seen something similar? Could this be:
>>
>> Timeout/internal truncation in io.CopyN?
>>
>> Should io.CopyN tolerate io.ErrUnexpectedEOF more gracefully in this case?
>>
>>
>> Any insights or guidance appreciated!
>>
>> --
>> 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 [email protected].
>> To view this discussion visit
>> https://groups.google.com/d/msgid/golang-nuts/56d2219e-32ab-4950-ab49-83b5fbbfc4fen%40googlegroups.com
>> <https://groups.google.com/d/msgid/golang-nuts/56d2219e-32ab-4950-ab49-83b5fbbfc4fen%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 [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/golang-nuts/CABXaED640tj-JF%2Bss0pH72WPxXR%3D4O0tRWE98XXzieHDCRbf_A%40mail.gmail.com.