Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: go-fries/fries
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v2.25.0
Choose a base ref
...
head repository: go-fries/fries
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 2.x
Choose a head ref
Loading
Showing with 824 additions and 523 deletions.
  1. +1 βˆ’1 .github/workflows/lint.yml
  2. +3 βˆ’3 .github/workflows/test.yml
  3. +1 βˆ’1 README.md
  4. +2 βˆ’2 buf.gen.yaml
  5. +1 βˆ’1 buf.yaml
  6. +14 βˆ’5 cache/redis/store.go
  7. +55 βˆ’15 cache/redis/store_test.go
  8. +0 βˆ’24 cache/repository.go
  9. +0 βˆ’5 cache/repository_test.go
  10. +53 βˆ’0 cache/snapshot.go
  11. +78 βˆ’0 cache/snapshot_test.go
  12. +22 βˆ’0 cache/store.go
  13. +4 βˆ’4 coroutines/coroutines.go
  14. +3 βˆ’3 coroutines/worker.go
  15. +6 βˆ’30 crontab/README.md
  16. +6 βˆ’30 crontab/example_test.go
  17. +0 βˆ’58 crontab/middleware/distributednooverlapping/distributednooverlapping.go
  18. +0 βˆ’48 crontab/middleware/distributednooverlapping/redismutex/mutex.go
  19. +0 βˆ’36 crontab/middleware/distributednooverlapping/types.go
  20. +0 βˆ’101 crontab/middleware/tracing/tracing.go
  21. +0 βˆ’2 genproto/.gitignore
  22. +51 βˆ’48 go.mod
  23. +102 βˆ’95 go.sum
  24. +21 βˆ’0 gomod_test.go
  25. +230 βˆ’0 internal/genproto/tests/middleware/protovalidate/v1/person.pb.go
  26. +130 βˆ’0 internal/genproto/tests/middleware/tracing/v1/hello.pb.go
  27. 0 { β†’ internal}/proto/tests/middleware/protovalidate/v1/person.proto
  28. 0 { β†’ internal}/proto/tests/middleware/tracing/v1/hello.proto
  29. +0 βˆ’1 maps/maps_test.go
  30. +1 βˆ’1 middleware/protovalidate/validator_test.go
  31. +1 βˆ’1 middleware/tracing/span_test.go
  32. +1 βˆ’1 middleware/tracing/tracer_test.go
  33. +6 βˆ’6 otel/otlp/client.go
  34. +19 βˆ’0 renovate.json
  35. +9 βˆ’0 slices/slices.go
  36. +4 βˆ’1 slices/slices_test.go
2 changes: 1 addition & 1 deletion .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -21,7 +21,7 @@ jobs:
with:
go-version: stable

- uses: bufbuild/buf-setup-action@v1.45.0
- uses: bufbuild/buf-setup-action@v1.48.0
- run: buf generate

- name: golangci-lint
6 changes: 3 additions & 3 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ jobs:
name: "go test"
strategy:
matrix:
go-version: [ 1.21.x, 1.22.x, 1.23.x ]
go-version: [ 1.22.x, 1.23.x ]
platform: [ ubuntu-latest ]
mysql-version: ['mysql:latest', 'mysql:5.7']
runs-on: ${{ matrix.platform }}
@@ -51,7 +51,7 @@ jobs:
- run: go version

- name: Run Buf
uses: bufbuild/buf-setup-action@v1.45.0
uses: bufbuild/buf-setup-action@v1.48.0
- run: |
buf --version
buf generate
@@ -60,6 +60,6 @@ jobs:
run: go test ./... -v -covermode=atomic -race -coverprofile=coverage.txt

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Go Kratos Components

