CentOS 5 32bit で fluent-agent-hydra を無理やり動かす
環境
問題
Go は CentOS 5 をサポートしていないせいか、 CentOS 5 32bit (Linux kernel 2.6.18) 上で fujiwara/fluent-agent-hydra · GitHub の32bit バイナリを動かすと以下のエラーを吐いて死ぬ。
# /usr/local/bin/fluent-agent-hydra -c /etc/fluent-agent-hydra.toml 2015/06/24 15:14:47 [info] Loading config file: /etc/fluent-agent-hydra.toml 2015/06/24 15:14:47 [info] set ReadBufferSize 1048576 2015/06/24 15:14:47 [info] Server localhost:24224 connected 2015/06/24 15:14:47 [info] ServerRoundRobin enabled 2015/06/24 15:14:47 [error] Couldn't create file watcher function not implemented 2015/06/24 15:14:47 [error] function not implemented 2015/06/24 15:14:47 [info] watching events of directory /var/log/httpd panic: runtime error: invalid memory address or nil pointer dereference [signal 0xb code=0x1 addr=0x1 pc=0x80b3f01] goroutine 1 [running]: github.com/fujiwara/fluent-agent-hydra/hydra.(*Watcher).WatchFile(0x0, 0x1894a690, 0x1e, 0x1e, 0x0, 0x0) /Users/fujiwara/src/github.com/fujiwara/fluent-agent-hydra/hydra/in_tail.go:71 +0x151 github.com/fujiwara/fluent-agent-hydra/hydra.NewInTail(0x18944b40, 0x0, 0x18944c40, 0x18944c80, 0x18944c80, 0x0, 0x0) /Users/fujiwara/src/github.com/fujiwara/fluent-agent-hydra/hydra/in_tail.go:105 +0x94 main.run(0x18944880) /Users/fujiwara/src/github.com/fujiwara/fluent-agent-hydra/cmd/fluent-agent-hydra/main.go:127 +0x525 main.main() /Users/fujiwara/src/github.com/fujiwara/fluent-agent-hydra/cmd/fluent-agent-hydra/main.go:69 +0x869 goroutine 6 [syscall]: os/signal.loop() /usr/local/Cellar/go/1.4.2/libexec/src/os/signal/signal_unix.go:21 +0x21 created by os/signal.init·1 /usr/local/Cellar/go/1.4.2/libexec/src/os/signal/signal_unix.go:27 +0x34 goroutine 7 [chan receive]: github.com/fujiwara/fluent-agent-hydra/hydra.(*Stats).Run(0x189a0580, 0x18944c80) /Users/fujiwara/src/github.com/fujiwara/fluent-agent-hydra/hydra/monitor.go:115 +0x48 created by github.com/fujiwara/fluent-agent-hydra/hydra.NewMonitor /Users/fujiwara/src/github.com/fujiwara/fluent-agent-hydra/hydra/monitor.go:134 +0x17b goroutine 14 [runnable]: github.com/fujiwara/fluent-agent-hydra/hydra.(*OutForward).Run(0x189a1360) /Users/fujiwara/src/github.com/fujiwara/fluent-agent-hydra/hydra/out_forward.go:44 created by main.run /Users/fujiwara/src/github.com/fujiwara/fluent-agent-hydra/cmd/fluent-agent-hydra/main.go:117 +0x96d goroutine 13 [sleep]: net.func·019() /usr/local/Cellar/go/1.4.2/libexec/src/net/dnsclient_unix.go:240 +0x54 created by net.loadConfig /usr/local/Cellar/go/1.4.2/libexec/src/net/dnsclient_unix.go:269 +0x1aa
問題の箇所
[error] Couldn't create file watcher function not implemented というエラーメッセージを頼りに追っていくと fsnotify が以下の箇所で syscall.Pipe2 を呼んでいるところでエラーが発生していることを突き止めた。
修正
- (注意1) Go の流儀をよく理解しないまま対応しているので、もっと良い方法があるかもしれない。
- (注意2) NONBLOCK でなくなっているので性能が落ちる可能性がある
$GOPATH/src/gopkg.in/fsnotify.v1/inotify_poller.go
diff --git a/inotify_poller.go b/inotify_poller.go index 3b41784..9f2b172 100644 --- a/inotify_poller.go +++ b/inotify_poller.go @@ -44,7 +44,7 @@ func newFdPoller(fd int) (*fdPoller, error) { return nil, errno } // Create pipe; pipe[0] is the read end, pipe[1] the write end. - errno = syscall.Pipe2(poller.pipe[:], syscall.O_NONBLOCK) + errno = syscall.Pipe(poller.pipe[:]) if errno != nil { return nil, errno }
まとめ
さっさと CentOS 6 以上に上げよう。