some cleanup on errors and storage packages
diff --git a/leveldb/db.go b/leveldb/db.go
index bf1502e..a8a4395 100644
--- a/leveldb/db.go
+++ b/leveldb/db.go
@@ -525,7 +525,7 @@
}
// Flush memdb and remove obsolete journal file.
- if !ofd.Nil() {
+ if !ofd.Zero() {
if mdb.Len() > 0 {
if _, err := db.s.flushMemdb(rec, mdb, 0); err != nil {
fr.Close()
@@ -624,7 +624,7 @@
}
// Remove the last obsolete journal file.
- if !ofd.Nil() {
+ if !ofd.Zero() {
db.s.stor.Remove(ofd)
}
diff --git a/leveldb/db_util.go b/leveldb/db_util.go
index 7fd386c..7ecd960 100644
--- a/leveldb/db_util.go
+++ b/leveldb/db_util.go
@@ -62,7 +62,7 @@
case storage.TypeManifest:
keep = fd.Num >= db.s.manifestFd.Num
case storage.TypeJournal:
- if !db.frozenJournalFd.Nil() {
+ if !db.frozenJournalFd.Zero() {
keep = fd.Num >= db.frozenJournalFd.Num
} else {
keep = fd.Num >= db.journalFd.Num
diff --git a/leveldb/errors/errors.go b/leveldb/errors/errors.go
index 9a0f6e2..8d6146b 100644
--- a/leveldb/errors/errors.go
+++ b/leveldb/errors/errors.go
@@ -15,6 +15,7 @@
"github.com/syndtr/goleveldb/leveldb/util"
)
+// Common errors.
var (
ErrNotFound = New("leveldb: not found")
ErrReleased = util.ErrReleased
@@ -34,11 +35,10 @@
}
func (e *ErrCorrupted) Error() string {
- if !e.Fd.Nil() {
+ if !e.Fd.Zero() {
return fmt.Sprintf("%v [file=%v]", e.Err, e.Fd)
- } else {
- return e.Err.Error()
}
+ return e.Err.Error()
}
// NewErrCorrupted creates new ErrCorrupted error.
diff --git a/leveldb/session.go b/leveldb/session.go
index c9679b6..769e4a0 100644
--- a/leveldb/session.go
+++ b/leveldb/session.go
@@ -42,7 +42,7 @@
stSeqNum uint64 // last mem compacted seq; need external synchronization
stor storage.Storage
- storLock storage.Lock
+ storLock storage.Locker
o *cachedOptions
icmp *iComparer
tops *tOps
@@ -92,7 +92,7 @@
// Release session lock.
func (s *session) release() {
- s.storLock.Release()
+ s.storLock.Unlock()
}
// Create a new database session; need external synchronization.
diff --git a/leveldb/session_util.go b/leveldb/session_util.go
index 7a095e7..34ad617 100644
--- a/leveldb/session_util.go
+++ b/leveldb/session_util.go
@@ -203,7 +203,7 @@
if s.manifestWriter != nil {
s.manifestWriter.Close()
}
- if !s.manifestFd.Nil() {
+ if !s.manifestFd.Zero() {
s.stor.Remove(s.manifestFd)
}
s.manifestFd = fd
diff --git a/leveldb/storage/file_storage.go b/leveldb/storage/file_storage.go
index cbe1dc1..e53434c 100644
--- a/leveldb/storage/file_storage.go
+++ b/leveldb/storage/file_storage.go
@@ -32,7 +32,7 @@
fs *fileStorage
}
-func (lock *fileStorageLock) Release() {
+func (lock *fileStorageLock) Unlock() {
if lock.fs != nil {
lock.fs.mu.Lock()
defer lock.fs.mu.Unlock()
@@ -116,7 +116,7 @@
return fs, nil
}
-func (fs *fileStorage) Lock() (Lock, error) {
+func (fs *fileStorage) Lock() (Locker, error) {
fs.mu.Lock()
defer fs.mu.Unlock()
if fs.open < 0 {
@@ -323,7 +323,7 @@
}
}
// Don't remove any files if there is no valid CURRENT file.
- if fd.Nil() {
+ if fd.Zero() {
if cerr != nil {
err = cerr
} else {
diff --git a/leveldb/storage/file_storage_test.go b/leveldb/storage/file_storage_test.go
index 7a77f28..28a59ec 100644
--- a/leveldb/storage/file_storage_test.go
+++ b/leveldb/storage/file_storage_test.go
@@ -126,7 +126,7 @@
} else {
t.Logf("storage lock got error: %s (expected)", err)
}
- l.Release()
+ l.Unlock()
_, err = p3.Lock()
if err != nil {
t.Fatal("storage lock failed(2): ", err)
diff --git a/leveldb/storage/mem_storage.go b/leveldb/storage/mem_storage.go
index 9b70e15..9b0421f 100644
--- a/leveldb/storage/mem_storage.go
+++ b/leveldb/storage/mem_storage.go
@@ -18,7 +18,7 @@
ms *memStorage
}
-func (lock *memStorageLock) Release() {
+func (lock *memStorageLock) Unlock() {
ms := lock.ms
ms.mu.Lock()
defer ms.mu.Unlock()
@@ -43,7 +43,7 @@
}
}
-func (ms *memStorage) Lock() (Lock, error) {
+func (ms *memStorage) Lock() (Locker, error) {
ms.mu.Lock()
defer ms.mu.Unlock()
if ms.slock != nil {
@@ -69,7 +69,7 @@
func (ms *memStorage) GetMeta() (FileDesc, error) {
ms.mu.Lock()
defer ms.mu.Unlock()
- if ms.meta.Nil() {
+ if ms.meta.Zero() {
return FileDesc{}, os.ErrNotExist
}
return ms.meta, nil
@@ -78,7 +78,7 @@
func (ms *memStorage) List(ft FileType) ([]FileDesc, error) {
ms.mu.Lock()
var fds []FileDesc
- for x, _ := range ms.files {
+ for x := range ms.files {
fd := unpackFile(x)
if fd.Type&ft != 0 {
fds = append(fds, fd)
diff --git a/leveldb/storage/mem_storage_test.go b/leveldb/storage/mem_storage_test.go
index 7295075..fb03d30 100644
--- a/leveldb/storage/mem_storage_test.go
+++ b/leveldb/storage/mem_storage_test.go
@@ -24,7 +24,7 @@
} else {
t.Logf("storage lock got error: %s (expected)", err)
}
- l.Release()
+ l.Unlock()
_, err = m.Lock()
if err != nil {
t.Fatal("storage lock failed(2): ", err)
diff --git a/leveldb/storage/storage.go b/leveldb/storage/storage.go
index 9b30b67..c16bce6 100644
--- a/leveldb/storage/storage.go
+++ b/leveldb/storage/storage.go
@@ -11,12 +11,12 @@
"errors"
"fmt"
"io"
-
- "github.com/syndtr/goleveldb/leveldb/util"
)
+// FileType represent a file type.
type FileType int
+// File types.
const (
TypeManifest FileType = 1 << iota
TypeJournal
@@ -40,6 +40,7 @@
return fmt.Sprintf("<unknown:%d>", t)
}
+// Common error.
var (
ErrInvalidFile = errors.New("leveldb/storage: invalid file for argument")
ErrLocked = errors.New("leveldb/storage: already locked")
@@ -55,11 +56,10 @@
}
func (e *ErrCorrupted) Error() string {
- if !e.Fd.Nil() {
+ if !e.Fd.Zero() {
return fmt.Sprintf("%v [file=%v]", e.Err, e.Fd)
- } else {
- return e.Err.Error()
}
+ return e.Err.Error()
}
// Syncer is the interface that wraps basic Sync method.
@@ -83,11 +83,12 @@
Syncer
}
-type Lock interface {
- util.Releaser
+// Locker is the interface that wraps Unlock method.
+type Locker interface {
+ Unlock()
}
-// FileDesc is a file descriptor.
+// FileDesc is a 'file descriptor'.
type FileDesc struct {
Type FileType
Num int64
@@ -108,12 +109,12 @@
}
}
-// Nil returns true if fd == (FileDesc{}).
-func (fd FileDesc) Nil() bool {
+// Zero returns true if fd == (FileDesc{}).
+func (fd FileDesc) Zero() bool {
return fd == (FileDesc{})
}
-// FileDescOk returns true if fd is a valid file descriptor.
+// FileDescOk returns true if fd is a valid 'file descriptor'.
func FileDescOk(fd FileDesc) bool {
switch fd.Type {
case TypeManifest:
@@ -126,43 +127,44 @@
return fd.Num >= 0
}
-// Storage is the storage. A storage instance must be goroutine-safe.
+// Storage is the storage. A storage instance must be safe for concurrent use.
type Storage interface {
// Lock locks the storage. Any subsequent attempt to call Lock will fail
// until the last lock released.
- // After use the caller should call the Release method.
- Lock() (Lock, error)
+ // Caller should call Unlock method after use.
+ Lock() (Locker, error)
// Log logs a string. This is used for logging.
// An implementation may write to a file, stdout or simply do nothing.
Log(str string)
- // SetMeta sets to point to the given fd, which then can be acquired using
- // GetMeta method.
- // SetMeta should be implemented in such way that changes should happened
+ // SetMeta store 'file descriptor' that can later be acquired using GetMeta
+ // method. The 'file descriptor' should point to a valid file.
+ // SetMeta should be implemented in such way that changes should happen
// atomically.
SetMeta(fd FileDesc) error
- // GetManifest returns a manifest file.
- // Returns os.ErrNotExist if meta doesn't point to any fd, or point to fd
- // that doesn't exist.
+ // GetMeta returns 'file descriptor' stored in meta. The 'file descriptor'
+ // can be updated using SetMeta method.
+ // Returns os.ErrNotExist if meta doesn't store any 'file descriptor', or
+ // 'file descriptor' point to nonexistent file.
GetMeta() (FileDesc, error)
- // List returns fds that match the given file types.
+ // List returns file descriptors that match the given file types.
// The file types may be OR'ed together.
List(ft FileType) ([]FileDesc, error)
- // Open opens file with the given fd read-only.
+ // Open opens file with the given 'file descriptor' read-only.
// Returns os.ErrNotExist error if the file does not exist.
// Returns ErrClosed if the underlying storage is closed.
Open(fd FileDesc) (Reader, error)
- // Create creates file with the given fd, truncate if already exist and
- // opens write-only.
+ // Create creates file with the given 'file descriptor', truncate if already
+ // exist and opens write-only.
// Returns ErrClosed if the underlying storage is closed.
Create(fd FileDesc) (Writer, error)
- // Remove removes file with the given fd.
+ // Remove removes file with the given 'file descriptor'.
// Returns ErrClosed if the underlying storage is closed.
Remove(fd FileDesc) error
diff --git a/leveldb/testutil/storage.go b/leveldb/testutil/storage.go
index 1d9163e..581daf3 100644
--- a/leveldb/testutil/storage.go
+++ b/leveldb/testutil/storage.go
@@ -20,7 +20,6 @@
. "github.com/onsi/gomega"
"github.com/syndtr/goleveldb/leveldb/storage"
- "github.com/syndtr/goleveldb/leveldb/util"
)
var (
@@ -161,11 +160,11 @@
type storageLock struct {
s *Storage
- r util.Releaser
+ l storage.Locker
}
-func (l storageLock) Release() {
- l.r.Release()
+func (l storageLock) Unlock() {
+ l.l.Unlock()
l.s.logI("storage lock released")
}
@@ -332,7 +331,7 @@
s.Storage.Log(str)
}
-func (s *Storage) Lock() (l storage.Lock, err error) {
+func (s *Storage) Lock() (l storage.Locker, err error) {
l, err = s.Storage.Lock()
if err != nil {
s.logI("storage locking failed, err=%v", err)
diff --git a/manualtest/dbstress/main.go b/manualtest/dbstress/main.go
index cf8466e..2886475 100644
--- a/manualtest/dbstress/main.go
+++ b/manualtest/dbstress/main.go
@@ -331,7 +331,7 @@
log.Printf("FATAL: "+format, v...)
if err != nil && errors.IsCorrupted(err) {
cerr := err.(*errors.ErrCorrupted)
- if !cerr.Fd.Nil() && cerr.Fd.Type == storage.TypeTable {
+ if !cerr.Fd.Zero() && cerr.Fd.Type == storage.TypeTable {
log.Print("FATAL: corruption detected, scanning...")
if !tstor.scanTable(storage.FileDesc{Type: storage.TypeTable, Num: cerr.Fd.Num}, false) {
log.Printf("FATAL: unable to find corrupted key/value pair in table %v", cerr.Fd)