![Supported Go Versions](https://img.shields.io/badge/Go-%3E%3D1.21-blue)
![Supported Go Versions](https://img.shields.io/badge/Go-%3E%3D1.22.10-blue)
[![Package Version](https://badgen.net/github/release/go-kratos-ecosystem/components/stable)](https://github.com/go-kratos-ecosystem/components/releases)
[![GoDoc](https://pkg.go.dev/badge/github.com/go-kratos-ecosystem/v2)](https://pkg.go.dev/github.com/go-kratos-ecosystem/components/v2)
[![codecov](https://codecov.io/gh/go-kratos-ecosystem/components/graph/badge.svg?token=QPTHZ5L9GT)](https://codecov.io/gh/go-kratos-ecosystem/components)
4 changes: 2 additions & 2 deletions buf.gen.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
version: v2
plugins:
- remote: buf.build/protocolbuffers/go
out: genproto
out: internal/genproto
opt: paths=source_relative
- remote: buf.build/grpc/go
out: genproto
out: internal/
opt: paths=source_relative
2 changes: 1 addition & 1 deletion buf.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
version: v2
modules:
- path: proto
- path: internal/proto
deps:
- buf.build/bufbuild/protovalidate
lint:
19 changes: 14 additions & 5 deletions cache/redis/store.go
Original file line number Diff line number Diff line change
@@ -2,6 +2,8 @@ package redis

import (
"context"
"errors"
"strings"
"time"

"github.com/redis/go-redis/v9"
@@ -10,7 +12,7 @@ import (
"github.com/go-kratos-ecosystem/components/v2/codec"
"github.com/go-kratos-ecosystem/components/v2/codec/json"
"github.com/go-kratos-ecosystem/components/v2/locker"
redisLocker "github.com/go-kratos-ecosystem/components/v2/locker/redis"
redislocker "github.com/go-kratos-ecosystem/components/v2/locker/redis"
)

type Store struct {
@@ -29,7 +31,11 @@ type Option func(*options)
func Prefix(prefix string) Option {
return func(o *options) {
if prefix != "" {
o.prefix = prefix + ":"
if !strings.HasSuffix(prefix, ":") {
o.prefix = prefix + ":"
} else {
o.prefix = prefix
}
}
}
}
@@ -72,6 +78,9 @@ func (s *Store) Has(ctx context.Context, key string) (bool, error) {
func (s *Store) Get(ctx context.Context, key string, dest any) error {
r := s.redis.Get(ctx, s.opts.prefix+key)
if r.Err() != nil {
if errors.Is(r.Err(), redis.Nil) {
return cache.ErrNotFound
}
return r.Err()
}

@@ -161,8 +170,8 @@ func (s *Store) Add(ctx context.Context, key string, value any, ttl time.Duratio
}

func (s *Store) Lock(key string, ttl time.Duration) locker.Locker {
return redisLocker.NewLocker(s.redis,
redisLocker.WithName(s.opts.prefix+key),
redisLocker.WithTTL(ttl),
return redislocker.NewLocker(s.redis,
redislocker.WithName(s.opts.prefix+key),
redislocker.WithTTL(ttl),
)
}
70 changes: 55 additions & 15 deletions cache/redis/store_test.go
Original file line number Diff line number Diff line change
@@ -11,19 +11,34 @@ import (
"github.com/redis/go-redis/v9"
"github.com/stretchr/testify/assert"

"github.com/go-kratos-ecosystem/components/v2/cache"
"github.com/go-kratos-ecosystem/components/v2/codec/json"
"github.com/go-kratos-ecosystem/components/v2/locker"
)

func createRedis() redis.UniversalClient {
return redis.NewClient(&redis.Options{
var ctx = context.Background()

func createRedis(t *testing.T) redis.UniversalClient {
client := redis.NewClient(&redis.Options{
Addr: ":6379",
})
t.Cleanup(func() {
client.FlushAll(ctx)
})
return client
}

func TestRedis_Prefix(t *testing.T) {
opt := &options{}
Prefix("cache:test")(opt)
assert.Equal(t, "cache:test:", opt.prefix)

Prefix("cache:test:")(opt)
assert.Equal(t, "cache:test:", opt.prefix)
}

func TestRedis_Base(t *testing.T) {
store := New(createRedis(), Prefix("cache:redis"), Codec(json.Codec))
ctx := context.Background()
store := New(createRedis(t), Prefix("cache:redis"), Codec(json.Codec))

ok1, err := store.Put(ctx, "test", "test", time.Second)
assert.Nil(t, err)
@@ -45,8 +60,7 @@ func TestRedis_Base(t *testing.T) {
}

func TestRedis_IncrAndDecr(t *testing.T) {
store := New(createRedis(), Prefix("cache:redis"))
ctx := context.Background()
store := New(createRedis(t), Prefix("cache:redis"))

_, err := store.Forget(ctx, "test:inc")
assert.Nil(t, err)
@@ -62,12 +76,25 @@ func TestRedis_IncrAndDecr(t *testing.T) {
v3, err := store.Decrement(ctx, "test:inc", 1)
assert.Nil(t, err)
assert.Equal(t, 10, v3)

// put another type
ok1, err := store.Put(ctx, "test:inc:type", "test", time.Second*3)
assert.Nil(t, err)
assert.True(t, ok1)

v4, err := store.Increment(ctx, "test:inc:type", 1)
t.Log(err)
assert.Error(t, err)
assert.Zero(t, v4)

v5, err := store.Decrement(ctx, "test:inc:type", 1)
assert.Error(t, err)
assert.Zero(t, v5)
}

func TestRedis_Forever(t *testing.T) {
client := createRedis()
store := New(createRedis(), Prefix("cache:redis"))
ctx := context.Background()
client := createRedis(t)
store := New(createRedis(t), Prefix("cache:redis"))

ok1, err := store.Forever(ctx, "test:forever", "test")
assert.Nil(t, err)
@@ -80,8 +107,7 @@ func TestRedis_Forever(t *testing.T) {
}

func TestRedis_Flush(t *testing.T) {
store := New(createRedis(), Prefix("cache:redis"))
ctx := context.Background()
store := New(createRedis(t), Prefix("cache:redis"))

ok1, err := store.Put(ctx, "test:flush", "test", time.Second)
assert.Nil(t, err)
@@ -92,13 +118,12 @@ func TestRedis_Flush(t *testing.T) {
assert.True(t, ok2)

ok3, err := store.Has(ctx, "test:flush")
assert.Nil(t, err)
assert.NoError(t, err)
assert.False(t, ok3)
}

func TestRedis_Add(t *testing.T) {
store := New(createRedis(), Prefix("cache:redis"))
ctx := context.Background()
store := New(createRedis(t), Prefix("cache:redis"))

ok1, err := store.Add(ctx, "test:add", "test", time.Second)
assert.Nil(t, err)
@@ -115,7 +140,7 @@ func TestRedis_Add(t *testing.T) {
}

func TestRedis_Lock(t *testing.T) {
r := New(createRedis())
r := New(createRedis(t))
var wg sync.WaitGroup
var s int64

@@ -136,3 +161,18 @@ func TestRedis_Lock(t *testing.T) {
wg.Wait()
assert.True(t, s > 0)
}

func TestRedis_ErrNotFound(t *testing.T) {
store := New(createRedis(t), Prefix("cache:redis:notfound"))

// Has
ok1, err := store.Has(ctx, "test:notfound:has")
assert.Nil(t, err)
assert.False(t, ok1)

// Get
var v string
err = store.Get(ctx, "test:notfound:get", &v)
assert.True(t, errors.Is(err, cache.ErrNotFound))
assert.Empty(t, v)
}
24 changes: 0 additions & 24 deletions cache/repository.go
Original file line number Diff line number Diff line change
@@ -3,8 +3,6 @@ package cache
import (
"context"
"time"

"github.com/go-kratos-ecosystem/components/v2/helpers"
)

type Repository interface {
@@ -14,7 +12,6 @@ type Repository interface {
Missing(ctx context.Context, key string) (bool, error)
Delete(ctx context.Context, key string) (bool, error)
Set(ctx context.Context, key string, value any, ttl time.Duration) (bool, error)
Remember(ctx context.Context, key string, dest any, value func() any, ttl time.Duration) error
}

type repository struct {
@@ -63,24 +60,3 @@ func (r *repository) Delete(ctx context.Context, key string) (bool, error) {
func (r *repository) Set(ctx context.Context, key string, value any, ttl time.Duration) (bool, error) {
return r.Put(ctx, key, value, ttl)
}

func (r *repository) Remember(
ctx context.Context,
key string, dest any,
value func() any,
ttl time.Duration,
) error {
if missing, err := r.Missing(ctx, key); err != nil {
return err
} else if missing {
v := value()

if _, err := r.Set(ctx, key, v, ttl); err != nil {
return err
}

return helpers.Scan(v, dest)
}

return r.Get(ctx, key, dest)
}
5 changes: 0 additions & 5 deletions cache/repository_test.go
Original file line number Diff line number Diff line change
@@ -79,9 +79,4 @@ func TestRepository(t *testing.T) {
set, err := repo.Set(ctx, "test", "test", 0)
assert.Nil(t, err)
assert.True(t, set)

// Remember
assert.Nil(t, repo.Remember(ctx, "test", nil, func() any {
return "test"
}, 0))
}
53 changes: 53 additions & 0 deletions cache/snapshot.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package cache

import "sync"

type Snapshot[K comparable, V any] struct {
mu sync.RWMutex
data map[K]V
}

func (s *Snapshot[K, V]) Lookup(key K, fn func() V) V {
s.mu.RLock()
v, ok := s.data[key]
s.mu.RUnlock()
if !ok {
s.mu.Lock()
defer s.mu.Unlock()
if s.data == nil {
s.data = make(map[K]V)
}

if v, ok = s.data[key]; !ok {
v = fn()
s.data[key] = v
}
}
return v
}

type SnapshotWithErr[K comparable, V any] Snapshot[K, valueWithError[V]]

type valueWithError[V any] struct {
value V
err error
}

func (c *SnapshotWithErr[K, V]) Lookup(key K, fn func() (V, error)) (V, error) {
c.mu.RLock()
v, ok := c.data[key]
c.mu.RUnlock()
if !ok {
c.mu.Lock()
defer c.mu.Unlock()
if c.data == nil {
c.data = make(map[K]valueWithError[V])
}

if v, ok = c.data[key]; !ok {
v.value, v.err = fn()
c.data[key] = v
}
}
return v.value, v.err
}
Loading