Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf(compactor): optimize allocations: use buffer for priorities #2006

Merged

Conversation

deff7
Copy link
Contributor

@deff7 deff7 commented Sep 13, 2023

Problem

Badger allocates a lot of objects over time. I created a simple reproducer and measured allocations after 10 minutes of running it.

(pprof) top
Showing nodes accounting for 267006, 99.54% of 268253 total
Dropped 71 nodes (cum <= 1341)
Showing top 10 nodes out of 14
      flat  flat%   sum%        cum   cum%
    155255 57.88% 57.88%     155255 57.88%  github.com/dgraph-io/badger/v4.(*levelsController).pickCompactLevels.func1 (inline)
     65539 24.43% 82.31%      65539 24.43%  github.com/dgraph-io/badger/v4.(*levelsController).levelTargets
     43691 16.29% 98.60%     264485 98.60%  github.com/dgraph-io/badger/v4.(*levelsController).pickCompactLevels
      2521  0.94% 99.54%       2521  0.94%  os.(*File).Stat
         0     0% 99.54%     264485 98.60%  github.com/dgraph-io/badger/v4.(*levelsController).runCompactor
         0     0% 99.54%     264485 98.60%  github.com/dgraph-io/badger/v4.(*levelsController).runCompactor.func3
         0     0% 99.54%       2521  0.94%  github.com/dgraph-io/badger/v4.(*logFile).open
         0     0% 99.54%       2521  0.94%  github.com/dgraph-io/badger/v4.(*valueLog).open
         0     0% 99.54%       2528  0.94%  github.com/dgraph-io/badger/v4.Open
         0     0% 99.54%       2521  0.94%  github.com/dgraph-io/ristretto/z.OpenMmapFile
(pprof) sample_index=alloc_space
(pprof) top
Showing nodes accounting for 238.72MB, 98.59% of 242.14MB total
Dropped 51 nodes (cum <= 1.21MB)
Showing top 10 nodes out of 34
      flat  flat%   sum%        cum   cum%
  166.41MB 68.72% 68.72%   166.41MB 68.72%  github.com/dgraph-io/badger/v4/skl.newArena (inline)
   59.04MB 24.38% 93.10%    59.04MB 24.38%  github.com/dgraph-io/badger/v4.(*levelsController).pickCompactLevels.func1 (inline)
       4MB  1.65% 94.75%        4MB  1.65%  github.com/dgraph-io/ristretto/z.Calloc (inline)
       4MB  1.65% 96.41%        4MB  1.65%  github.com/dgraph-io/badger/v4.(*levelsController).levelTargets
    3.01MB  1.24% 97.65%     3.01MB  1.24%  github.com/google/flatbuffers/go.NewBuilder (inline)
    1.27MB  0.52% 98.17%     1.27MB  0.52%  github.com/dgraph-io/ristretto.newCmRow
       1MB  0.41% 98.59%    64.04MB 26.45%  github.com/dgraph-io/badger/v4.(*levelsController).pickCompactLevels
         0     0% 98.59%     7.01MB  2.89%  github.com/dgraph-io/badger/v4.(*DB).flushMemtable
         0     0% 98.59%     7.01MB  2.89%  github.com/dgraph-io/badger/v4.(*DB).handleMemTableFlush
         0     0% 98.59%    83.20MB 34.36%  github.com/dgraph-io/badger/v4.(*DB).newMemTable

We see that pickCompactLevels makes a pretty high number of allocations due to appending to slice over and over again:

