Skip to content

Commit ee76a79

Browse files
committed
feat: add ErrorHandler
1 parent b3722a0 commit ee76a79

File tree

2 files changed

+39
-17
lines changed

2 files changed

+39
-17
lines changed

log_level.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package risefront
2+
3+
type LogLevel int
4+
5+
const (
6+
DebugLevel LogLevel = iota - 1
7+
InfoLevel
8+
WarnLevel
9+
ErrorLevel
10+
PanicLevel
11+
FatalLevel
12+
)

risefront.go

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,13 @@ type Config struct {
3737
Addresses []string // Addresses to listen to.
3838
Run func([]net.Listener) error // Handle the connections. All open connections should be properly closed before returning (srv.Shutdown for http.Server for instance).
3939

40-
Name string // Name of the socket file
41-
Dialer Dialer // Dialer for child-parent communication. Let empty for default dialer (PrefixDialer{}).
42-
Network string // "tcp" (default if empty), "tcp4", "tcp6", "unix" or "unixpacket"
43-
ErrorHandler func(kind string, err error) // Where errors should be logged (print to stderr by default)
44-
RestartSignal os.Signal // Signal to trigger a restart
45-
NoRestart bool // Disables all restarts
40+
Name string // Name of the socket file
41+
Dialer Dialer // Dialer for child-parent communication. Let empty for default dialer (PrefixDialer{}).
42+
Network string // "tcp" (default if empty), "tcp4", "tcp6", "unix" or "unixpacket"
43+
ErrorHandler func(kind string, err error) // Where errors should be logged (print to stderr by default)
44+
RestartSignal os.Signal // Signal to trigger a restart
45+
NoRestart bool // Disables all restarts
46+
LogHandler func(loglevel LogLevel, kind string, args ...interface{}) // Where debug messages should be logged
4647

4748
_ struct{} // to later add fields without break compatibility.
4849

@@ -83,6 +84,15 @@ func New(ctx context.Context, cfg Config) error {
8384
log.Println(kind, err)
8485
}
8586
}
87+
if cfg.LogHandler == nil {
88+
cfg.LogHandler = func(loglevel LogLevel, kind string, args ...interface{}) {
89+
if loglevel >= ErrorLevel {
90+
cfg.ErrorHandler(kind, fmt.Errorf("%v", args))
91+
return
92+
}
93+
log.Println(kind, args)
94+
}
95+
}
8696
if cfg.RestartSignal == nil {
8797
cfg.RestartSignal = SIGUSR1
8898
}
@@ -158,7 +168,7 @@ func (cfg Config) runParent(ctx context.Context, socket string) error {
158168
for _, ln := range listeners {
159169
err := ln.Close()
160170
if err != nil && !errors.Is(err, net.ErrClosed) {
161-
cfg.ErrorHandler("parent.sock.Close", err)
171+
cfg.LogHandler(ErrorLevel, "parent.sock.Close", err)
162172
}
163173
}
164174
}
@@ -169,10 +179,10 @@ func (cfg Config) runParent(ctx context.Context, socket string) error {
169179
signal.Notify(restartCh, cfg.RestartSignal)
170180
go func() {
171181
for range restartCh {
172-
cfg.ErrorHandler("parent", errors.New("restart signal received, starting new child process"))
182+
cfg.LogHandler(InfoLevel, "parent", "restart signal received, starting new child process")
173183
err := cfg.createChild()
174184
if err != nil {
175-
cfg.ErrorHandler("parent.createChild", err)
185+
cfg.LogHandler(ErrorLevel, "parent.createChild", err)
176186
continue
177187
}
178188
}
@@ -212,7 +222,7 @@ func (cfg Config) runParent(ctx context.Context, socket string) error {
212222
go func() {
213223
err := cfg.Run(firstChildListeners)
214224
if err != nil {
215-
cfg.ErrorHandler("parent.Run", err)
225+
cfg.LogHandler(ErrorLevel, "parent.Run", err)
216226
}
217227
}()
218228

@@ -223,7 +233,7 @@ func (cfg Config) runParent(ctx context.Context, socket string) error {
223233
if ctx.Err() != nil {
224234
return ctx.Err()
225235
}
226-
cfg.ErrorHandler("parent.sock.Accept", err)
236+
cfg.LogHandler(ErrorLevel, "parent.sock.Accept", err)
227237
var ne net.Error
228238
if errors.As(err, &ne) && ne.Timeout() {
229239
time.Sleep(5 * time.Millisecond)
@@ -234,7 +244,7 @@ func (cfg Config) runParent(ctx context.Context, socket string) error {
234244

235245
newForwarders, err := cfg.handleChildRequest(rw)
236246
if err != nil {
237-
cfg.ErrorHandler("child.Request", err)
247+
cfg.LogHandler(WarnLevel, "child.Request", err)
238248
continue
239249
}
240250

@@ -250,7 +260,7 @@ func (cfg Config) runExternalListener(ln net.Listener, ch chan net.Conn) {
250260
rw, err := ln.Accept()
251261

252262
if err != nil {
253-
cfg.ErrorHandler("parent."+ln.Addr().String()+".Accept", err)
263+
cfg.LogHandler(WarnLevel, "parent."+ln.Addr().String()+".Accept", err)
254264
var ne net.Error
255265
if errors.As(err, &ne) && ne.Timeout() {
256266
time.Sleep(5 * time.Millisecond)
@@ -326,7 +336,7 @@ func (cfg Config) handleChildRequest(rw io.ReadWriteCloser) ([]*forwarder, error
326336
wgClose.Done()
327337
if err != nil {
328338
_ = cliConn.Close()
329-
cfg.ErrorHandler("child."+addr+".Dial", err)
339+
cfg.LogHandler(ErrorLevel, "child."+addr+".Dial", err)
330340
return
331341
}
332342
proxy(srvConn, cliConn)
@@ -374,7 +384,7 @@ func (cfg Config) runChild(rw io.ReadWriteCloser) error {
374384
for _, ln := range listeners {
375385
err := ln.Close()
376386
if err != nil && !errors.Is(err, net.ErrClosed) {
377-
cfg.ErrorHandler("child.sock.Close", err)
387+
cfg.LogHandler(WarnLevel, "child.sock.Close", err)
378388
}
379389
}
380390
}
@@ -449,7 +459,7 @@ type childRequest struct {
449459
func Restart() {
450460
err := globalConfig.createChild()
451461
if err != nil {
452-
globalConfig.ErrorHandler("restart.createChild", fmt.Errorf("restart failed: %v", err))
462+
globalConfig.LogHandler(ErrorLevel, "restart.createChild", err)
453463
}
454464
}
455465

@@ -497,6 +507,6 @@ func (cfg Config) createChild() error {
497507
return err
498508
}
499509

500-
cfg.ErrorHandler("parent", fmt.Errorf("child process started, PID: %d, %d listeners passed", cmd.Process.Pid, len(cmd.ExtraFiles)))
510+
cfg.LogHandler(DebugLevel, "parent", fmt.Errorf("child process started, PID: %d, %d listeners passed", cmd.Process.Pid, len(cmd.ExtraFiles)))
501511
return nil
502512
}

0 commit comments

Comments
 (0)