Files
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Mario
a739cb2805 Bump github.com/twmb/franz-go from 1.18.1 to 1.20.0 (#5766)
* Bump github.com/twmb/franz-go from 1.18.1 to 1.20.0

Bumps [github.com/twmb/franz-go](https://github.com/twmb/franz-go) from 1.18.1 to 1.20.0.
- [Changelog](https://github.com/twmb/franz-go/blob/master/CHANGELOG.md)
- [Commits](https://github.com/twmb/franz-go/compare/v1.18.1...v1.20.0)

---
updated-dependencies:
- dependency-name: github.com/twmb/franz-go
  dependency-version: 1.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>

* Update kfake

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Mario <[email protected]>
2025-10-20 13:55:55 +02:00

198 lines
4.8 KiB
Go

package kfake
import "sort"
type tps[V any] map[string]map[int32]*V
func (tps *tps[V]) getp(t string, p int32) (*V, bool) {
if *tps == nil {
return nil, false
}
ps := (*tps)[t]
if ps == nil {
return nil, false
}
v, ok := ps[p]
return v, ok
}
func (tps *tps[V]) gett(t string) (map[int32]*V, bool) {
if tps == nil {
return nil, false
}
ps, ok := (*tps)[t]
return ps, ok
}
func (tps *tps[V]) mkt(t string) map[int32]*V {
if *tps == nil {
*tps = make(map[string]map[int32]*V)
}
ps := (*tps)[t]
if ps == nil {
ps = make(map[int32]*V)
(*tps)[t] = ps
}
return ps
}
func (tps *tps[V]) mkp(t string, p int32, newFn func() *V) *V {
ps := tps.mkt(t)
v, ok := ps[p]
if !ok {
v = newFn()
ps[p] = v
}
return v
}
func (tps *tps[V]) mkpDefault(t string, p int32) *V {
return tps.mkp(t, p, func() *V { return new(V) })
}
func (tps *tps[V]) set(t string, p int32, v V) {
*tps.mkpDefault(t, p) = v
}
func (tps *tps[V]) each(fn func(t string, p int32, v *V)) {
for t, ps := range *tps {
for p, v := range ps {
fn(t, p, v)
}
}
}
func (tps *tps[V]) delp(t string, p int32) {
if *tps == nil {
return
}
ps := (*tps)[t]
if ps == nil {
return
}
delete(ps, p)
if len(ps) == 0 {
delete(*tps, t)
}
}
// TopicInfo contains snapshot-in-time metadata about an existing topic.
type TopicInfo struct {
Topic string // Topic is the topic this info is for.
TopicID [16]byte // TopicID is the UUID of the topic.
NumReplicas int // NumReplicas is the replication factor for all partitions in this topic.
Configs map[string]*string // Configs contains all configuration values specified for this topic.
}
// PartitionInfo contains snapshot-in-time metadata about an existing partition.
type PartitionInfo struct {
Partition int32 // Partition is the partition this info is for.
HighWatermark int64 // HighWatermark is the latest offset present in the partition.
LastStableOffset int64 // LastStableOffset is the last stable offset.
LogStartOffset int64 // LogStartOffsets is the first offset present in the partition.
Epoch int32 // Epoch is the current "epoch" of the partition -- how many times the partition transferred leaders.
MaxTimestamp int64 // MaxTimestamp is the current max timestamp across all batches.
NumBytes int64 // NumBytes is the current amount of data stored in the partition.
Leader int32 // Leader is the current leader of the partition.
}
func (pd *partData) info() *PartitionInfo {
return &PartitionInfo{
Partition: pd.p,
HighWatermark: pd.highWatermark,
LastStableOffset: pd.lastStableOffset,
LogStartOffset: pd.logStartOffset,
Epoch: pd.epoch,
MaxTimestamp: pd.maxTimestamp,
NumBytes: pd.nbytes,
Leader: pd.leader.node,
}
}
func cloneConfigs(m map[string]*string) map[string]*string { // a deeper maps.Clone
m2 := make(map[string]*string, len(m))
for k, v := range m {
var v2 *string
if v != nil {
vv := *v
v2 = &vv
}
m2[k] = v2
}
return m2
}
// TopicInfo returns information about a topic if it exists.
func (c *Cluster) TopicInfo(topic string) *TopicInfo {
var i *TopicInfo
c.admin(func() {
id, exists := c.data.t2id[topic]
if !exists {
return
}
i = &TopicInfo{
Topic: topic,
TopicID: id,
NumReplicas: c.data.treplicas[topic],
Configs: cloneConfigs(c.data.tcfgs[topic]),
}
})
return i
}
// TopicIDInfo returns the topic for a topic ID if the topic ID exists.
func (c *Cluster) TopicIDInfo(id [16]byte) *TopicInfo {
var i *TopicInfo
c.admin(func() {
topic, exists := c.data.id2t[id]
if !exists {
return
}
i = &TopicInfo{
Topic: topic,
TopicID: id,
NumReplicas: c.data.treplicas[topic],
Configs: cloneConfigs(c.data.tcfgs[topic]),
}
})
return i
}
// PartitionInfo returns information about a partition if it exists.
func (c *Cluster) PartitionInfo(topic string, partition int32) *PartitionInfo {
var i *PartitionInfo
c.admin(func() {
pd, ok := c.data.tps.getp(topic, partition)
if !ok {
return
}
i = pd.info()
})
return i
}
// PartitionInfos returns information about all partitions in a topic,
// if it exists. The partitions are returned in sorted partition order,
// with partition 0 at index 0, partition 1 at index 1, etc.
func (c *Cluster) PartitionInfos(topic string) []*PartitionInfo {
var is []*PartitionInfo
c.admin(func() {
t, ok := c.data.tps.gett(topic)
if !ok {
return
}
partitions := make([]int32, 0, len(t))
for p := range t {
partitions = append(partitions, p)
}
sort.Slice(partitions, func(i, j int) bool {
return partitions[i] < partitions[j]
})
for _, p := range partitions {
pd, _ := c.data.tps.getp(topic, p)
is = append(is, pd.info())
}
})
return is
}