(pprof) list pickCompactLevels
Total: 268253
ROUTINE ======================== github.com/dgraph-io/badger/v4.(*levelsController).pickCompactLevels in /Users/deff/go/pkg/mod/github.com/dgraph-io/badger/v4@v4.2.0/levels.go
     43691     264485 (flat, cum) 98.60% of Total
         .          .    539:func (s *levelsController) pickCompactLevels() (prios []compactionPriority) {
         .      65539    540:	t := s.levelTargets()
         .          .    541:	addPriority := func(level int, score float64) {
         .          .    542:		pri := compactionPriority{
         .          .    543:			level:    level,
         .          .    544:			score:    score,
         .          .    545:			adjusted: score,
         .          .    546:			t:        t,
         .          .    547:		}
         .          .    548:		prios = append(prios, pri)
         .          .    549:	}
         .          .    550:
         .          .    551:	// Add L0 priority based on the number of tables.
         .      42134    552:	addPriority(0, float64(s.levels[0].numTables())/float64(s.kv.opt.NumLevelZeroTables))
         .          .    553:
         .          .    554:	// All other levels use size to calculate priority.
         .          .    555:	for i := 1; i < len(s.levels); i++ {
         .          .    556:		// Don't consider those tables that are already being compacted right now.
         .          .    557:		delSize := s.cstatus.delSize(i)
         .          .    558:
         .          .    559:		l := s.levels[i]
         .          .    560:		sz := l.getTotalSize() - delSize
         .     113121    561:		addPriority(i, float64(sz)/float64(t.targetSz[i]))
         .          .    562:	}
         .          .    563:	y.AssertTrue(len(prios) == len(s.levels))
         .          .    564:
         .          .    565:	// The following code is borrowed from PebbleDB and results in healthier LSM tree structure.
         .          .    566:	// If Li-1 has score > 1.0, then we'll divide Li-1 score by Li. If Li score is >= 1.0, then Li-1
         .          .    567:	// score is reduced, which means we'll prioritize the compaction of lower levels (L5, L4 and so
         .          .    568:	// on) over the higher levels (L0, L1 and so on). On the other hand, if Li score is < 1.0, then
         .          .    569:	// we'll increase the priority of Li-1.
         .          .    570:	// Overall what this means is, if the bottom level is already overflowing, then de-prioritize
         .          .    571:	// compaction of the above level. If the bottom level is not full, then increase the priority of
         .          .    572:	// above level.
         .          .    573:	var prevLevel int
         .          .    574:	for level := t.baseLevel; level < len(s.levels); level++ {
         .          .    575:		if prios[prevLevel].adjusted >= 1 {
         .          .    576:			// Avoid absurdly large scores by placing a floor on the score that we'll
         .          .    577:			// adjust a level by. The value of 0.01 was chosen somewhat arbitrarily
         .          .    578:			const minScore = 0.01
         .          .    579:			if prios[level].score >= minScore {
         .          .    580:				prios[prevLevel].adjusted /= prios[level].adjusted
         .          .    581:			} else {
         .          .    582:				prios[prevLevel].adjusted /= minScore
         .          .    583:			}
         .          .    584:		}
         .          .    585:		prevLevel = level
         .          .    586:	}
         .          .    587:
         .          .    588:	// Pick all the levels whose original score is >= 1.0, irrespective of their adjusted score.
         .          .    589:	// We'll still sort them by their adjusted score below. Having both these scores allows us to
         .          .    590:	// make better decisions about compacting L0. If we see a score >= 1.0, we can do L0->L0
         .          .    591:	// compactions. If the adjusted score >= 1.0, then we can do L0->Lbase compactions.
         .          .    592:	out := prios[:0]
         .          .    593:	for _, p := range prios[:len(prios)-1] {
         .          .    594:		if p.score >= 1.0 {
         .          .    595:			out = append(out, p)
         .          .    596:		}
         .          .    597:	}
         .          .    598:	prios = out
         .          .    599:
         .          .    600:	// Sort by the adjusted score.
     43691      43691    601:	sort.Slice(prios, func(i, j int) bool {
         .          .    602:		return prios[i].adjusted > prios[j].adjusted
         .          .    603:	})
         .          .    604:	return prios
         .          .    605:}
         .          .    606:
ROUTINE ======================== github.com/dgraph-io/badger/v4.(*levelsController).pickCompactLevels.func1 in /Users/deff/go/pkg/mod/github.com/dgraph-io/badger/v4@v4.2.0/levels.go
    155255     155255 (flat, cum) 57.88% of Total
         .          .    541:	addPriority := func(level int, score float64) {
         .          .    542:		pri := compactionPriority{
         .          .    543:			level:    level,
         .          .    544:			score:    score,
         .          .    545:			adjusted: score,
         .          .    546:			t:        t,
         .          .    547:		}
    155255     155255    548:		prios = append(prios, pri)
         .          .    549:	}
         .          .    550:
         .          .    551:	// Add L0 priority based on the number of tables.
         .          .    552:	addPriority(0, float64(s.levels[0].numTables())/float64(s.kv.opt.NumLevelZeroTables))
         .          .    553:

Solution

I suggest two optimizations:

  1. Pre-allocate prios capacity according to numbers of s.levels
  2. Reuse prios memory in compaction process, thanks to one-threaded logic of compactor

Results after optimization (10 min run of reproducer):

(pprof) top
Showing nodes accounting for 165466, 99.84% of 165735 total
Dropped 27 nodes (cum <= 828)
Showing top 10 nodes out of 48
      flat  flat%   sum%        cum   cum%
     40962 24.72% 24.72%      40962 24.72%  github.com/dgraph-io/badger/v4.(*levelsController).levelTargets
     32768 19.77% 44.49%      32768 19.77%  github.com/dgraph-io/badger/v4/skl.(*Arena).putNode
     32768 19.77% 64.26%      32768 19.77%  github.com/dgraph-io/badger/v4/y.KeyWithTs (inline)
     21845 13.18% 77.44%      62807 37.90%  github.com/dgraph-io/badger/v4.(*levelsController).pickCompactLevels
     21845 13.18% 90.62%      21845 13.18%  github.com/dgraph-io/badger/v4.(*logFile).encodeEntry
      8192  4.94% 95.56%       8192  4.94%  github.com/dgraph-io/badger/v4/table.(*Builder).addHelper
      4681  2.82% 98.39%       4681  2.82%  regexp/syntax.(*Regexp).Simplify
      2341  1.41% 99.80%       2341  1.41%  runtime/pprof.allFrames
        64 0.039% 99.84%      32832 19.81%  github.com/dgraph-io/badger/v4.(*Txn).commitAndSend
         0     0% 99.84%      32832 19.81%  github.com/dgraph-io/badger/v4.(*DB).Update
(pprof) sample_index=alloc_space
(pprof) top
Showing nodes accounting for 180.47MB, 97.79% of 184.54MB total
Dropped 22 nodes (cum <= 0.92MB)
Showing top 10 nodes out of 53
      flat  flat%   sum%        cum   cum%
  166.41MB 90.17% 90.17%   166.41MB 90.17%  github.com/dgraph-io/badger/v4/skl.newArena
       4MB  2.17% 92.34%        4MB  2.17%  github.com/dgraph-io/ristretto/z.Calloc
    3.01MB  1.63% 93.97%     3.01MB  1.63%  github.com/google/flatbuffers/go.NewBuilder
    2.50MB  1.35% 95.32%     2.50MB  1.35%  github.com/dgraph-io/badger/v4.(*levelsController).levelTargets
    1.76MB  0.96% 96.28%     2.97MB  1.61%  compress/flate.NewWriter (inline)
    1.16MB  0.63% 96.91%     1.16MB  0.63%  github.com/dgraph-io/ristretto/z.(*Bloom).Size
    0.64MB  0.34% 97.25%     1.20MB  0.65%  compress/flate.(*compressor).init
    0.50MB  0.27% 97.52%        1MB  0.54%  github.com/dgraph-io/badger/v4.(*Txn).commitAndSend
    0.50MB  0.27% 97.79%        3MB  1.63%  github.com/dgraph-io/badger/v4.(*levelsController).pickCompactLevels
         0     0% 97.79%     2.97MB  1.61%  compress/gzip.(*Writer).Write

