Skip to content

Commit

Permalink
Use go.uber.org/multierr (uber-go#458)
Browse files Browse the repository at this point in the history
This drops zap's custom multierror implementation in favor of
go.uber.org/multierr.

Performance should be the same because we're relying on `Append`, which
short circuits in the no-error case.
  • Loading branch information
abhinav authored and akshayjshah committed Jun 28, 2017
1 parent 0a01722 commit e15639d
Show file tree
Hide file tree
Showing 12 changed files with 45 additions and 184 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ export GO15VENDOREXPERIMENT=1
BENCH_FLAGS ?= -cpuprofile=cpu.pprof -memprofile=mem.pprof -benchmem
PKGS ?= $(shell glide novendor)
# Many Go tools take file globs or directories as arguments instead of packages.
PKG_FILES ?= *.go zapcore benchmarks buffer zapgrpc zaptest zaptest/observer internal/bufferpool internal/exit internal/multierror internal/color
PKG_FILES ?= *.go zapcore benchmarks buffer zapgrpc zaptest zaptest/observer internal/bufferpool internal/exit internal/color

# The linting tools evolve with each Go version, so run them only on the latest
# stable release.
Expand Down
6 changes: 4 additions & 2 deletions glide.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions glide.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ license: MIT
import:
- package: go.uber.org/atomic
version: ^1
- package: go.uber.org/multierr
version: ^1
testImport:
- package: github.com/satori/go.uuid
- package: github.com/sirupsen/logrus
Expand Down
72 changes: 0 additions & 72 deletions internal/multierror/multierror.go

This file was deleted.

74 changes: 0 additions & 74 deletions internal/multierror/multierror_test.go

This file was deleted.

9 changes: 5 additions & 4 deletions sugar.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,9 @@ package zap
import (
"fmt"

"go.uber.org/zap/internal/multierror"
"go.uber.org/zap/zapcore"

"go.uber.org/multierr"
)

const (
Expand Down Expand Up @@ -286,9 +287,9 @@ func (p invalidPair) MarshalLogObject(enc zapcore.ObjectEncoder) error {
type invalidPairs []invalidPair

func (ps invalidPairs) MarshalLogArray(enc zapcore.ArrayEncoder) error {
var errs multierror.Error
var err error
for i := range ps {
errs = errs.Append(enc.AppendObject(ps[i]))
err = multierr.Append(err, enc.AppendObject(ps[i]))
}
return errs.AsError()
return err
}
11 changes: 6 additions & 5 deletions writer.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ import (
"io/ioutil"
"os"

"go.uber.org/zap/internal/multierror"
"go.uber.org/zap/zapcore"

"go.uber.org/multierr"
)

// Open is a high-level wrapper that takes a variadic number of paths, opens or
Expand All @@ -46,7 +47,7 @@ func Open(paths ...string) (zapcore.WriteSyncer, func(), error) {
}

func open(paths []string) ([]zapcore.WriteSyncer, func(), error) {
var errs multierror.Error
var openErr error
writers := make([]zapcore.WriteSyncer, 0, len(paths))
files := make([]*os.File, 0, len(paths))
close := func() {
Expand All @@ -66,16 +67,16 @@ func open(paths []string) ([]zapcore.WriteSyncer, func(), error) {
continue
}
f, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
errs = errs.Append(err)
openErr = multierr.Append(openErr, err)
if err == nil {
writers = append(writers, f)
files = append(files, f)
}
}

if err := errs.AsError(); err != nil {
if openErr != nil {
close()
return writers, nil, err
return writers, nil, openErr
}

return writers, close, nil
Expand Down
9 changes: 5 additions & 4 deletions zapcore/entry.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ import (

"go.uber.org/zap/internal/bufferpool"
"go.uber.org/zap/internal/exit"
"go.uber.org/zap/internal/multierror"

"go.uber.org/multierr"
)

var (
Expand Down Expand Up @@ -209,12 +210,12 @@ func (ce *CheckedEntry) Write(fields ...Field) {
}
ce.dirty = true

var errs multierror.Error
var err error
for i := range ce.cores {
errs = errs.Append(ce.cores[i].Write(ce.Entry, fields))
err = multierr.Append(err, ce.cores[i].Write(ce.Entry, fields))
}
if ce.ErrorOutput != nil {
if err := errs.AsError(); err != nil {
if err != nil {
fmt.Fprintf(ce.ErrorOutput, "%v write error: %v\n", time.Now(), err)
ce.ErrorOutput.Sync()
}
Expand Down
8 changes: 4 additions & 4 deletions zapcore/hook.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

package zapcore

import "go.uber.org/zap/internal/multierror"
import "go.uber.org/multierr"

type hooked struct {
Core
Expand Down Expand Up @@ -60,9 +60,9 @@ func (h *hooked) With(fields []Field) Core {
func (h *hooked) Write(ent Entry, _ []Field) error {
// Since our downstream had a chance to register itself directly with the
// CheckedMessage, we don't need to call it here.
var errs multierror.Error
var err error
for i := range h.funcs {
errs = errs.Append(h.funcs[i](ent))
err = multierr.Append(err, h.funcs[i](ent))
}
return errs.AsError()
return err
}
8 changes: 4 additions & 4 deletions zapcore/json_encoder_impl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ import (
"time"

"go.uber.org/zap/internal/bufferpool"
"go.uber.org/zap/internal/multierror"

"github.com/stretchr/testify/assert"
"go.uber.org/multierr"
)

func TestJSONClone(t *testing.T) {
Expand Down Expand Up @@ -370,12 +370,12 @@ func (t turducken) MarshalLogObject(enc ObjectEncoder) error {
type turduckens int

func (t turduckens) MarshalLogArray(enc ArrayEncoder) error {
var errs multierror.Error
var err error
tur := turducken{}
for i := 0; i < int(t); i++ {
errs = errs.Append(enc.AppendObject(tur))
err = multierr.Append(err, enc.AppendObject(tur))
}
return errs.AsError()
return err
}

type loggable struct{ bool }
Expand Down
14 changes: 7 additions & 7 deletions zapcore/tee.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

package zapcore

import "go.uber.org/zap/internal/multierror"
import "go.uber.org/multierr"

type multiCore []Core

Expand Down Expand Up @@ -65,17 +65,17 @@ func (mc multiCore) Check(ent Entry, ce *CheckedEntry) *CheckedEntry {
}

func (mc multiCore) Write(ent Entry, fields []Field) error {
var errs multierror.Error
var err error
for i := range mc {
errs = errs.Append(mc[i].Write(ent, fields))
err = multierr.Append(err, mc[i].Write(ent, fields))
}
return errs.AsError()
return err
}

func (mc multiCore) Sync() error {
var errs multierror.Error
var err error
for i := range mc {
errs = errs.Append(mc[i].Sync())
err = multierr.Append(err, mc[i].Sync())
}
return errs.AsError()
return err
}
14 changes: 7 additions & 7 deletions zapcore/write_syncer.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import (
"io"
"sync"

"go.uber.org/zap/internal/multierror"
"go.uber.org/multierr"
)

// A WriteSyncer is an io.Writer that can also flush any buffered data. Note
Expand Down Expand Up @@ -100,24 +100,24 @@ func NewMultiWriteSyncer(ws ...WriteSyncer) WriteSyncer {
// the smallest number is returned even though Write() is called on
// all of them.
func (ws multiWriteSyncer) Write(p []byte) (int, error) {
var errs multierror.Error
var writeErr error
nWritten := 0
for _, w := range ws {
n, err := w.Write(p)
errs = errs.Append(err)
writeErr = multierr.Append(writeErr, err)
if nWritten == 0 && n != 0 {
nWritten = n
} else if n < nWritten {
nWritten = n
}
}
return nWritten, errs.AsError()
return nWritten, writeErr
}

func (ws multiWriteSyncer) Sync() error {
var errs multierror.Error
var err error
for _, w := range ws {
errs = errs.Append(w.Sync())
err = multierr.Append(err, w.Sync())
}
return errs.AsError()
return err
}

0 comments on commit e15639d

Please sign in to comment.