All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
Note: For now we're doing one centralized release across the repository, while also tagging all separate modules individually as required by Go modules. In the future we might update and release the modules more independently.
Note 2: Tag
v0.7.0
points to v0.7.0 of the rootgokv
module, but the other modules in this repo are then updated and thus tagged separately (as required for Go modules). Check tagrelease/v0.7.0
for the commit at which the entire repo represents v0.7.0. See docs/releasing.md for details.
- New codec:
proto
(for protocol buffers) (PR #127 by @glimchb) - New store implementation:
noop
(PR #126 by @peczenyj) - Optional timeout configuration for
datastore
store implementation (PR #133 by @glimchb) - Optional timeout configuration for
redis
store implementation (PR #130 by @glimchb)
Library:
- Updated dependencies of all modules within the same major version (PR #108 + #145 + #166)
- So except for a few required major version updates, all dependencies are now up-to-date as of 2024-01-07
- Major update of
BigCache
dependency dyanamodb
tests are now independent of any AWS config/credential file (PR #108)- Updated
Hazelcast
dependency to v1.3.0 (PR #112 by @yuce) - Updated
redis
dependency from v6.15.9 to v9.2.1 (PR #130 by @glimchb) - Use
any
instead ofinterface{}
(PR #150) - Block on etcd connection fail (PR #163)
- Various security updates by @dependabot
- Switch of used
MongoDB
dependency, from unmaintainedgithub.com/globalsign/mgo
to officialgo.mongodb.org/mongo-driver
(PR #165)
Tests / CI:
- Test script (
build/test.sh
) now starts all required services instead of relying on Travis CI for some (PR #108) - Dependency update scripts (
build/update-deps.sh
/build/update-deps.ps1
) were changed to only update direct dependencies (PR #108) - Migrated CI from Travis CI to GitHub Actions (PR #110)
- Migrated from Bash and PowerShell build/test scripts to Mage (PR #111)
- With this comes also the improvement that individual modules can now be tested. Like
mage test redis
. For testing all modules there'smage test all
.
- With this comes also the improvement that individual modules can now be tested. Like
- Added more Go versions in CI test matrix (PR #134 by @glimchb)
- Use GitHub action for Mage (PR #135 by @glimchb)
- Added Windows to CI build matrix (PR #139 by @glimchb)
- Updated Mage from 1.13 to 1.15 (PR #148)
- Better error handling in Magefile (PR #151)
- Added Docker health check to test containers (PR #142 by @glimchb)
- Use the Docker health checks to reduce wait time for containers in CI (PR #154)
- Update and improve usage of GitHub Actions dependencies (PR #156)
- Prefix test container names with gokv (PR #161)
- Reduce test container wait time (PR #162)
- Add Docker health checks to Consul and Memcached (PR #168)
- Skip etcd concurrency test in CI (PR #172)
- Remove test skipping on connection failure from almost all store implementations (PR #173)
- Add
Replace
target in Magefile (PR #174)
- Fixed
gomap
data race (PR #90 by @tdakkota)- Includes a regression test covering most (if not all) storage-specific implementations 👍
- Fixed double CI builds when maintainer pushed a commit to an open PR (PR #143)
- Fix concurrency tests (PR #176)
redis
store now has a default timeout of 2 seconds (previously no timeout). You can customize/remove the timeout via the store's config. (PR #130 by @glimchb)datastore
store: Update of direct dependencies lead to indirect dependency update ofgoogle.golang.org/grpc
fromv1.46.0
tov1.59.0
, which is incompatible with Go 1.18 dueatomic.Int64
being used, which was introduced in Go 1.19.- The
interface{}
toany
change makesgokv
incompatible with Go version 1.17 and older. Please open an issue if you're stuck on an old Go version and would like us to revert this change. - The switch of the used MongoDB library from an unmaintained 3rd party library to the official one might make it incompatible with old MongoDB servers, or with data that was inserted with a previous version of gokv. This is just a warning - it's not confirmed. (PR #165
- @janisz made their first contribution in #89
- @yuce made their first contribution in #112
- @peczenyj made their first contribution in #126
- @dependabot made their first contribution in #122
- @glimchb made their first contribution in #127
- Added support for Go modules (issue #81)
- All
gokv.Store
implementations are now separate Go modules
- All
- Added
gokv.Store
implementations: - Fixed: Compile error in
badgerdb
after a breaking change in BadgerDB 1.6.0
- Added: Package
encoding
- An abstraction and wrapper for the core functionality of packages likeencoding/json
andencoding/gob
(issue #47) - Added: Package
sql
- It contains shared code for SQL implementations.mysql
andpostgres
already use it and if you want to create your own SQL implementation you can use it as well. (Useful for issue #57.) - Added
gokv.Store
implementations:- Package
s3
- Agokv.Store
implementation for Amazon S3 (issue #37)- Also works for other S3-compatible cloud services like DigitalOcean Spaces and Scaleway Object Storage, as well as for self-hosted solutions like OpenStack Swift, Ceph and Minio
- Package
tablestorage
- Agokv.Store
implementation for Azure Table Storage (issue #42) - Package
datastore
- Agokv.Store
implementation for Google Cloud Datastore (issue #51) - Package
tablestore
- Agokv.Store
implementation for Alibaba Cloud Table Store (issue #70) - Package
leveldb
- Agokv.Store
implementation for LevelDB (issue #48) - Package
file
- Agokv.Store
implementation for storing key-value pairs as files (issue #52) - Package
zookeeper
- Agokv.Store
implementation for Apache ZooKeeper (issue #66) - Package
postgresql
- Agokv.Store
implementation for PostgreSQL (issue #57) - Package
cockroachdb
- Agokv.Store
implementation for CockroachDB (issue #62) - Package
ignite
- Agokv.Store
implementation for Apache Ignite (issue #64) - Package
freecache
- Agokv.Store
implementation for FreeCache (issue #44) - Package
bigcache
- Agokv.Store
implementation for BigCache (issue #45)
- Package
- The
MarshalFormat
enums were removed from all packages that containedgokv.Store
implementations. Instead the shared packageencoding
was introduced (required for issue #47)
- Added: Method
Close() error
(issue #36) - Added
gokv.Store
implementations: - Added: The factory function
redis.NewClient()
now checks if the connection to the Redis server works and otherwise returns an error. - Added: The
test
package now has the functionfunc TestConcurrentInteractions(t *testing.T, goroutineCount int, store gokv.Store)
that you can use to test yourgokv.Store
implementation with concurrent interactions. - Improved: The
etcd.Client
timeout implementation was improved. - Fixed: The
Get()
method of thebbolt
store ignored errors if they occurred during the retrieval of the value - Fixed: Spelling in error message when using the etcd implementation and the etcd server is unreachable
- The added
Close() error
method (see above) means that previous implementations ofgokv.Store
are not compatible with the interface anymore. - Renamed
bolt
package tobbolt
to reflect the fact that the maintained fork is used. Also changed all other occurrences of "bolt" (e.g. in GoDoc comments etc.). - Due to the above mentioned addition to the Redis client factory function, the function signature changed from
func NewClient(options Options) Client
tofunc NewClient(options Options) (Client, error)
.
- Added: Method
Delete(string) error
(issue #8) - Added: All
gokv.Store
implementations in this package now also support gob as marshal format as alternative to JSON (issue #22)- Part of this addition are a new field in the existing
Options
structs, calledMarshalFormat
, as well as the relatedMarshalFormat
enum (custom type + relatedconst
values) in each implementation package
- Part of this addition are a new field in the existing
- Added
gokv.Store
implementations:
- The added
Delete(string) error
method (see above) means that previous implementations ofgokv.Store
are not compatible with the interface anymore. - Changed: The
NewStore()
function ingomap
andsyncmap
now has anOption
parameter. Required for issue #22. - Changed: Passing an empty string as key to
Set()
,Get()
orDelete()
now results in an error - Changed: Passing
nil
as value parameter toSet()
or as pointer toGet()
now results in an error. This change leads to a consistent behaviour across the different marshal formats (otherwise for exampleencoding/json
marshalsnil
tonull
whileencoding/gob
returns an error).
- Added
gokv.Store
implementation:- Package
gomap
- Agokv.Store
implementation for a plain Go map with async.RWMutex
for concurrent access (issue #11)
- Package
- Improved: Every
gokv.Store
implementation resides in its own package now, so when downloading the package of an implementation, for example withgo get github.com/philippgille/gokv/redis
, only the actually required dependencies are downloaded and compiled, making the process much faster. This is especially useful for example when creating Docker images, where in many cases (depending on theDockerfile
) the download and compilation are repeated for each build. (Issue #2) - Improved: The performance of
bolt.Store
should be higher, because unnecessary manual locking was removed. (Issue #1) - Fixed: The
gokv.Store
implementation for bbolt / Bolt DB used data from within a Bolt transaction outside of it, without copying the value, which can lead to errors (see here) (issue #13)
- All
gokv.Store
implementations were moved into their own packages and the structs that implement the interface were renamed to avoid unidiomatic "stuttering".
Initial release with code from philippgille/ln-paywall:78fd1dfbf10f549a22f4f30ac7f68c2a2735e989 with only a few changes like a different default path and a bucket name as additional option for the Bolt DB implementation.
Features: