From 26318cb07d7832e07aa2de75de29fff6cbbe133f Mon Sep 17 00:00:00 2001 From: Umputun Date: Wed, 7 Mar 2018 13:05:57 -0600 Subject: [PATCH] switch to coreos bbolt --- Gopkg.lock | 8 +- app/store/bolt.go | 2 +- docker-compose.yml | 8 +- nginx-proxy-example.conf | 39 ++++++++++ vendor/github.com/boltdb/bolt/bolt_arm.go | 28 ------- .../{boltdb/bolt => coreos/bbolt}/.gitignore | 0 .../{boltdb/bolt => coreos/bbolt}/LICENSE | 0 .../{boltdb/bolt => coreos/bbolt}/Makefile | 0 .../{boltdb/bolt => coreos/bbolt}/README.md | 78 ++----------------- .../bolt => coreos/bbolt}/appveyor.yml | 0 .../{boltdb/bolt => coreos/bbolt}/bolt_386.go | 3 - .../bolt => coreos/bbolt}/bolt_amd64.go | 3 - vendor/github.com/coreos/bbolt/bolt_arm.go | 7 ++ .../bolt => coreos/bbolt}/bolt_arm64.go | 3 - .../bolt => coreos/bbolt}/bolt_linux.go | 0 .../bolt => coreos/bbolt}/bolt_openbsd.go | 0 .../{boltdb/bolt => coreos/bbolt}/bolt_ppc.go | 0 .../bolt => coreos/bbolt}/bolt_ppc64.go | 3 - .../bolt => coreos/bbolt}/bolt_ppc64le.go | 3 - .../bolt => coreos/bbolt}/bolt_s390x.go | 3 - .../bolt => coreos/bbolt}/bolt_unix.go | 0 .../bbolt}/bolt_unix_solaris.go | 0 .../bolt => coreos/bbolt}/bolt_windows.go | 2 +- .../bolt => coreos/bbolt}/boltsync_unix.go | 0 .../{boltdb/bolt => coreos/bbolt}/bucket.go | 35 +-------- .../{boltdb/bolt => coreos/bbolt}/cursor.go | 0 .../{boltdb/bolt => coreos/bbolt}/db.go | 7 +- .../{boltdb/bolt => coreos/bbolt}/doc.go | 0 .../{boltdb/bolt => coreos/bbolt}/errors.go | 0 .../{boltdb/bolt => coreos/bbolt}/freelist.go | 36 ++++----- .../{boltdb/bolt => coreos/bbolt}/node.go | 0 .../{boltdb/bolt => coreos/bbolt}/page.go | 31 ++------ .../{boltdb/bolt => coreos/bbolt}/tx.go | 4 +- 33 files changed, 92 insertions(+), 211 deletions(-) create mode 100644 nginx-proxy-example.conf delete mode 100644 vendor/github.com/boltdb/bolt/bolt_arm.go rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/.gitignore (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/LICENSE (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/Makefile (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/README.md (91%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/appveyor.yml (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/bolt_386.go (72%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/bolt_amd64.go (73%) create mode 100644 vendor/github.com/coreos/bbolt/bolt_arm.go rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/bolt_arm64.go (74%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/bolt_linux.go (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/bolt_openbsd.go (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/bolt_ppc.go (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/bolt_ppc64.go (74%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/bolt_ppc64le.go (75%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/bolt_s390x.go (74%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/bolt_unix.go (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/bolt_unix_solaris.go (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/bolt_windows.go (99%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/boltsync_unix.go (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/bucket.go (95%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/cursor.go (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/db.go (99%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/doc.go (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/errors.go (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/freelist.go (88%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/node.go (100%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/page.go (88%) rename vendor/github.com/{boltdb/bolt => coreos/bbolt}/tx.go (99%) diff --git a/Gopkg.lock b/Gopkg.lock index e77dfede..e6e01219 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -8,10 +8,10 @@ version = "v0.18.0" [[projects]] - name = "github.com/boltdb/bolt" + name = "github.com/coreos/bbolt" packages = ["."] - revision = "2f1ce7a837dcb8da3ec595b1dac9d0632f0f99e8" - version = "v1.3.1" + revision = "583e8937c61f1af6513608ccc75c97b6abdf4ff9" + version = "v1.3.0" [[projects]] name = "github.com/davecgh/go-spew" @@ -201,6 +201,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "03e0673f56f51384e8528f760cd44327828e5ef158b97bbbebc678c52cec9cc3" + inputs-digest = "0d83e980a218ae9ca20daebde2587524e09b17a2d4c8f21ff717504f580b0dfc" solver-name = "gps-cdcl" solver-version = 1 diff --git a/app/store/bolt.go b/app/store/bolt.go index 4802cada..3c3dcbd2 100644 --- a/app/store/bolt.go +++ b/app/store/bolt.go @@ -8,7 +8,7 @@ import ( "strings" "time" - "github.com/boltdb/bolt" + "github.com/coreos/bbolt" "github.com/google/uuid" "github.com/pkg/errors" ) diff --git a/docker-compose.yml b/docker-compose.yml index 17852e43..1eec7968 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,15 +14,16 @@ services: max-size: "10m" max-file: "5" - ports: - - "8080:8080" + # uncomment to expose directly (no proxy) + # ports: + # - "8080:8080" environment: - REMARK_URL=https://demo.remark42.com - BOLTDB_PATH=/srv/var/db - BACKUP_PATH=/srv/var/backup - SESSION_STORE=/srv/var/session - # - DEV=true # development mode flag. It turns authentication off, be careful! + - DEV_PASSWD=password # development mode, be careful! - DEBUG=true - REMARK_GOOGLE_CID - REMARK_GOOGLE_CSEC @@ -34,4 +35,5 @@ services: - ./var:/srv/var - ./web:/srv/web # maps web directory directly to propagate local changes to container without redeploy + user: ${USER} # if local UID != 1001 (default) set `USER` in your env, i.e. export USER=`id -u $USER` command: /srv/remark server diff --git a/nginx-proxy-example.conf b/nginx-proxy-example.conf new file mode 100644 index 00000000..8c265ece --- /dev/null +++ b/nginx-proxy-example.conf @@ -0,0 +1,39 @@ +# example of nginx proxy to use with nginx-le - https://github.com/umputun/nginx-le + +server { + listen 443; + server_name demo.remark42.com; + + ssl on; + ssl_certificate SSL_CERT; + ssl_certificate_key SSL_KEY; + ssl_trusted_certificate SSL_CHAIN_CERT; + + add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; + + limit_conn perip 10; + + location / { + + #CORS + add_header 'Access-Control-Allow-Origin' '*'; + add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS'; + add_header Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With"; + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Allow-Origin' '*'; + add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS'; + add_header 'Access-Control-Max-Age' 86400; + add_header 'Access-Control-Allow-Credentials' 'true'; + add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; + add_header 'Content-Length' 0; + add_header 'Content-Type' 'text/plain; charset=UTF-8'; + return 204; + } + + proxy_redirect off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + proxy_pass http://remark:8080/; + } +} diff --git a/vendor/github.com/boltdb/bolt/bolt_arm.go b/vendor/github.com/boltdb/bolt/bolt_arm.go deleted file mode 100644 index 7e5cb4b9..00000000 --- a/vendor/github.com/boltdb/bolt/bolt_arm.go +++ /dev/null @@ -1,28 +0,0 @@ -package bolt - -import "unsafe" - -// maxMapSize represents the largest mmap size supported by Bolt. -const maxMapSize = 0x7FFFFFFF // 2GB - -// maxAllocSize is the size used when creating array pointers. -const maxAllocSize = 0xFFFFFFF - -// Are unaligned load/stores broken on this arch? -var brokenUnaligned bool - -func init() { - // Simple check to see whether this arch handles unaligned load/stores - // correctly. - - // ARM9 and older devices require load/stores to be from/to aligned - // addresses. If not, the lower 2 bits are cleared and that address is - // read in a jumbled up order. - - // See http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka15414.html - - raw := [6]byte{0xfe, 0xef, 0x11, 0x22, 0x22, 0x11} - val := *(*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(&raw)) + 2)) - - brokenUnaligned = val != 0x11222211 -} diff --git a/vendor/github.com/boltdb/bolt/.gitignore b/vendor/github.com/coreos/bbolt/.gitignore similarity index 100% rename from vendor/github.com/boltdb/bolt/.gitignore rename to vendor/github.com/coreos/bbolt/.gitignore diff --git a/vendor/github.com/boltdb/bolt/LICENSE b/vendor/github.com/coreos/bbolt/LICENSE similarity index 100% rename from vendor/github.com/boltdb/bolt/LICENSE rename to vendor/github.com/coreos/bbolt/LICENSE diff --git a/vendor/github.com/boltdb/bolt/Makefile b/vendor/github.com/coreos/bbolt/Makefile similarity index 100% rename from vendor/github.com/boltdb/bolt/Makefile rename to vendor/github.com/coreos/bbolt/Makefile diff --git a/vendor/github.com/boltdb/bolt/README.md b/vendor/github.com/coreos/bbolt/README.md similarity index 91% rename from vendor/github.com/boltdb/bolt/README.md rename to vendor/github.com/coreos/bbolt/README.md index 7d43a15b..8523e337 100644 --- a/vendor/github.com/boltdb/bolt/README.md +++ b/vendor/github.com/coreos/bbolt/README.md @@ -15,11 +15,11 @@ and setting values. That's it. ## Project Status -Bolt is stable, the API is fixed, and the file format is fixed. Full unit -test coverage and randomized black box testing are used to ensure database -consistency and thread safety. Bolt is currently used in high-load production -environments serving databases as large as 1TB. Many companies such as -Shopify and Heroku use Bolt-backed services every day. +Bolt is stable and the API is fixed. Full unit test coverage and randomized +black box testing are used to ensure database consistency and thread safety. +Bolt is currently in high-load production environments serving databases as +large as 1TB. Many companies such as Shopify and Heroku use Bolt-backed +services every day. ## Table of Contents @@ -209,7 +209,7 @@ and then safely close your transaction if an error is returned. This is the recommended way to use Bolt transactions. However, sometimes you may want to manually start and end your transactions. -You can use the `DB.Begin()` function directly but **please** be sure to close +You can use the `Tx.Begin()` function directly but **please** be sure to close the transaction. ```go @@ -395,7 +395,7 @@ db.View(func(tx *bolt.Tx) error { c := tx.Bucket([]byte("MyBucket")).Cursor() prefix := []byte("1234") - for k, v := c.Seek(prefix); k != nil && bytes.HasPrefix(k, prefix); k, v = c.Next() { + for k, v := c.Seek(prefix); bytes.HasPrefix(k, prefix); k, v = c.Next() { fmt.Printf("key=%s, value=%s\n", k, v) } @@ -448,10 +448,6 @@ db.View(func(tx *bolt.Tx) error { }) ``` -Please note that keys and values in `ForEach()` are only valid while -the transaction is open. If you need to use a key or value outside of -the transaction, you must use `copy()` to copy it to another byte -slice. ### Nested buckets @@ -464,55 +460,6 @@ func (*Bucket) CreateBucketIfNotExists(key []byte) (*Bucket, error) func (*Bucket) DeleteBucket(key []byte) error ``` -Say you had a multi-tenant application where the root level bucket was the account bucket. Inside of this bucket was a sequence of accounts which themselves are buckets. And inside the sequence bucket you could have many buckets pertaining to the Account itself (Users, Notes, etc) isolating the information into logical groupings. - -```go - -// createUser creates a new user in the given account. -func createUser(accountID int, u *User) error { - // Start the transaction. - tx, err := db.Begin(true) - if err != nil { - return err - } - defer tx.Rollback() - - // Retrieve the root bucket for the account. - // Assume this has already been created when the account was set up. - root := tx.Bucket([]byte(strconv.FormatUint(accountID, 10))) - - // Setup the users bucket. - bkt, err := root.CreateBucketIfNotExists([]byte("USERS")) - if err != nil { - return err - } - - // Generate an ID for the new user. - userID, err := bkt.NextSequence() - if err != nil { - return err - } - u.ID = userID - - // Marshal and save the encoded user. - if buf, err := json.Marshal(u); err != nil { - return err - } else if err := bkt.Put([]byte(strconv.FormatUint(u.ID, 10)), buf); err != nil { - return err - } - - // Commit the transaction. - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -``` - - - ### Database backups @@ -768,9 +715,6 @@ Here are a few things to note when evaluating and using Bolt: can be reused by a new page or can be unmapped from virtual memory and you'll see an `unexpected fault address` panic when accessing it. -* Bolt uses an exclusive write lock on the database file so it cannot be - shared by multiple processes. - * Be careful when using `Bucket.FillPercent`. Setting a high fill percent for buckets that have random inserts will cause your database to have very poor page utilization. @@ -904,13 +848,5 @@ Below is a list of public, open source projects that use Bolt: * [Algernon](https://github.com/xyproto/algernon) - A HTTP/2 web server with built-in support for Lua. Uses BoltDB as the default database backend. * [MuLiFS](https://github.com/dankomiocevic/mulifs) - Music Library Filesystem creates a filesystem to organise your music files. * [GoShort](https://github.com/pankajkhairnar/goShort) - GoShort is a URL shortener written in Golang and BoltDB for persistent key/value storage and for routing it's using high performent HTTPRouter. -* [torrent](https://github.com/anacrolix/torrent) - Full-featured BitTorrent client package and utilities in Go. BoltDB is a storage backend in development. -* [gopherpit](https://github.com/gopherpit/gopherpit) - A web service to manage Go remote import paths with custom domains -* [bolter](https://github.com/hasit/bolter) - Command-line app for viewing BoltDB file in your terminal. -* [btcwallet](https://github.com/btcsuite/btcwallet) - A bitcoin wallet. -* [dcrwallet](https://github.com/decred/dcrwallet) - A wallet for the Decred cryptocurrency. -* [Ironsmith](https://github.com/timshannon/ironsmith) - A simple, script-driven continuous integration (build - > test -> release) tool, with no external dependencies -* [BoltHold](https://github.com/timshannon/bolthold) - An embeddable NoSQL store for Go types built on BoltDB -* [Ponzu CMS](https://ponzu-cms.org) - Headless CMS + automatic JSON API with auto-HTTPS, HTTP/2 Server Push, and flexible server framework. If you are using Bolt in a project please send a pull request to add it to the list. diff --git a/vendor/github.com/boltdb/bolt/appveyor.yml b/vendor/github.com/coreos/bbolt/appveyor.yml similarity index 100% rename from vendor/github.com/boltdb/bolt/appveyor.yml rename to vendor/github.com/coreos/bbolt/appveyor.yml diff --git a/vendor/github.com/boltdb/bolt/bolt_386.go b/vendor/github.com/coreos/bbolt/bolt_386.go similarity index 72% rename from vendor/github.com/boltdb/bolt/bolt_386.go rename to vendor/github.com/coreos/bbolt/bolt_386.go index 820d533c..e659bfb9 100644 --- a/vendor/github.com/boltdb/bolt/bolt_386.go +++ b/vendor/github.com/coreos/bbolt/bolt_386.go @@ -5,6 +5,3 @@ const maxMapSize = 0x7FFFFFFF // 2GB // maxAllocSize is the size used when creating array pointers. const maxAllocSize = 0xFFFFFFF - -// Are unaligned load/stores broken on this arch? -var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_amd64.go b/vendor/github.com/coreos/bbolt/bolt_amd64.go similarity index 73% rename from vendor/github.com/boltdb/bolt/bolt_amd64.go rename to vendor/github.com/coreos/bbolt/bolt_amd64.go index 98fafdb4..cca6b7eb 100644 --- a/vendor/github.com/boltdb/bolt/bolt_amd64.go +++ b/vendor/github.com/coreos/bbolt/bolt_amd64.go @@ -5,6 +5,3 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB // maxAllocSize is the size used when creating array pointers. const maxAllocSize = 0x7FFFFFFF - -// Are unaligned load/stores broken on this arch? -var brokenUnaligned = false diff --git a/vendor/github.com/coreos/bbolt/bolt_arm.go b/vendor/github.com/coreos/bbolt/bolt_arm.go new file mode 100644 index 00000000..e659bfb9 --- /dev/null +++ b/vendor/github.com/coreos/bbolt/bolt_arm.go @@ -0,0 +1,7 @@ +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF diff --git a/vendor/github.com/boltdb/bolt/bolt_arm64.go b/vendor/github.com/coreos/bbolt/bolt_arm64.go similarity index 74% rename from vendor/github.com/boltdb/bolt/bolt_arm64.go rename to vendor/github.com/coreos/bbolt/bolt_arm64.go index b26d84f9..6d230935 100644 --- a/vendor/github.com/boltdb/bolt/bolt_arm64.go +++ b/vendor/github.com/coreos/bbolt/bolt_arm64.go @@ -7,6 +7,3 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB // maxAllocSize is the size used when creating array pointers. const maxAllocSize = 0x7FFFFFFF - -// Are unaligned load/stores broken on this arch? -var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_linux.go b/vendor/github.com/coreos/bbolt/bolt_linux.go similarity index 100% rename from vendor/github.com/boltdb/bolt/bolt_linux.go rename to vendor/github.com/coreos/bbolt/bolt_linux.go diff --git a/vendor/github.com/boltdb/bolt/bolt_openbsd.go b/vendor/github.com/coreos/bbolt/bolt_openbsd.go similarity index 100% rename from vendor/github.com/boltdb/bolt/bolt_openbsd.go rename to vendor/github.com/coreos/bbolt/bolt_openbsd.go diff --git a/vendor/github.com/boltdb/bolt/bolt_ppc.go b/vendor/github.com/coreos/bbolt/bolt_ppc.go similarity index 100% rename from vendor/github.com/boltdb/bolt/bolt_ppc.go rename to vendor/github.com/coreos/bbolt/bolt_ppc.go diff --git a/vendor/github.com/boltdb/bolt/bolt_ppc64.go b/vendor/github.com/coreos/bbolt/bolt_ppc64.go similarity index 74% rename from vendor/github.com/boltdb/bolt/bolt_ppc64.go rename to vendor/github.com/coreos/bbolt/bolt_ppc64.go index 9331d977..2dc6be02 100644 --- a/vendor/github.com/boltdb/bolt/bolt_ppc64.go +++ b/vendor/github.com/coreos/bbolt/bolt_ppc64.go @@ -7,6 +7,3 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB // maxAllocSize is the size used when creating array pointers. const maxAllocSize = 0x7FFFFFFF - -// Are unaligned load/stores broken on this arch? -var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_ppc64le.go b/vendor/github.com/coreos/bbolt/bolt_ppc64le.go similarity index 75% rename from vendor/github.com/boltdb/bolt/bolt_ppc64le.go rename to vendor/github.com/coreos/bbolt/bolt_ppc64le.go index 8c143bc5..8351e129 100644 --- a/vendor/github.com/boltdb/bolt/bolt_ppc64le.go +++ b/vendor/github.com/coreos/bbolt/bolt_ppc64le.go @@ -7,6 +7,3 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB // maxAllocSize is the size used when creating array pointers. const maxAllocSize = 0x7FFFFFFF - -// Are unaligned load/stores broken on this arch? -var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_s390x.go b/vendor/github.com/coreos/bbolt/bolt_s390x.go similarity index 74% rename from vendor/github.com/boltdb/bolt/bolt_s390x.go rename to vendor/github.com/coreos/bbolt/bolt_s390x.go index d7c39af9..f4dd26bb 100644 --- a/vendor/github.com/boltdb/bolt/bolt_s390x.go +++ b/vendor/github.com/coreos/bbolt/bolt_s390x.go @@ -7,6 +7,3 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB // maxAllocSize is the size used when creating array pointers. const maxAllocSize = 0x7FFFFFFF - -// Are unaligned load/stores broken on this arch? -var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_unix.go b/vendor/github.com/coreos/bbolt/bolt_unix.go similarity index 100% rename from vendor/github.com/boltdb/bolt/bolt_unix.go rename to vendor/github.com/coreos/bbolt/bolt_unix.go diff --git a/vendor/github.com/boltdb/bolt/bolt_unix_solaris.go b/vendor/github.com/coreos/bbolt/bolt_unix_solaris.go similarity index 100% rename from vendor/github.com/boltdb/bolt/bolt_unix_solaris.go rename to vendor/github.com/coreos/bbolt/bolt_unix_solaris.go diff --git a/vendor/github.com/boltdb/bolt/bolt_windows.go b/vendor/github.com/coreos/bbolt/bolt_windows.go similarity index 99% rename from vendor/github.com/boltdb/bolt/bolt_windows.go rename to vendor/github.com/coreos/bbolt/bolt_windows.go index b00fb072..d538e6af 100644 --- a/vendor/github.com/boltdb/bolt/bolt_windows.go +++ b/vendor/github.com/coreos/bbolt/bolt_windows.go @@ -89,7 +89,7 @@ func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) erro func funlock(db *DB) error { err := unlockFileEx(syscall.Handle(db.lockfile.Fd()), 0, 1, 0, &syscall.Overlapped{}) db.lockfile.Close() - os.Remove(db.path + lockExt) + os.Remove(db.path+lockExt) return err } diff --git a/vendor/github.com/boltdb/bolt/boltsync_unix.go b/vendor/github.com/coreos/bbolt/boltsync_unix.go similarity index 100% rename from vendor/github.com/boltdb/bolt/boltsync_unix.go rename to vendor/github.com/coreos/bbolt/boltsync_unix.go diff --git a/vendor/github.com/boltdb/bolt/bucket.go b/vendor/github.com/coreos/bbolt/bucket.go similarity index 95% rename from vendor/github.com/boltdb/bolt/bucket.go rename to vendor/github.com/coreos/bbolt/bucket.go index 0c5bf274..d2f8c524 100644 --- a/vendor/github.com/boltdb/bolt/bucket.go +++ b/vendor/github.com/coreos/bbolt/bucket.go @@ -130,17 +130,9 @@ func (b *Bucket) Bucket(name []byte) *Bucket { func (b *Bucket) openBucket(value []byte) *Bucket { var child = newBucket(b.tx) - // If unaligned load/stores are broken on this arch and value is - // unaligned simply clone to an aligned byte array. - unaligned := brokenUnaligned && uintptr(unsafe.Pointer(&value[0]))&3 != 0 - - if unaligned { - value = cloneBytes(value) - } - // If this is a writable transaction then we need to copy the bucket entry. // Read-only transactions can point directly at the mmap entry. - if b.tx.writable && !unaligned { + if b.tx.writable { child.bucket = &bucket{} *child.bucket = *(*bucket)(unsafe.Pointer(&value[0])) } else { @@ -175,8 +167,9 @@ func (b *Bucket) CreateBucket(key []byte) (*Bucket, error) { if bytes.Equal(key, k) { if (flags & bucketLeafFlag) != 0 { return nil, ErrBucketExists + } else { + return nil, ErrIncompatibleValue } - return nil, ErrIncompatibleValue } // Create empty, inline bucket. @@ -336,28 +329,6 @@ func (b *Bucket) Delete(key []byte) error { return nil } -// Sequence returns the current integer for the bucket without incrementing it. -func (b *Bucket) Sequence() uint64 { return b.bucket.sequence } - -// SetSequence updates the sequence number for the bucket. -func (b *Bucket) SetSequence(v uint64) error { - if b.tx.db == nil { - return ErrTxClosed - } else if !b.Writable() { - return ErrTxNotWritable - } - - // Materialize the root node if it hasn't been already so that the - // bucket will be saved during commit. - if b.rootNode == nil { - _ = b.node(b.root, nil) - } - - // Increment and return the sequence. - b.bucket.sequence = v - return nil -} - // NextSequence returns an autoincrementing integer for the bucket. func (b *Bucket) NextSequence() (uint64, error) { if b.tx.db == nil { diff --git a/vendor/github.com/boltdb/bolt/cursor.go b/vendor/github.com/coreos/bbolt/cursor.go similarity index 100% rename from vendor/github.com/boltdb/bolt/cursor.go rename to vendor/github.com/coreos/bbolt/cursor.go diff --git a/vendor/github.com/boltdb/bolt/db.go b/vendor/github.com/coreos/bbolt/db.go similarity index 99% rename from vendor/github.com/boltdb/bolt/db.go rename to vendor/github.com/coreos/bbolt/db.go index f352ff14..1223493c 100644 --- a/vendor/github.com/boltdb/bolt/db.go +++ b/vendor/github.com/coreos/bbolt/db.go @@ -552,10 +552,7 @@ func (db *DB) removeTx(tx *Tx) { // Remove the transaction. for i, t := range db.txs { if t == tx { - last := len(db.txs) - 1 - db.txs[i] = db.txs[last] - db.txs[last] = nil - db.txs = db.txs[:last] + db.txs = append(db.txs[:i], db.txs[i+1:]...) break } } @@ -955,7 +952,7 @@ func (s *Stats) Sub(other *Stats) Stats { diff.PendingPageN = s.PendingPageN diff.FreeAlloc = s.FreeAlloc diff.FreelistInuse = s.FreelistInuse - diff.TxN = s.TxN - other.TxN + diff.TxN = other.TxN - s.TxN diff.TxStats = s.TxStats.Sub(&other.TxStats) return diff } diff --git a/vendor/github.com/boltdb/bolt/doc.go b/vendor/github.com/coreos/bbolt/doc.go similarity index 100% rename from vendor/github.com/boltdb/bolt/doc.go rename to vendor/github.com/coreos/bbolt/doc.go diff --git a/vendor/github.com/boltdb/bolt/errors.go b/vendor/github.com/coreos/bbolt/errors.go similarity index 100% rename from vendor/github.com/boltdb/bolt/errors.go rename to vendor/github.com/coreos/bbolt/errors.go diff --git a/vendor/github.com/boltdb/bolt/freelist.go b/vendor/github.com/coreos/bbolt/freelist.go similarity index 88% rename from vendor/github.com/boltdb/bolt/freelist.go rename to vendor/github.com/coreos/bbolt/freelist.go index aba48f58..1b7ba91b 100644 --- a/vendor/github.com/boltdb/bolt/freelist.go +++ b/vendor/github.com/coreos/bbolt/freelist.go @@ -24,12 +24,7 @@ func newFreelist() *freelist { // size returns the size of the page after serialization. func (f *freelist) size() int { - n := f.count() - if n >= 0xFFFF { - // The first element will be used to store the count. See freelist.write. - n++ - } - return pageHeaderSize + (int(unsafe.Sizeof(pgid(0))) * n) + return pageHeaderSize + (int(unsafe.Sizeof(pgid(0))) * f.count()) } // count returns count of pages on the freelist @@ -51,15 +46,16 @@ func (f *freelist) pending_count() int { return count } -// copyall copies into dst a list of all free ids and all pending ids in one sorted list. -// f.count returns the minimum length required for dst. -func (f *freelist) copyall(dst []pgid) { - m := make(pgids, 0, f.pending_count()) +// all returns a list of all free ids and all pending ids in one sorted list. +func (f *freelist) all() []pgid { + m := make(pgids, 0) + for _, list := range f.pending { m = append(m, list...) } + sort.Sort(m) - mergepgids(dst, f.ids, m) + return pgids(f.ids).merge(m) } // allocate returns the starting page id of a contiguous list of pages of a given size. @@ -190,22 +186,22 @@ func (f *freelist) read(p *page) { // become free. func (f *freelist) write(p *page) error { // Combine the old free pgids and pgids waiting on an open transaction. + ids := f.all() // Update the header flag. p.flags |= freelistPageFlag // The page.count can only hold up to 64k elements so if we overflow that // number then we handle it by putting the size in the first element. - lenids := f.count() - if lenids == 0 { - p.count = uint16(lenids) - } else if lenids < 0xFFFF { - p.count = uint16(lenids) - f.copyall(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[:]) + if len(ids) == 0 { + p.count = uint16(len(ids)) + } else if len(ids) < 0xFFFF { + p.count = uint16(len(ids)) + copy(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[:], ids) } else { p.count = 0xFFFF - ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0] = pgid(lenids) - f.copyall(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[1:]) + ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0] = pgid(len(ids)) + copy(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[1:], ids) } return nil @@ -240,7 +236,7 @@ func (f *freelist) reload(p *page) { // reindex rebuilds the free cache based on available and pending free lists. func (f *freelist) reindex() { - f.cache = make(map[pgid]bool, len(f.ids)) + f.cache = make(map[pgid]bool) for _, id := range f.ids { f.cache[id] = true } diff --git a/vendor/github.com/boltdb/bolt/node.go b/vendor/github.com/coreos/bbolt/node.go similarity index 100% rename from vendor/github.com/boltdb/bolt/node.go rename to vendor/github.com/coreos/bbolt/node.go diff --git a/vendor/github.com/boltdb/bolt/page.go b/vendor/github.com/coreos/bbolt/page.go similarity index 88% rename from vendor/github.com/boltdb/bolt/page.go rename to vendor/github.com/coreos/bbolt/page.go index cde403ae..7651a6bf 100644 --- a/vendor/github.com/boltdb/bolt/page.go +++ b/vendor/github.com/coreos/bbolt/page.go @@ -145,33 +145,12 @@ func (a pgids) merge(b pgids) pgids { // Return the opposite slice if one is nil. if len(a) == 0 { return b - } - if len(b) == 0 { + } else if len(b) == 0 { return a } - merged := make(pgids, len(a)+len(b)) - mergepgids(merged, a, b) - return merged -} -// mergepgids copies the sorted union of a and b into dst. -// If dst is too small, it panics. -func mergepgids(dst, a, b pgids) { - if len(dst) < len(a)+len(b) { - panic(fmt.Errorf("mergepgids bad len %d < %d + %d", len(dst), len(a), len(b))) - } - // Copy in the opposite slice if one is nil. - if len(a) == 0 { - copy(dst, b) - return - } - if len(b) == 0 { - copy(dst, a) - return - } - - // Merged will hold all elements from both lists. - merged := dst[:0] + // Create a list to hold all elements from both lists. + merged := make(pgids, 0, len(a)+len(b)) // Assign lead to the slice with a lower starting value, follow to the higher value. lead, follow := a, b @@ -193,5 +172,7 @@ func mergepgids(dst, a, b pgids) { } // Append what's left in follow. - _ = append(merged, follow...) + merged = append(merged, follow...) + + return merged } diff --git a/vendor/github.com/boltdb/bolt/tx.go b/vendor/github.com/coreos/bbolt/tx.go similarity index 99% rename from vendor/github.com/boltdb/bolt/tx.go rename to vendor/github.com/coreos/bbolt/tx.go index 6700308a..1cfb4cde 100644 --- a/vendor/github.com/boltdb/bolt/tx.go +++ b/vendor/github.com/coreos/bbolt/tx.go @@ -381,9 +381,7 @@ func (tx *Tx) Check() <-chan error { func (tx *Tx) check(ch chan error) { // Check if any pages are double freed. freed := make(map[pgid]bool) - all := make([]pgid, tx.db.freelist.count()) - tx.db.freelist.copyall(all) - for _, id := range all { + for _, id := range tx.db.freelist.all() { if freed[id] { ch <- fmt.Errorf("page %d: already freed", id) }