From 8955492f8bbc56843f28ef7196797ffeae55c7db Mon Sep 17 00:00:00 2001 From: Madhu Rajanna Date: Thu, 14 Jun 2018 12:46:35 +0530 Subject: [PATCH] log with reqid and transaction id in daemon framework Signed-off-by: Madhu Rajanna --- glusterd2/brick/glusterfsd.go | 8 ++--- .../commands/snapshot/snapshot-activate.go | 4 +-- .../commands/snapshot/snapshot-deactivate.go | 4 +-- .../commands/volumes/volume-expand-txn.go | 4 +-- glusterd2/commands/volumes/volume-option.go | 5 ++-- glusterd2/commands/volumes/volume-start.go | 4 +-- .../commands/volumes/volume-statedump.go | 4 +-- glusterd2/commands/volumes/volume-stop.go | 4 +-- glusterd2/daemon/daemon.go | 30 +++++++++---------- glusterd2/main.go | 1 - glusterd2/snapshot/snapshot-utils.go | 6 ++-- glusterd2/xlator/actors.go | 10 ++++--- plugins/bitrot/transactions.go | 20 ++++++------- plugins/georeplication/transactions.go | 8 ++--- plugins/glustershd/actor.go | 14 +++++---- plugins/quota/rest.go | 2 +- plugins/rebalance/transaction.go | 2 +- 17 files changed, 67 insertions(+), 63 deletions(-) diff --git a/glusterd2/brick/glusterfsd.go b/glusterd2/brick/glusterfsd.go index baa143e0a..8a4400319 100644 --- a/glusterd2/brick/glusterfsd.go +++ b/glusterd2/brick/glusterfsd.go @@ -167,7 +167,7 @@ func errorContainsErrno(err error, errno syscall.Errno) bool { // These functions are used in vol-create, vol-expand and vol-shrink (TBD) //StartBrick starts glusterfsd process -func (b Brickinfo) StartBrick() error { +func (b Brickinfo) StartBrick(logger log.FieldLogger) error { brickDaemon, err := NewGlusterfsd(b) if err != nil { @@ -175,7 +175,7 @@ func (b Brickinfo) StartBrick() error { } for i := 0; i < BrickStartMaxRetries; i++ { - err = daemon.Start(brickDaemon, true) + err = daemon.Start(brickDaemon, true, logger) if err != nil { if errorContainsErrno(err, syscall.EADDRINUSE) || errorContainsErrno(err, anotherEADDRINUSE) { // Retry iff brick failed to start because of port being in use. @@ -238,13 +238,13 @@ func (b Brickinfo) TerminateBrick() error { } //StopBrick will stop glusterfsd process -func (b Brickinfo) StopBrick() error { +func (b Brickinfo) StopBrick(logger log.FieldLogger) error { brickDaemon, err := NewGlusterfsd(b) if err != nil { return err } - return daemon.Stop(brickDaemon, true) + return daemon.Stop(brickDaemon, true, logger) } //CreateBrickSizeInfo parses size information for response diff --git a/glusterd2/commands/snapshot/snapshot-activate.go b/glusterd2/commands/snapshot/snapshot-activate.go index 021e96b2f..896188c0a 100644 --- a/glusterd2/commands/snapshot/snapshot-activate.go +++ b/glusterd2/commands/snapshot/snapshot-activate.go @@ -78,7 +78,7 @@ func activateSnapshot(c transaction.TxnCtx) error { return err } - err = snapshot.ActivateDeactivateFunc(snapinfo, brickinfos, activate) + err = snapshot.ActivateDeactivateFunc(snapinfo, brickinfos, activate, c.Logger()) if err != nil { return err } @@ -133,7 +133,7 @@ func rollbackActivateSnapshot(c transaction.TxnCtx) error { return err } - err = snapshot.ActivateDeactivateFunc(snapinfo, brickinfos, activate) + err = snapshot.ActivateDeactivateFunc(snapinfo, brickinfos, activate, c.Logger()) return err diff --git a/glusterd2/commands/snapshot/snapshot-deactivate.go b/glusterd2/commands/snapshot/snapshot-deactivate.go index 86eb33e4f..c7ea4067e 100644 --- a/glusterd2/commands/snapshot/snapshot-deactivate.go +++ b/glusterd2/commands/snapshot/snapshot-deactivate.go @@ -71,7 +71,7 @@ func deactivateSnapshot(c transaction.TxnCtx) error { return err } - err = snapshot.ActivateDeactivateFunc(snapinfo, brickinfos, activate) + err = snapshot.ActivateDeactivateFunc(snapinfo, brickinfos, activate, c.Logger()) if err != nil { return err } @@ -121,7 +121,7 @@ func rollbackDeactivateSnapshot(c transaction.TxnCtx) error { return err } - err = snapshot.ActivateDeactivateFunc(snapinfo, brickinfos, activate) + err = snapshot.ActivateDeactivateFunc(snapinfo, brickinfos, activate, c.Logger()) return err diff --git a/glusterd2/commands/volumes/volume-expand-txn.go b/glusterd2/commands/volumes/volume-expand-txn.go index ff8620c44..9eecc0c23 100644 --- a/glusterd2/commands/volumes/volume-expand-txn.go +++ b/glusterd2/commands/volumes/volume-expand-txn.go @@ -102,7 +102,7 @@ func startBricksOnExpand(c transaction.TxnCtx) error { "brick": b.String(), }).Info("Starting brick") - if err := b.StartBrick(); err != nil { + if err := b.StartBrick(c.Logger()); err != nil { return err } } @@ -129,7 +129,7 @@ func undoStartBricksOnExpand(c transaction.TxnCtx) error { "brick": b.String(), }).Info("volume expand failed, stopping brick") - if err := b.StopBrick(); err != nil { + if err := b.StopBrick(c.Logger()); err != nil { c.Logger().WithFields(log.Fields{ "error": err, "volume": b.VolumeName, diff --git a/glusterd2/commands/volumes/volume-option.go b/glusterd2/commands/volumes/volume-option.go index ca842cde6..b74403d13 100644 --- a/glusterd2/commands/volumes/volume-option.go +++ b/glusterd2/commands/volumes/volume-option.go @@ -16,6 +16,7 @@ import ( "github.com/gorilla/mux" "github.com/pborman/uuid" + log "github.com/sirupsen/logrus" ) func optionSetValidate(c transaction.TxnCtx) error { @@ -90,7 +91,7 @@ func xlatorAction(c transaction.TxnCtx, txnOp txnOpType) error { return err } - var fn func(*volume.Volinfo, string, string) error + var fn func(*volume.Volinfo, string, string, log.FieldLogger) error for k, v := range req.Options { _, xl, key, err := options.SplitKey(k) if err != nil { @@ -106,7 +107,7 @@ func xlatorAction(c transaction.TxnCtx, txnOp txnOpType) error { } else { fn = xltr.Actor.Undo } - if err := fn(&volinfo, key, v); err != nil { + if err := fn(&volinfo, key, v, c.Logger()); err != nil { return err } } diff --git a/glusterd2/commands/volumes/volume-start.go b/glusterd2/commands/volumes/volume-start.go index af1189421..e0e4b4cfc 100644 --- a/glusterd2/commands/volumes/volume-start.go +++ b/glusterd2/commands/volumes/volume-start.go @@ -29,7 +29,7 @@ func startAllBricks(c transaction.TxnCtx) error { "brick": b.String(), }).Info("Starting brick") - if err := b.StartBrick(); err != nil { + if err := b.StartBrick(c.Logger()); err != nil { if err == errors.ErrProcessAlreadyRunning { continue } @@ -53,7 +53,7 @@ func stopAllBricks(c transaction.TxnCtx) error { "brick": b.String(), }).Info("volume start failed, stopping brick") - if err := b.StopBrick(); err != nil { + if err := b.StopBrick(c.Logger()); err != nil { return err } } diff --git a/glusterd2/commands/volumes/volume-statedump.go b/glusterd2/commands/volumes/volume-statedump.go index 0a18f69e7..af294241f 100644 --- a/glusterd2/commands/volumes/volume-statedump.go +++ b/glusterd2/commands/volumes/volume-statedump.go @@ -59,7 +59,7 @@ func takeStatedump(c transaction.TxnCtx) error { if err != nil { return err } - if err := daemon.Signal(d, unix.SIGUSR1); err != nil { + if err := daemon.Signal(d, unix.SIGUSR1, c.Logger()); err != nil { // only log, don't error out c.Logger().WithError(err).WithField( "daemon", d.ID()).Error("Failed to take statedump for daemon") @@ -72,7 +72,7 @@ func takeStatedump(c transaction.TxnCtx) error { if err != nil { return err } - if err := daemon.Signal(d, unix.SIGUSR1); err != nil { + if err := daemon.Signal(d, unix.SIGUSR1, c.Logger()); err != nil { // only log, don't error out c.Logger().WithError(err).WithField( "daemon", d.ID()).Error("Failed to take statedump for daemon") diff --git a/glusterd2/commands/volumes/volume-stop.go b/glusterd2/commands/volumes/volume-stop.go index 96c0b3107..e1c1bb440 100644 --- a/glusterd2/commands/volumes/volume-stop.go +++ b/glusterd2/commands/volumes/volume-stop.go @@ -37,7 +37,7 @@ func stopBricks(c transaction.TxnCtx) error { if err != nil { c.Logger().WithError(err).WithField( "brick", b.String()).Error("failed to connect to brick, sending SIGTERM") - daemon.Stop(brickDaemon, false) + daemon.Stop(brickDaemon, false, c.Logger()) continue } @@ -50,7 +50,7 @@ func stopBricks(c transaction.TxnCtx) error { if err != nil || rsp.OpRet != 0 { c.Logger().WithError(err).WithField( "brick", b.String()).Error("failed to send terminate RPC, sending SIGTERM") - daemon.Stop(brickDaemon, false) + daemon.Stop(brickDaemon, false, c.Logger()) continue } diff --git a/glusterd2/daemon/daemon.go b/glusterd2/daemon/daemon.go index 06fc3d676..5d1825d6c 100644 --- a/glusterd2/daemon/daemon.go +++ b/glusterd2/daemon/daemon.go @@ -51,9 +51,9 @@ type Daemon interface { // is already running, errors.ErrProcessAlreadyRunning is returned. // When wait == true, this function can be used to spawn short term processes // which will be waited on for completion before this function returns. -func Start(d Daemon, wait bool) error { +func Start(d Daemon, wait bool, logger log.FieldLogger) error { - log.WithFields(log.Fields{ + logger.WithFields(log.Fields{ "name": d.Name(), "path": d.Path(), "args": strings.Join(d.Args(), " "), @@ -81,7 +81,7 @@ func Start(d Daemon, wait bool) error { if wait == true { // Wait for the child to exit errStatus := cmd.Wait() - log.WithFields(log.Fields{ + logger.WithFields(log.Fields{ "pid": cmd.Process.Pid, "status": errStatus, }).Debug("Child exited") @@ -97,7 +97,7 @@ func Start(d Daemon, wait bool) error { // daemon tell glusterd2 that it's up and ready. pid, err = ReadPidFromFile(d.PidFile()) if err != nil { - log.WithFields(log.Fields{ + logger.WithFields(log.Fields{ "pidfile": d.PidFile(), "error": err.Error(), }).Error("Could not read pidfile") @@ -105,7 +105,7 @@ func Start(d Daemon, wait bool) error { return err } - log.WithFields(log.Fields{ + logger.WithFields(log.Fields{ "name": d.Name(), "pid": pid, }).Debug("Started daemon successfully") @@ -116,7 +116,7 @@ func Start(d Daemon, wait bool) error { // exit status. This should not let it be a zombie. go func() { err := cmd.Wait() - log.WithFields(log.Fields{ + logger.WithFields(log.Fields{ "name": d.Name(), "pid": cmd.Process.Pid, "status": err, @@ -126,7 +126,7 @@ func Start(d Daemon, wait bool) error { // Save daemon information in the store so it can be restarted if err := saveDaemon(d); err != nil { - log.WithField("name", d.Name()).WithError(err).Warn("failed to save daemon information into store, daemon may not be restarted on GlusterD restart") + logger.WithField("name", d.Name()).WithError(err).Warn("failed to save daemon information into store, daemon may not be restarted on GlusterD restart") } return nil @@ -136,7 +136,7 @@ func Start(d Daemon, wait bool) error { // terminate the process gracefully or forcefully. // When force == false, a SIGTERM signal is sent to the daemon. // When force == true, a SIGKILL signal is sent to the daemon. -func Stop(d Daemon, force bool) error { +func Stop(d Daemon, force bool, logger log.FieldLogger) error { // It is assumed that the process d has written to pidfile pid, err := ReadPidFromFile(d.PidFile()) @@ -149,7 +149,7 @@ func Stop(d Daemon, force bool) error { return err } - log.WithFields(log.Fields{ + logger.WithFields(log.Fields{ "name": d.Name(), "pid": pid, }).Debug("Stopping daemon.") @@ -165,7 +165,7 @@ func Stop(d Daemon, force bool) error { _ = os.Remove(d.PidFile()) if err != nil { - log.WithFields(log.Fields{ + logger.WithFields(log.Fields{ "name": d.Name(), "pid": pid, }).Error("Stopping daemon failed.") @@ -175,7 +175,7 @@ func Stop(d Daemon, force bool) error { } if err := DelDaemon(d); err != nil { - log.WithFields(log.Fields{ + logger.WithFields(log.Fields{ "name": d.Name(), "pid": pid, }).WithError(err).Warn("failed to delete daemon from store, it may be restarted on GlusterD restart") @@ -197,7 +197,7 @@ func StartAllDaemons() { } for _, d := range ds { - if err := Start(d, true); err != nil { + if err := Start(d, true, log.StandardLogger()); err != nil { log.WithField("name", d.Name()).WithError(err).Warn("failed to start daemon") } } @@ -206,7 +206,7 @@ func StartAllDaemons() { // Signal function reads the PID from path returned by PidFile() and // sends the signal to that PID -func Signal(d Daemon, sig syscall.Signal) error { +func Signal(d Daemon, sig syscall.Signal, logger log.FieldLogger) error { // It is assumed that the process d has written to pidfile pid, err := ReadPidFromFile(d.PidFile()) @@ -219,7 +219,7 @@ func Signal(d Daemon, sig syscall.Signal) error { return err } - log.WithFields(log.Fields{ + logger.WithFields(log.Fields{ "name": d.Name(), "pid": pid, "signal": sig, @@ -227,7 +227,7 @@ func Signal(d Daemon, sig syscall.Signal) error { err = process.Signal(sig) if err != nil { - log.WithFields(log.Fields{ + logger.WithFields(log.Fields{ "name": d.Name(), "pid": pid, "signal": sig, diff --git a/glusterd2/main.go b/glusterd2/main.go index f0afd4892..5e397fcc0 100644 --- a/glusterd2/main.go +++ b/glusterd2/main.go @@ -28,7 +28,6 @@ import ( ) func main() { - if err := gdctx.SetHostnameAndIP(); err != nil { log.WithError(err).Fatal("Failed to get and set hostname or IP") } diff --git a/glusterd2/snapshot/snapshot-utils.go b/glusterd2/snapshot/snapshot-utils.go index 1f7426631..a21c997e3 100644 --- a/glusterd2/snapshot/snapshot-utils.go +++ b/glusterd2/snapshot/snapshot-utils.go @@ -78,7 +78,7 @@ func MountSnapBrickDirectory(vol *volume.Volinfo, brickinfo *brick.Brickinfo) er } //ActivateDeactivateFunc uses to activate and deactivate -func ActivateDeactivateFunc(snapinfo *Snapinfo, b []brick.Brickinfo, activate bool) error { +func ActivateDeactivateFunc(snapinfo *Snapinfo, b []brick.Brickinfo, activate bool, logger log.FieldLogger) error { volinfo := &snapinfo.SnapVolinfo switch volinfo.State == volume.VolStarted { case true: @@ -96,14 +96,14 @@ func ActivateDeactivateFunc(snapinfo *Snapinfo, b []brick.Brickinfo, activate bo if err := MountSnapBrickDirectory(volinfo, &b[i]); err != nil { return err } - if err := b[i].StartBrick(); err != nil { + if err := b[i].StartBrick(logger); err != nil { return err } } else { var err error if err = b[i].TerminateBrick(); err != nil { - if err = b[i].StopBrick(); err != nil { + if err = b[i].StopBrick(logger); err != nil { return err } } diff --git a/glusterd2/xlator/actors.go b/glusterd2/xlator/actors.go index 362dee906..78e246e23 100644 --- a/glusterd2/xlator/actors.go +++ b/glusterd2/xlator/actors.go @@ -2,6 +2,8 @@ package xlator import ( "github.com/gluster/glusterd2/glusterd2/volume" + + log "github.com/sirupsen/logrus" ) var optionActors = make(map[string]OptionActor) @@ -12,11 +14,11 @@ var optionActors = make(map[string]OptionActor) // have the xlator/feature specific logic executed during volume set. An example // of such logic is the task of starting and stopping daemon. type OptionActor interface { - // Do function takes volinfo, option key, option value. - Do(*volume.Volinfo, string, string) error - // Undo function takes volinfo, option key, option value. The returned + // Do function takes volinfo, option key, option value, logger. + Do(*volume.Volinfo, string, string, log.FieldLogger) error + // Undo function takes volinfo, option key, option value and logger. The returned // error is currently ignored. - Undo(*volume.Volinfo, string, string) error + Undo(*volume.Volinfo, string, string, log.FieldLogger) error } // RegisterOptionActor registers a xlator's type implementing OptionActor diff --git a/plugins/bitrot/transactions.go b/plugins/bitrot/transactions.go index 02894da6e..61aa35cda 100644 --- a/plugins/bitrot/transactions.go +++ b/plugins/bitrot/transactions.go @@ -42,7 +42,7 @@ func IsBitrotAffectedNode() bool { } // ManageBitd manages the bitrot daemon bitd. It stops or stops/starts the daemon based on disable or enable respectively. -func ManageBitd(bitrotDaemon *Bitd) error { +func ManageBitd(bitrotDaemon *Bitd, logger log.FieldLogger) error { var err error AffectedNode := IsBitrotAffectedNode() @@ -50,11 +50,11 @@ func ManageBitd(bitrotDaemon *Bitd) error { if !AffectedNode { // This condition is for disable // TODO: Need to ignore errors where process is already running. - daemon.Stop(bitrotDaemon, true) + daemon.Stop(bitrotDaemon, true, logger) } else { //TODO: Handle ENOENT of pidFile - err = daemon.Stop(bitrotDaemon, true) - err = daemon.Start(bitrotDaemon, true) + err = daemon.Stop(bitrotDaemon, true, logger) + err = daemon.Start(bitrotDaemon, true, logger) if err != nil { return err } @@ -63,7 +63,7 @@ func ManageBitd(bitrotDaemon *Bitd) error { } // ManageScrubd manages the scrubber daemon. It stops or stops/starts the daemon based on disable or enable respectively. -func ManageScrubd() error { +func ManageScrubd(logger log.FieldLogger) error { AffectedNode := IsBitrotAffectedNode() scrubDaemon, err := newScrubd() if err != nil { @@ -73,11 +73,11 @@ func ManageScrubd() error { if !AffectedNode { // This condition is for disable // TODO: Need to ignore errors where process is already running. - daemon.Stop(scrubDaemon, true) + daemon.Stop(scrubDaemon, true, logger) } else { //TODO: Handle ENOENT of pidFile - daemon.Stop(scrubDaemon, true) - err = daemon.Start(scrubDaemon, true) + daemon.Stop(scrubDaemon, true, logger) + err = daemon.Start(scrubDaemon, true, logger) if err != nil { return err } @@ -92,12 +92,12 @@ func txnBitrotEnableDisable(c transaction.TxnCtx) error { } // Manange bitd and scrub daemons - err = ManageBitd(bitrotDaemon) + err = ManageBitd(bitrotDaemon, c.Logger()) if err != nil { goto error } - err = ManageScrubd() + err = ManageScrubd(c.Logger()) if err != nil { goto error } diff --git a/plugins/georeplication/transactions.go b/plugins/georeplication/transactions.go index e6ef6c768..be52a768f 100644 --- a/plugins/georeplication/transactions.go +++ b/plugins/georeplication/transactions.go @@ -79,13 +79,13 @@ func gsyncdAction(c transaction.TxnCtx, action actionType) error { if err != nil { return err } - err = daemon.Start(gsyncdDaemon, true) + err = daemon.Start(gsyncdDaemon, true, c.Logger()) case actionStop: - err = daemon.Stop(gsyncdDaemon, true) + err = daemon.Stop(gsyncdDaemon, true, c.Logger()) case actionPause: - err = daemon.Signal(gsyncdDaemon, syscall.SIGSTOP) + err = daemon.Signal(gsyncdDaemon, syscall.SIGSTOP, c.Logger()) case actionResume: - err = daemon.Signal(gsyncdDaemon, syscall.SIGCONT) + err = daemon.Signal(gsyncdDaemon, syscall.SIGCONT, c.Logger()) } return err diff --git a/plugins/glustershd/actor.go b/plugins/glustershd/actor.go index f8c5cef44..641a91c05 100644 --- a/plugins/glustershd/actor.go +++ b/plugins/glustershd/actor.go @@ -7,6 +7,8 @@ import ( "github.com/gluster/glusterd2/glusterd2/volume" "github.com/gluster/glusterd2/glusterd2/xlator" gderrors "github.com/gluster/glusterd2/pkg/errors" + + log "github.com/sirupsen/logrus" ) var names = [...]string{"replicate", "afr"} @@ -17,7 +19,7 @@ const ( type shdActor struct{} -func (actor *shdActor) Do(v *volume.Volinfo, key string, value string) error { +func (actor *shdActor) Do(v *volume.Volinfo, key string, value string, logger log.FieldLogger) error { if key != selfHealKey { return nil } @@ -29,7 +31,7 @@ func (actor *shdActor) Do(v *volume.Volinfo, key string, value string) error { switch value { case "on": if isHealEnabled(v) { - err = daemon.Start(glustershDaemon, true) + err = daemon.Start(glustershDaemon, true, logger) if err != gderrors.ErrProcessAlreadyRunning || err != nil { return err } @@ -41,14 +43,14 @@ func (actor *shdActor) Do(v *volume.Volinfo, key string, value string) error { return err } if !isVolRunning { - return daemon.Stop(glustershDaemon, true) + return daemon.Stop(glustershDaemon, true, logger) } } } return nil } -func (actor *shdActor) Undo(v *volume.Volinfo, key string, value string) error { +func (actor *shdActor) Undo(v *volume.Volinfo, key string, value string, logger log.FieldLogger) error { if key != selfHealKey { return nil } @@ -64,7 +66,7 @@ func (actor *shdActor) Undo(v *volume.Volinfo, key string, value string) error { if v.State != volume.VolStarted { return errors.New("volume should be in started state") } - err = daemon.Start(glustershDaemon, true) + err = daemon.Start(glustershDaemon, true, logger) if err != gderrors.ErrProcessAlreadyRunning || err != nil { return err } @@ -76,7 +78,7 @@ func (actor *shdActor) Undo(v *volume.Volinfo, key string, value string) error { return err } if !isVolRunning { - return daemon.Stop(glustershDaemon, true) + return daemon.Stop(glustershDaemon, true, logger) } } } diff --git a/plugins/quota/rest.go b/plugins/quota/rest.go index 242fec950..46b5e6ad5 100644 --- a/plugins/quota/rest.go +++ b/plugins/quota/rest.go @@ -31,7 +31,7 @@ func QuotadStart(c transaction.TxnCtx) error { if err != nil { return err } - err = daemon.Start(quotadDaemon, true) + err = daemon.Start(quotadDaemon, true, c.Logger()) if err == errors.ErrProcessAlreadyRunning { c.Logger().WithError(err).Warn("Quota Daemon is already running.") return nil diff --git a/plugins/rebalance/transaction.go b/plugins/rebalance/transaction.go index d14921f3f..9cf4b1e7d 100644 --- a/plugins/rebalance/transaction.go +++ b/plugins/rebalance/transaction.go @@ -37,7 +37,7 @@ func txnRebalanceStart(c transaction.TxnCtx) error { return err } - err = daemon.Start(rebalanceProcess, true) + err = daemon.Start(rebalanceProcess, true, c.Logger()) if err != nil { c.Logger().WithError(err).WithField( "volume", rinfo.Volname).Error("Starting rebalance process failed")