And inside pickCompactLevels:

ROUTINE ======================== github.com/dgraph-io/badger/v4.(*levelsController).pickCompactLevels in /Users/deff/dev/work/badger/levels.go
     21845      62807 (flat, cum) 37.90% of Total
         .          .    544:func (s *levelsController) pickCompactLevels(prios []compactionPriority) []compactionPriority {
         .      40962    545:	t := s.levelTargets()
         .          .    546:	addPriority := func(level int, score float64) {
         .          .    547:		pri := compactionPriority{
         .          .    548:			level:    level,
         .          .    549:			score:    score,
         .          .    550:			adjusted: score,
         .          .    551:			t:        t,
         .          .    552:		}
         .          .    553:		prios = append(prios, pri)
         .          .    554:	}
         .          .    555:
         .          .    556:	if cap(prios) < len(s.levels) {
         .          .    557:		prios = make([]compactionPriority, 0, len(s.levels))
         .          .    558:	}
         .          .    559:	prios = prios[:0]
         .          .    560:
         .          .    561:	// Add L0 priority based on the number of tables.
         .          .    562:	addPriority(0, float64(s.levels[0].numTables())/float64(s.kv.opt.NumLevelZeroTables))
         .          .    563:
         .          .    564:	// All other levels use size to calculate priority.
         .          .    565:	for i := 1; i < len(s.levels); i++ {
         .          .    566:		// Don't consider those tables that are already being compacted right now.
         .          .    567:		delSize := s.cstatus.delSize(i)
         .          .    568:
         .          .    569:		l := s.levels[i]
         .          .    570:		sz := l.getTotalSize() - delSize
         .          .    571:		addPriority(i, float64(sz)/float64(t.targetSz[i]))
         .          .    572:	}
         .          .    573:	y.AssertTrue(len(prios) == len(s.levels))
         .          .    574:
         .          .    575:	// The following code is borrowed from PebbleDB and results in healthier LSM tree structure.
         .          .    576:	// If Li-1 has score > 1.0, then we'll divide Li-1 score by Li. If Li score is >= 1.0, then Li-1
         .          .    577:	// score is reduced, which means we'll prioritize the compaction of lower levels (L5, L4 and so
         .          .    578:	// on) over the higher levels (L0, L1 and so on). On the other hand, if Li score is < 1.0, then
         .          .    579:	// we'll increase the priority of Li-1.
         .          .    580:	// Overall what this means is, if the bottom level is already overflowing, then de-prioritize
         .          .    581:	// compaction of the above level. If the bottom level is not full, then increase the priority of
         .          .    582:	// above level.
         .          .    583:	var prevLevel int
         .          .    584:	for level := t.baseLevel; level < len(s.levels); level++ {
         .          .    585:		if prios[prevLevel].adjusted >= 1 {
         .          .    586:			// Avoid absurdly large scores by placing a floor on the score that we'll
         .          .    587:			// adjust a level by. The value of 0.01 was chosen somewhat arbitrarily
         .          .    588:			const minScore = 0.01
         .          .    589:			if prios[level].score >= minScore {
         .          .    590:				prios[prevLevel].adjusted /= prios[level].adjusted
         .          .    591:			} else {
         .          .    592:				prios[prevLevel].adjusted /= minScore
         .          .    593:			}
         .          .    594:		}
         .          .    595:		prevLevel = level
         .          .    596:	}
         .          .    597:
         .          .    598:	// Pick all the levels whose original score is >= 1.0, irrespective of their adjusted score.
         .          .    599:	// We'll still sort them by their adjusted score below. Having both these scores allows us to
         .          .    600:	// make better decisions about compacting L0. If we see a score >= 1.0, we can do L0->L0
         .          .    601:	// compactions. If the adjusted score >= 1.0, then we can do L0->Lbase compactions.
         .          .    602:	out := prios[:0]
         .          .    603:	for _, p := range prios[:len(prios)-1] {
         .          .    604:		if p.score >= 1.0 {
         .          .    605:			out = append(out, p)
         .          .    606:		}
         .          .    607:	}
         .          .    608:	prios = out
         .          .    609:
         .          .    610:	// Sort by the adjusted score.
     21845      21845    611:	sort.Slice(prios, func(i, j int) bool {
         .          .    612:		return prios[i].adjusted > prios[j].adjusted
         .          .    613:	})
         .          .    614:	return prios
         .          .    615:}
         .          .    616:

Profile from real project

Both profiles are measured after 30 minutes from application start

Before optimization:

