geek
geek

Reputation: 1843

Go bug in ioutil.ReadFile()

I am running a program in Go which sends data continuously after reading a file /proc/stat. Using ioutil.ReadFile("/proc/stat") After running for about 14 hrs i got err: too many files open /proc/stat Click here for snippet of code.

I doubt that defer f.Close is ignored by Go sometimes or it is skipping it.


The snippet of code (in case play.golang.org dies sooner than stackoverflow.com):

package main

import ("fmt";"io/ioutil")

func main() {
    for {
        fmt.Println("Hello, playground")
        fData,err := ioutil.ReadFile("/proc/stat")
        if err != nil {
            fmt.Println("Err is ",err)
        }   
        fmt.Println("FileData",string(fData))
    }
}

Upvotes: 4

Views: 5621

Answers (2)

Tom
Tom

Reputation: 55

If you are sure you Do the f.Close(),it still has the proble,Maybe it is because your other connection,for example the connection to MYSQL,also will be cause the problem,especially,in a loop,and you forget to close the connection.

Always do :

db.connection....
**defer db.Close()**

If it is in loop

loop
    db.connection....
    **defer db.Close()**
end

Do not put the db.connection before the loop

Upvotes: 0

user811773
user811773

Reputation:

The reason probably is that somewhere in your program:

  • you are forgetting to close files, or

  • you are leaning on the garbage collector to automatically close files on object finalization, but Go's conservative garbage collector fails to do so. In this case you should check your program's memory consumption (whether it is steadily increasing while the program is running).

In either case, try to check the contents of /proc/PID/fd to see whether the number of open files is increasing while the program is running.

Upvotes: 5

Related Questions