Skip to content

Commit

Permalink
*: skip logging if logger is discardLogger
Browse files Browse the repository at this point in the history
If there is no logger defined (discardLogger), skip logging altogether for
highly frequent called methods (Put, Delete, CreateBucket,
CreateBucketIfNotExists, DeleteBucket, Begin, Commit, Open, MoveBucket, Sync).

Signed-off-by: Ivan Valdes <ivan@vald.es>
  • Loading branch information
ivanvc committed Apr 29, 2024
1 parent 2112e9c commit 8eaa55b
Show file tree
Hide file tree
Showing 3 changed files with 145 additions and 100 deletions.
125 changes: 69 additions & 56 deletions bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,15 +146,16 @@ func (b *Bucket) openBucket(value []byte) *Bucket {
// Returns an error if the key already exists, if the bucket name is blank, or if the bucket name is too long.
// The bucket instance is only valid for the lifetime of the transaction.
func (b *Bucket) CreateBucket(key []byte) (rb *Bucket, err error) {
lg := b.tx.db.Logger()
lg.Debugf("Creating bucket %q", string(key))
defer func() {
if err != nil {
lg.Errorf("Creating bucket %q failed: %v", string(key), err)
} else {
lg.Debugf("Creating bucket %q successfully", string(key))
}
}()
if lg := b.tx.db.Logger(); lg != discardLogger {
lg.Debugf("Creating bucket %q", key)
defer func() {
if err != nil {
lg.Errorf("Creating bucket %q failed: %v", key, err)
} else {
lg.Debugf("Creating bucket %q successfully", key)
}
}()
}
if b.tx.db == nil {
return nil, errors.ErrTxClosed
} else if !b.tx.writable {
Expand Down Expand Up @@ -202,15 +203,16 @@ func (b *Bucket) CreateBucket(key []byte) (rb *Bucket, err error) {
// Returns an error if the bucket name is blank, or if the bucket name is too long.
// The bucket instance is only valid for the lifetime of the transaction.
func (b *Bucket) CreateBucketIfNotExists(key []byte) (rb *Bucket, err error) {
lg := b.tx.db.Logger()
lg.Debugf("Creating bucket if not exist %q", string(key))
defer func() {
if err != nil {
lg.Errorf("Creating bucket if not exist %q failed: %v", string(key), err)
} else {
lg.Debugf("Creating bucket if not exist %q successfully", string(key))
}
}()
if lg := b.tx.db.Logger(); lg != discardLogger {
lg.Debugf("Creating bucket if not exist %q", key)
defer func() {
if err != nil {
lg.Errorf("Creating bucket if not exist %q failed: %v", key, err)
} else {
lg.Debugf("Creating bucket if not exist %q successfully", key)
}
}()
}

if b.tx.db == nil {
return nil, errors.ErrTxClosed
Expand Down Expand Up @@ -269,15 +271,16 @@ func (b *Bucket) CreateBucketIfNotExists(key []byte) (rb *Bucket, err error) {
// DeleteBucket deletes a bucket at the given key.
// Returns an error if the bucket does not exist, or if the key represents a non-bucket value.
func (b *Bucket) DeleteBucket(key []byte) (err error) {
lg := b.tx.db.Logger()
lg.Debugf("Deleting bucket %q", string(key))
defer func() {
if err != nil {
lg.Errorf("Deleting bucket %q failed: %v", string(key), err)
} else {
lg.Debugf("Deleting bucket %q successfully", string(key))
}
}()
if lg := b.tx.db.Logger(); lg != discardLogger {
lg.Debugf("Deleting bucket %q", key)
defer func() {
if err != nil {
lg.Errorf("Deleting bucket %q failed: %v", key, err)
} else {
lg.Debugf("Deleting bucket %q successfully", key)
}
}()
}

if b.tx.db == nil {
return errors.ErrTxClosed
Expand Down Expand Up @@ -332,14 +335,16 @@ func (b *Bucket) DeleteBucket(key []byte) (err error) {
// 4. the source and destination buckets are the same.
func (b *Bucket) MoveBucket(key []byte, dstBucket *Bucket) (err error) {
lg := b.tx.db.Logger()
lg.Debugf("Moving bucket %q", string(key))
defer func() {
if err != nil {
lg.Errorf("Moving bucket %q failed: %v", string(key), err)
} else {
lg.Debugf("Moving bucket %q successfully", string(key))
}
}()
if lg != discardLogger {
lg.Debugf("Moving bucket %q", key)
defer func() {
if err != nil {
lg.Errorf("Moving bucket %q failed: %v", key, err)
} else {
lg.Debugf("Moving bucket %q successfully", key)
}
}()
}

if b.tx.db == nil || dstBucket.tx.db == nil {
return errors.ErrTxClosed
Expand All @@ -362,14 +367,18 @@ func (b *Bucket) MoveBucket(key []byte, dstBucket *Bucket) (err error) {
if !bytes.Equal(newKey, k) {
return errors.ErrBucketNotFound
} else if (flags & common.BucketLeafFlag) == 0 {
lg.Errorf("An incompatible key %s exists in the source bucket", string(newKey))
if lg != discardLogger {
lg.Errorf("An incompatible key %s exists in the source bucket", newKey)
}
return errors.ErrIncompatibleValue
}

// Do nothing (return true directly) if the source bucket and the
// destination bucket are actually the same bucket.
if b == dstBucket || (b.RootPage() == dstBucket.RootPage() && b.RootPage() != 0) {
lg.Errorf("The source bucket (%s) and the target bucket (%s) are the same bucket", b.String(), dstBucket.String())
if lg != discardLogger {
lg.Errorf("The source bucket (%s) and the target bucket (%s) are the same bucket", b, dstBucket)
}
return errors.ErrSameBuckets
}

Expand All @@ -382,7 +391,9 @@ func (b *Bucket) MoveBucket(key []byte, dstBucket *Bucket) (err error) {
if (flags & common.BucketLeafFlag) != 0 {
return errors.ErrBucketExists
}
lg.Errorf("An incompatible key %s exists in the target bucket", string(newKey))
if lg != discardLogger {
lg.Errorf("An incompatible key %s exists in the target bucket", newKey)
}
return errors.ErrIncompatibleValue
}

Expand Down Expand Up @@ -445,15 +456,16 @@ func (b *Bucket) Get(key []byte) []byte {
// Supplied value must remain valid for the life of the transaction.
// Returns an error if the bucket was created from a read-only transaction, if the key is blank, if the key is too large, or if the value is too large.
func (b *Bucket) Put(key []byte, value []byte) (err error) {
lg := b.tx.db.Logger()
lg.Debugf("Putting key %q", string(key))
defer func() {
if err != nil {
lg.Errorf("Putting key %q failed: %v", string(key), err)
} else {
lg.Debugf("Putting key %q successfully", string(key))
}
}()
if lg := b.tx.db.Logger(); lg != discardLogger {
lg.Debugf("Putting key %q", key)
defer func() {
if err != nil {
lg.Errorf("Putting key %q failed: %v", key, err)
} else {
lg.Debugf("Putting key %q successfully", key)
}
}()
}
if b.tx.db == nil {
return errors.ErrTxClosed
} else if !b.Writable() {
Expand Down Expand Up @@ -491,15 +503,16 @@ func (b *Bucket) Put(key []byte, value []byte) (err error) {
// If the key does not exist then nothing is done and a nil error is returned.
// Returns an error if the bucket was created from a read-only transaction.
func (b *Bucket) Delete(key []byte) (err error) {
lg := b.tx.db.Logger()
lg.Debugf("Deleting key %q", string(key))
defer func() {
if err != nil {
lg.Errorf("Deleting key %q failed: %v", string(key), err)
} else {
lg.Debugf("Deleting key %q successfully", string(key))
}
}()
if lg := b.tx.db.Logger(); lg != discardLogger {
lg.Debugf("Deleting key %q", key)
defer func() {
if err != nil {
lg.Errorf("Deleting key %q failed: %v", key, err)
} else {
lg.Debugf("Deleting key %q successfully", key)
}
}()
}

if b.tx.db == nil {
return errors.ErrTxClosed
Expand Down
82 changes: 51 additions & 31 deletions db.go
Original file line number Diff line number Diff line change
Expand Up @@ -204,14 +204,16 @@ func Open(path string, mode os.FileMode, options *Options) (db *DB, err error) {
}

lg := db.Logger()
lg.Infof("Opening db file (%s) with mode %x and with options: %s", path, mode, options)
defer func() {
if err != nil {
lg.Errorf("Opening bbolt db (%s) failed: %v", path, err)
} else {
lg.Infof("Opening bbolt db (%s) successfully", path)
}
}()
if lg != discardLogger {
lg.Infof("Opening db file (%s) with mode %x and with options: %s", path, mode, options)
defer func() {
if err != nil {
lg.Errorf("Opening bbolt db (%s) failed: %v", path, err)
} else {
lg.Infof("Opening bbolt db (%s) successfully", path)
}
}()
}

flag := os.O_RDWR
if options.ReadOnly {
Expand All @@ -231,7 +233,9 @@ func Open(path string, mode os.FileMode, options *Options) (db *DB, err error) {
// Open data file and separate sync handler for metadata writes.
if db.file, err = db.openFile(path, flag, mode); err != nil {
_ = db.close()
lg.Errorf("failed to open db file (%s): %v", path, err)
if lg != discardLogger {
lg.Errorf("failed to open db file (%s): %v", path, err)
}
return nil, err
}
db.path = db.file.Name()
Expand All @@ -245,7 +249,9 @@ func Open(path string, mode os.FileMode, options *Options) (db *DB, err error) {
// hold a lock at the same time) otherwise (options.ReadOnly is set).
if err = flock(db, !db.readOnly, options.Timeout); err != nil {
_ = db.close()
lg.Errorf("failed to lock db file (%s), readonly: %t, error: %v", path, db.readOnly, err)
if lg != discardLogger {
lg.Errorf("failed to lock db file (%s), readonly: %t, error: %v", path, db.readOnly, err)
}
return nil, err
}

Expand All @@ -260,21 +266,27 @@ func Open(path string, mode os.FileMode, options *Options) (db *DB, err error) {
// Initialize the database if it doesn't exist.
if info, statErr := db.file.Stat(); statErr != nil {
_ = db.close()
lg.Errorf("failed to get db file's stats (%s): %v", path, err)
if lg != discardLogger {
lg.Errorf("failed to get db file's stats (%s): %v", path, err)
}
return nil, statErr
} else if info.Size() == 0 {
// Initialize new files with meta pages.
if err = db.init(); err != nil {
// clean up file descriptor on initialization fail
_ = db.close()
lg.Errorf("failed to initialize db file (%s): %v", path, err)
if lg != discardLogger {
lg.Errorf("failed to initialize db file (%s): %v", path, err)
}
return nil, err
}
} else {
// try to get the page size from the metadata pages
if db.pageSize, err = db.getPageSize(); err != nil {
_ = db.close()
lg.Errorf("failed to get page size from db file (%s): %v", path, err)
if lg != discardLogger {
lg.Errorf("failed to get page size from db file (%s): %v", path, err)
}
return nil, err
}
}
Expand All @@ -289,7 +301,9 @@ func Open(path string, mode os.FileMode, options *Options) (db *DB, err error) {
// Memory map the data file.
if err = db.mmap(options.InitialMmapSize); err != nil {
_ = db.close()
lg.Errorf("failed to map db file (%s): %v", path, err)
if lg != discardLogger {
lg.Errorf("failed to map db file (%s): %v", path, err)
}
return nil, err
}

Expand All @@ -309,7 +323,9 @@ func Open(path string, mode os.FileMode, options *Options) (db *DB, err error) {
txErr = tx.Commit()
}
if txErr != nil {
lg.Errorf("starting readwrite transaction failed: %v", txErr)
if lg != discardLogger {
lg.Errorf("starting readwrite transaction failed: %v", txErr)
}
_ = db.close()
return nil, txErr
}
Expand Down Expand Up @@ -739,14 +755,16 @@ func (db *DB) close() error {
// IMPORTANT: You must close read-only transactions after you are finished or
// else the database will not reclaim old pages.
func (db *DB) Begin(writable bool) (t *Tx, err error) {
db.Logger().Debugf("Starting a new transaction [writable: %t]", writable)
defer func() {
if err != nil {
db.Logger().Errorf("Starting a new transaction [writable: %t] failed: %v", writable, err)
} else {
db.Logger().Debugf("Starting a new transaction [writable: %t] successfully", writable)
}
}()
if lg := db.Logger(); lg != discardLogger {
lg.Debugf("Starting a new transaction [writable: %t]", writable)
defer func() {
if err != nil {
lg.Errorf("Starting a new transaction [writable: %t] failed: %v", writable, err)
} else {
lg.Debugf("Starting a new transaction [writable: %t] successfully", writable)
}
}()
}

if writable {
return db.beginRWTx()
Expand Down Expand Up @@ -1095,14 +1113,16 @@ func safelyCall(fn func(*Tx) error, tx *Tx) (err error) {
// This is not necessary under normal operation, however, if you use NoSync
// then it allows you to force the database file to sync against the disk.
func (db *DB) Sync() (err error) {
db.Logger().Debug("Syncing bbolt db (%s)", db.path)
defer func() {
if err != nil {
db.Logger().Errorf("[GOOS: %s, GOARCH: %s] syncing bbolt db (%s) failed: %v", runtime.GOOS, runtime.GOARCH, db.path, err)
} else {
db.Logger().Debugf("Syncing bbolt db (%s) successfully", db.path)
}
}()
if lg := db.Logger(); lg != discardLogger {
lg.Debug("Syncing bbolt db (%s)", db.path)
defer func() {
if err != nil {
lg.Errorf("[GOOS: %s, GOARCH: %s] syncing bbolt db (%s) failed: %v", runtime.GOOS, runtime.GOARCH, db.path, err)
} else {
lg.Debugf("Syncing bbolt db (%s) successfully", db.path)
}
}()
}

return fdatasync(db)
}
Expand Down
Loading

0 comments on commit 8eaa55b

Please sign in to comment.