(pprof) top
Showing nodes accounting for 621.02MB, 85.32% of 727.90MB total
Dropped 550 nodes (cum <= 3.64MB)
Showing top 10 nodes out of 146
      flat  flat%   sum%        cum   cum%
  380.72MB 52.30% 52.30%   380.72MB 52.30%  github.com/dgraph-io/badger/v3.(*levelsController).pickCompactLevels.func1
  104.01MB 14.29% 66.59%   104.01MB 14.29%  github.com/dgraph-io/badger/v3/skl.newArena
   33.27MB  4.57% 71.16%    33.27MB  4.57%  github.com/dgraph-io/ristretto.newCmRow
   27.05MB  3.72% 74.88%    27.05MB  3.72%  github.com/dgraph-io/badger/v3/y.SafeCopy
   23.50MB  3.23% 78.11%    23.50MB  3.23%  github.com/dgraph-io/badger/v3.(*levelsController).levelTargets
   18.31MB  2.52% 80.62%    18.31MB  2.52%  github.com/dgraph-io/ristretto/z.(*Bloom).Size
   18.02MB  2.48% 83.10%    18.02MB  2.48%  github.com/dgraph-io/badger/v3/y.(*Slice).Resize
       8MB  1.10% 84.20%   412.23MB 56.63%  github.com/dgraph-io/badger/v3.(*levelsController).pickCompactLevels
    4.12MB  0.57% 84.77%     8.13MB  1.12%  github.com/blevesearch/vellum.(*FSTIterator).next
       4MB  0.55% 85.32%        4MB  0.55%  github.com/blevesearch/vellum.(*decoderV1).stateAt

After optimization:

Type: alloc_space
Time: Sep 11, 2023 at 5:50pm (+05)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) top
Showing nodes accounting for 262.17MB, 66.88% of 391.99MB total
Dropped 453 nodes (cum <= 1.96MB)
Showing top 10 nodes out of 290
      flat  flat%   sum%        cum   cum%
  104.01MB 26.53% 26.53%   104.01MB 26.53%  github.com/dgraph-io/badger/v3/skl.newArena
   33.91MB  8.65% 35.18%    33.91MB  8.65%  github.com/dgraph-io/ristretto.newCmRow
   28.50MB  7.27% 42.45%    28.50MB  7.27%  github.com/dgraph-io/badger/v3.(*levelsController).levelTargets
   26.52MB  6.77% 49.22%    26.52MB  6.77%  github.com/dgraph-io/badger/v3/y.(*Slice).Resize
   25.03MB  6.38% 55.61%    25.03MB  6.38%  github.com/dgraph-io/badger/v3/y.SafeCopy
   17.16MB  4.38% 59.98%    17.16MB  4.38%  github.com/dgraph-io/ristretto/z.(*Bloom).Size
    7.12MB  1.82% 61.80%     9.12MB  2.33%  github.com/anyproto/go-chash.(*cHash).addMembers
    6.72MB  1.72% 63.51%    12.22MB  3.12%  github.com/blevesearch/vellum.(*FSTIterator).next
    6.71MB  1.71% 65.22%     6.71MB  1.71%  bytes.growSlice
    6.50MB  1.66% 66.88%     6.50MB  1.66%  github.com/blevesearch/vellum.(*builderNodePool).Get

Reproducer

package main

import (
	"fmt"
	"os"
	"github.com/dgraph-io/badger/v4"
	_ "net/http/pprof"
	"net/http"
	"log"
)

func generateItems(db *badger.DB, n int) error {
	return db.Update(func(txn *badger.Txn) error {
		for i := 0; i < n; i++ {
			err := txn.Set([]byte(fmt.Sprintf("key-%d", i)), []byte(fmt.Sprintf("value-%d", i)))
			if err != nil {
				return err
			}
		}
		return nil
	})
}

func run() error {
	forever := make(chan struct{})

	db, err := badger.Open(badger.DefaultOptions("./tmp"))
	if err != nil {
		return fmt.Errorf("open badger: %w", err)
	}
	err = generateItems(db, 1000)
	if err != nil {
		return fmt.Errorf("generate items: %w", err)
	}

	go func() {
		log.Println(http.ListenAndServe("localhost:9000", nil))
	}()

	<-forever
	return nil
}

func main() {
	err := run()
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
}

@CLAassistant
Copy link

CLAassistant commented Sep 13, 2023

CLA assistant check
All committers have signed the CLA.

@netlify
Copy link

netlify bot commented Sep 13, 2023

Deploy Preview for badger-docs canceled.

Name Link
🔨 Latest commit c06d7eb
🔍 Latest deploy log https://app.netlify.com/sites/badger-docs/deploys/6501793878d0300008401d9a

@harshil-goel
Copy link
Contributor

Thanks a lot for the diff. From what I understand you are trying to reuse the memory of the levels object, not their values correct? Do you a SyncPool might be able to do the trick better?

@deff7
Copy link
Contributor Author

deff7 commented Sep 13, 2023

Thanks a lot for the diff. From what I understand you are trying to reuse the memory of the levels object, not their values correct? Do you a SyncPool might be able to do the trick better?

Hello! I'm trying to reuse the whole slice of values. Fortunately, as far as I know, all the values from this slice are used after runOnce completes and no single value escapes the routine.

I prefer using simple buffer reusing technique over sync.Pool, because it more straightforward and controllable, also we don't have any concurrency here

@mangalaman93 mangalaman93 merged commit fb1b009 into dgraph-io:main Oct 13, 2023
12 checks passed
charithe added a commit to cerbos/cerbos that referenced this pull request Sep 2, 2024
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence | Type |
Update |
|---|---|---|---|---|---|---|---|
|
[github.com/Masterminds/sprig/v3](https://redirect.github.com/Masterminds/sprig)
| `v3.2.3` -> `v3.3.0` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fMasterminds%2fsprig%2fv3/v3.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2fMasterminds%2fsprig%2fv3/v3.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2fMasterminds%2fsprig%2fv3/v3.2.3/v3.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fMasterminds%2fsprig%2fv3/v3.2.3/v3.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| require | minor |
|
[github.com/aws/aws-sdk-go-v2/config](https://redirect.github.com/aws/aws-sdk-go-v2)
| `v1.27.30` -> `v1.27.31` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2faws%2faws-sdk-go-v2%2fconfig/v1.27.31?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2faws%2faws-sdk-go-v2%2fconfig/v1.27.31?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2faws%2faws-sdk-go-v2%2fconfig/v1.27.30/v1.27.31?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2faws%2faws-sdk-go-v2%2fconfig/v1.27.30/v1.27.31?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| require | patch |
| [github.com/bufbuild/buf](https://redirect.github.com/bufbuild/buf) |
`v1.38.0` -> `v1.39.0` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fbufbuild%2fbuf/v1.39.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2fbufbuild%2fbuf/v1.39.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2fbufbuild%2fbuf/v1.38.0/v1.39.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fbufbuild%2fbuf/v1.38.0/v1.39.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| require | minor |
|
[github.com/bufbuild/protovalidate-go](https://redirect.github.com/bufbuild/protovalidate-go)
| `v0.6.4` -> `v0.6.5` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fbufbuild%2fprotovalidate-go/v0.6.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2fbufbuild%2fprotovalidate-go/v0.6.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2fbufbuild%2fprotovalidate-go/v0.6.4/v0.6.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fbufbuild%2fprotovalidate-go/v0.6.4/v0.6.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| require | patch |
|
[github.com/cerbos/cloud-api](https://redirect.github.com/cerbos/cloud-api)
| `v0.1.23` -> `v0.1.24` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcerbos%2fcloud-api/v0.1.24?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2fcerbos%2fcloud-api/v0.1.24?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2fcerbos%2fcloud-api/v0.1.23/v0.1.24?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcerbos%2fcloud-api/v0.1.23/v0.1.24?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| require | patch |
|
[github.com/dadav/helm-schema](https://redirect.github.com/dadav/helm-schema)
| `4e067df` -> `f205574` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fdadav%2fhelm-schema/v0.0.0-20240831174639-f2055746722e?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2fdadav%2fhelm-schema/v0.0.0-20240831174639-f2055746722e?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2fdadav%2fhelm-schema/v0.0.0-20240817173722-4e067df209ea/v0.0.0-20240831174639-f2055746722e?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fdadav%2fhelm-schema/v0.0.0-20240817173722-4e067df209ea/v0.0.0-20240831174639-f2055746722e?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| require | digest |
|
[github.com/dgraph-io/badger/v4](https://redirect.github.com/dgraph-io/badger)
| `v4.2.0` -> `v4.3.0` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fdgraph-io%2fbadger%2fv4/v4.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2fdgraph-io%2fbadger%2fv4/v4.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2fdgraph-io%2fbadger%2fv4/v4.2.0/v4.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fdgraph-io%2fbadger%2fv4/v4.2.0/v4.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| require | minor |
|
[github.com/fergusstrange/embedded-postgres](https://redirect.github.com/fergusstrange/embedded-postgres)
| `v1.28.0` -> `v1.29.0` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2ffergusstrange%2fembedded-postgres/v1.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2ffergusstrange%2fembedded-postgres/v1.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2ffergusstrange%2fembedded-postgres/v1.28.0/v1.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2ffergusstrange%2fembedded-postgres/v1.28.0/v1.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| require | minor |
| [github.com/rs/cors](https://redirect.github.com/rs/cors) | `v1.11.0`
-> `v1.11.1` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2frs%2fcors/v1.11.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2frs%2fcors/v1.11.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2frs%2fcors/v1.11.0/v1.11.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2frs%2fcors/v1.11.0/v1.11.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| require | patch |
|
[google.golang.org/genproto/googleapis/api](https://redirect.github.com/googleapis/go-genproto)
| `4ba0660` -> `7e3bb23` |
[![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fgenproto%2fgoogleapis%2fapi/v0.0.0-20240827150818-7e3bb234dfed?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/google.golang.org%2fgenproto%2fgoogleapis%2fapi/v0.0.0-20240827150818-7e3bb234dfed?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/google.golang.org%2fgenproto%2fgoogleapis%2fapi/v0.0.0-20240823204242-4ba0660f739c/v0.0.0-20240827150818-7e3bb234dfed?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fgenproto%2fgoogleapis%2fapi/v0.0.0-20240823204242-4ba0660f739c/v0.0.0-20240827150818-7e3bb234dfed?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| require | digest |
| [google.golang.org/grpc](https://redirect.github.com/grpc/grpc-go) |
`v1.65.0` -> `v1.66.0` |
[![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fgrpc/v1.66.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/google.golang.org%2fgrpc/v1.66.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/google.golang.org%2fgrpc/v1.65.0/v1.66.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fgrpc/v1.65.0/v1.66.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| require | minor |

---

### Release Notes

<details>
<summary>Masterminds/sprig (github.com/Masterminds/sprig/v3)</summary>

###
[`v3.3.0`](https://redirect.github.com/Masterminds/sprig/releases/tag/v3.3.0)

[Compare
Source](https://redirect.github.com/Masterminds/sprig/compare/v3.2.3...v3.3.0)

#### What's Changed

- Updating the Go versions used in testing by
[@&#8203;mattfarina](https://redirect.github.com/mattfarina) in
[Masterminds/sprig#405
- Change intial to initial. by
[@&#8203;chrishalbert](https://redirect.github.com/chrishalbert) in
[Masterminds/sprig#391
- Updating dependencies by
[@&#8203;mattfarina](https://redirect.github.com/mattfarina) in
[Masterminds/sprig#404
- correct value by
[@&#8203;jheyduk](https://redirect.github.com/jheyduk) in
[Masterminds/sprig#376
- Updating location of mergo by
[@&#8203;mattfarina](https://redirect.github.com/mattfarina) in
[Masterminds/sprig#406
- feature: added sha512sum function by
[@&#8203;itzik-elayev](https://redirect.github.com/itzik-elayev) in
[Masterminds/sprig#400
- docs: Add missing link to url functions by
[@&#8203;carlpett](https://redirect.github.com/carlpett) in
[Masterminds/sprig#375
- Update doc.go by [@&#8203;chey](https://redirect.github.com/chey) in
[Masterminds/sprig#369
- Update mathf.md by
[@&#8203;zzhu41](https://redirect.github.com/zzhu41) in
[Masterminds/sprig#290
- Removing duplicate documentation by
[@&#8203;mattfarina](https://redirect.github.com/mattfarina) in
[Masterminds/sprig#407
- Updating the changelog for the 3.3.0 release by
[@&#8203;mattfarina](https://redirect.github.com/mattfarina) in
[Masterminds/sprig#408

#### New Contributors

- [@&#8203;chrishalbert](https://redirect.github.com/chrishalbert) made
their first contribution in
[Masterminds/sprig#391
- [@&#8203;jheyduk](https://redirect.github.com/jheyduk) made their
first contribution in
[Masterminds/sprig#376
- [@&#8203;itzik-elayev](https://redirect.github.com/itzik-elayev) made
their first contribution in
[Masterminds/sprig#400
- [@&#8203;carlpett](https://redirect.github.com/carlpett) made their
first contribution in
[Masterminds/sprig#375
- [@&#8203;chey](https://redirect.github.com/chey) made their first
contribution in
[Masterminds/sprig#369
- [@&#8203;zzhu41](https://redirect.github.com/zzhu41) made their first
contribution in
[Masterminds/sprig#290

**Full Changelog**:
Masterminds/sprig@v3.2.3...v3.3.0

</details>

<details>
<summary>bufbuild/buf (github.com/bufbuild/buf)</summary>

###
[`v1.39.0`](https://redirect.github.com/bufbuild/buf/blob/HEAD/CHANGELOG.md#v1390---2024-08-27)

[Compare
Source](https://redirect.github.com/bufbuild/buf/compare/v1.38.0...v1.39.0)

-   Fix git input handling of relative HEAD refs without branch names.
- Add `includes` key to module configurations in v2 `buf.yaml`,
accepting a list of directories.
- If `includes` is specified, a proto file is considered in the module
only if it is in one of the
        directories specified.
- If both `includes` and `excludes` keys are specified for a module, a
proto file is considered
part of this module if it is contained in any of the include paths and
not in any of the exclude
        paths.
- Allow multiple module configurations in the same v2 `buf.yaml` to have
the same directory path.

</details>

<details>
<summary>bufbuild/protovalidate-go
(github.com/bufbuild/protovalidate-go)</summary>

###
[`v0.6.5`](https://redirect.github.com/bufbuild/protovalidate-go/releases/tag/v0.6.5)

[Compare
Source](https://redirect.github.com/bufbuild/protovalidate-go/compare/v0.6.4...v0.6.5)

#### What's Changed

- Add `buf.gen.yaml` v2 schema example by
[@&#8203;milas](https://redirect.github.com/milas) in
[bufbuild/protovalidate-go#138
- Upgrade to support Go 1.23 by
[@&#8203;rodaine](https://redirect.github.com/rodaine) in
[bufbuild/protovalidate-go#139
- Remove Go 1.20 support by
[@&#8203;rodaine](https://redirect.github.com/rodaine) in
[bufbuild/protovalidate-go#140
- Bugfix: avoid spurious tautology pruning when dealing with certain
recursive messages by
[@&#8203;rodaine](https://redirect.github.com/rodaine) in
[bufbuild/protovalidate-go#142

#### New Contributors

- [@&#8203;milas](https://redirect.github.com/milas) made their first
contribution in
[bufbuild/protovalidate-go#138

**Full Changelog**:
bufbuild/protovalidate-go@v0.6.4...v0.6.5

</details>

<details>
<summary>cerbos/cloud-api (github.com/cerbos/cloud-api)</summary>

###
[`v0.1.24`](https://redirect.github.com/cerbos/cloud-api/releases/tag/v0.1.24)

[Compare
Source](https://redirect.github.com/cerbos/cloud-api/compare/v0.1.23...v0.1.24)


[v0.1.24](https://redirect.github.com/cerbos/cloud-api/releases/tag/v0.1.24)

</details>

<details>
<summary>dgraph-io/badger (github.com/dgraph-io/badger/v4)</summary>

###
[`v4.3.0`](https://redirect.github.com/dgraph-io/badger/releases/tag/v4.3.0):
Badger v4.3.0

[Compare
Source](https://redirect.github.com/dgraph-io/badger/compare/v4.2.0...v4.3.0)

#### What's Changed

Fixes:

- chore(changelog): add a missed entry in CHANGELOG for v4.2.0 by
[@&#8203;mangalaman93](https://redirect.github.com/mangalaman93) in
[dgraph-io/badger#1988
- update README with project KVS using badger by
[@&#8203;tauraamui](https://redirect.github.com/tauraamui) in
[dgraph-io/badger#1989
- fix edge case for watermark when index is zero by
[@&#8203;mangalaman93](https://redirect.github.com/mangalaman93) in
[dgraph-io/badger#1999
- upgrade spf13/cobra to version v1.7.0 by
[@&#8203;mangalaman93](https://redirect.github.com/mangalaman93) in
[dgraph-io/badger#2001
- chore: update readme by
[@&#8203;joshua-goldstein](https://redirect.github.com/joshua-goldstein)
in
[dgraph-io/badger#2011
- perf: upgrade compress package test and benchmark. by
[@&#8203;siddhant2001](https://redirect.github.com/siddhant2001) in
[dgraph-io/badger#2009
- fix(Transactions): Fix resource consumption on empty write transaction
by [@&#8203;Zach-Johnson](https://redirect.github.com/Zach-Johnson) in
[dgraph-io/badger#2018
- chore(deps): bump golang.org/x/net from 0.7.0 to 0.17.0 by
[@&#8203;dependabot](https://redirect.github.com/dependabot) in
[dgraph-io/badger#2017
- perf(compactor): optimize allocations: use buffer for priorities by
[@&#8203;deff7](https://redirect.github.com/deff7) in
[dgraph-io/badger#2006
- fix(Transaction): discard empty transactions on CommitWith by
[@&#8203;Wondertan](https://redirect.github.com/Wondertan) in
[dgraph-io/badger#2031
- fix(levelHandler): use lock for levelHandler sort tables instead of
rlock by [@&#8203;xgzlucario](https://redirect.github.com/xgzlucario) in
[dgraph-io/badger#2034
- Docs: update README with project LLS using badger by
[@&#8203;Boc-chi-no](https://redirect.github.com/Boc-chi-no) in
[dgraph-io/badger#2032
- chore: MaxTableSize has been renamed to BaseTableSize by
[@&#8203;mitar](https://redirect.github.com/mitar) in
[dgraph-io/badger#2038
- Update CODEOWNERS by
[@&#8203;ryanfoxtyler](https://redirect.github.com/ryanfoxtyler) in
[dgraph-io/badger#2043
- Chore(): add Stale Action by
[@&#8203;ryanfoxtyler](https://redirect.github.com/ryanfoxtyler) in
[dgraph-io/badger#2070
- Update ristretto and refactor for use of generics by
[@&#8203;paralin](https://redirect.github.com/paralin) in
[dgraph-io/badger#2047
- chore: Remove obsolete comment by
[@&#8203;mitar](https://redirect.github.com/mitar) in
[dgraph-io/badger#2039
- chore(Docs): Update jQuery 3.2.1 to 3.7.1 by
[@&#8203;kokizzu](https://redirect.github.com/kokizzu) in
[dgraph-io/badger#2023
- chore(deps): bump the go_modules group with 3 updates by
[@&#8203;dependabot](https://redirect.github.com/dependabot) in
[dgraph-io/badger#2074
- docs(): update docs path by
[@&#8203;ryanfoxtyler](https://redirect.github.com/ryanfoxtyler) in
[dgraph-io/badger#2076
- perf: fix operation in seek by
[@&#8203;harshil-goel](https://redirect.github.com/harshil-goel) in
[dgraph-io/badger#2077
- Add lakeFS to README.md by
[@&#8203;N-o-Z](https://redirect.github.com/N-o-Z) in
[dgraph-io/badger#2078
- chore(): add Dependabot by
[@&#8203;ryanfoxtyler](https://redirect.github.com/ryanfoxtyler) in
[dgraph-io/badger#2080
- chore(deps): bump golangci/golangci-lint-action from 4 to 6 by
[@&#8203;dependabot](https://redirect.github.com/dependabot) in
[dgraph-io/badger#2083
- chore(deps): bump actions/upload-artifact from 3 to 4 by
[@&#8203;dependabot](https://redirect.github.com/dependabot) in
[dgraph-io/badger#2081
- chore(deps): bump github/codeql-action from 2 to 3 by
[@&#8203;dependabot](https://redirect.github.com/dependabot) in
[dgraph-io/badger#2082
- chore(deps): bump the minor group with 7 updates by
[@&#8203;dependabot](https://redirect.github.com/dependabot) in
[dgraph-io/badger#2089
- Action Manager by
[@&#8203;madhu72](https://redirect.github.com/madhu72) in
[dgraph-io/badger#2050
- chore(deps): bump golang.org/x/sys from 0.23.0 to 0.24.0 in the minor
group by [@&#8203;dependabot](https://redirect.github.com/dependabot) in
[dgraph-io/badger#2091
- chore(deps): bump github.com/golang/protobuf from 1.5.3 to 1.5.4 in
the patch group by
[@&#8203;dependabot](https://redirect.github.com/dependabot) in
[dgraph-io/badger#2090
- chore: fix some comments by
[@&#8203;dufucun](https://redirect.github.com/dufucun) in
[dgraph-io/badger#2092
- chore(deps): bump github.com/google/flatbuffers from 1.12.1 to
24.3.25+incompatible by
[@&#8203;dependabot](https://redirect.github.com/dependabot) in
[dgraph-io/badger#2084

CI:

- ci: change cron frequency to fix ghost jobs by
[@&#8203;joshua-goldstein](https://redirect.github.com/joshua-goldstein)
in
[dgraph-io/badger#2010
- fix(CI): Update to pull_request trigger by
[@&#8203;ryanfoxtyler](https://redirect.github.com/ryanfoxtyler) in
[dgraph-io/badger#2056
- ci/cd optimization by
[@&#8203;ryanfoxtyler](https://redirect.github.com/ryanfoxtyler) in
[dgraph-io/badger#2051
- fix(cd): fixed cd pipeline by
[@&#8203;harshil-goel](https://redirect.github.com/harshil-goel) in
[dgraph-io/badger#2093
- fix(cd): change name by
[@&#8203;harshil-goel](https://redirect.github.com/harshil-goel) in
[dgraph-io/badger#2094
- fix(cd): added more debug things to cd by
[@&#8203;harshil-goel](https://redirect.github.com/harshil-goel) in
[dgraph-io/badger#2095
- fix(cd): removing some debug items by
[@&#8203;harshil-goel](https://redirect.github.com/harshil-goel) in
[dgraph-io/badger#2096

**Full Changelog**:
dgraph-io/badger@v4.2.0...v4.3.0

</details>

<details>
<summary>fergusstrange/embedded-postgres
(github.com/fergusstrange/embedded-postgres)</summary>

###
[`v1.29.0`](https://redirect.github.com/fergusstrange/embedded-postgres/releases/tag/v1.29.0)

[Compare
Source](https://redirect.github.com/fergusstrange/embedded-postgres/compare/v1.28.0...v1.29.0)

#### What's Changed

- Update versions by
[@&#8203;fergusstrange](https://redirect.github.com/fergusstrange) in
[fergusstrange/embedded-postgres#142
**Full Changelog**:
fergusstrange/embedded-postgres@v1.28.0...v1.29.0

</details>

<details>
<summary>rs/cors (github.com/rs/cors)</summary>

###
[`v1.11.1`](https://redirect.github.com/rs/cors/compare/v1.11.0...v1.11.1)

[Compare
Source](https://redirect.github.com/rs/cors/compare/v1.11.0...v1.11.1)

</details>

<details>
<summary>grpc/grpc-go (google.golang.org/grpc)</summary>

###
[`v1.66.0`](https://redirect.github.com/grpc/grpc-go/releases/tag/v1.66.0):
Release 1.66.0

[Compare
Source](https://redirect.github.com/grpc/grpc-go/compare/v1.65.0...v1.66.0)

### New Features

- metadata: stabilize `ValueFromIncomingContext`
([#&#8203;7368](https://redirect.github.com/grpc/grpc-go/issues/7368))
- Special Thanks:
[@&#8203;KarthikReddyPuli](https://redirect.github.com/KarthikReddyPuli)
- client: stabilize the `WaitForStateChange` and `GetState` methods,
which were previously experimental.
([#&#8203;7425](https://redirect.github.com/grpc/grpc-go/issues/7425))
- xds: Implement ADS flow control mechanism
([#&#8203;7458](https://redirect.github.com/grpc/grpc-go/issues/7458))
- See
[grpc/grpc#34099
for context.
- balancer/rls: Add metrics for data cache and picker internals
([#&#8203;7484](https://redirect.github.com/grpc/grpc-go/issues/7484),
[#&#8203;7495](https://redirect.github.com/grpc/grpc-go/issues/7495))
- xds: LRS load reports now include the `total_issued_requests` field.
([#&#8203;7544](https://redirect.github.com/grpc/grpc-go/issues/7544))

### Bug Fixes

- grpc: Clients now return status code INTERNAL instead of UNIMPLEMENTED
when the server uses an unsupported compressor. This is consistent with
the [gRPC compression
spec](https://redirect.github.com/grpc/grpc/blob/master/doc/compression.md#compression-method-asymmetry-between-peers).
([#&#8203;7461](https://redirect.github.com/grpc/grpc-go/issues/7461))
- Special Thanks:
[@&#8203;Gayathri625](https://redirect.github.com/Gayathri625)
- transport: Fix a bug which could result in writes busy looping when
the underlying `conn.Write` returns errors
([#&#8203;7394](https://redirect.github.com/grpc/grpc-go/issues/7394))
- Special Thanks: [@&#8203;veshij](https://redirect.github.com/veshij)
- client: fix race that could lead to orphaned connections and
associated resources.
([#&#8203;7390](https://redirect.github.com/grpc/grpc-go/issues/7390))
- xds: use locality from the connected address for load reporting with
pick_first
([#&#8203;7378](https://redirect.github.com/grpc/grpc-go/issues/7378))
- without this fix, if a priority contains multiple localities with
pick_first, load was reported for the wrong locality
- client: prevent hanging during ClientConn.Close() when the network is
unreachable
([#&#8203;7540](https://redirect.github.com/grpc/grpc-go/issues/7540))

### Performance Improvements

- transport: double buffering is avoided when using an http connect
proxy and the target server waits for client to send the first message.
([#&#8203;7424](https://redirect.github.com/grpc/grpc-go/issues/7424))
- codec: Implement a new `Codec` which uses buffer recycling for encoded
message
([#&#8203;7356](https://redirect.github.com/grpc/grpc-go/issues/7356))
- introduce a `mem` package to facilitate buffer reuse
([#&#8203;7432](https://redirect.github.com/grpc/grpc-go/issues/7432))
- Special Thanks:
[@&#8203;PapaCharlie](https://redirect.github.com/PapaCharlie)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/cerbos/cerbos).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC41Ni4wIiwidXBkYXRlZEluVmVyIjoiMzguNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYXJlYS9kZXBlbmRlbmNpZXMiLCJib3RzIiwia2luZC9jaG9yZSJdfQ==-->

---------

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Charith Ellawala <charith@cerbos.dev>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Charith Ellawala <charith@cerbos.dev>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

4 participants