DeltaFIFO 与 Indexer关系

举报
kaliarch 发表于 2022/04/04 20:19:20 2022/04/04
【摘要】 一 前言在刚开始看DeltaFIFO的时候,不太清楚具体的数据存储在哪里,具体数据流向何处,本文通过程序debug可以更直观的看出DeltaFIFO中的属性与Indexer关系。 二 DeltaFIFO数据结构type DeltaFIFO struct { // lock/cond protects access to 'items' and 'queue'. lock sync.RWMu...

一 前言

在刚开始看DeltaFIFO的时候,不太清楚具体的数据存储在哪里,具体数据流向何处,本文通过程序debug可以更直观的看出DeltaFIFO中的属性与Indexer关系。

二 DeltaFIFO数据结构

type DeltaFIFO struct {
	// lock/cond protects access to 'items' and 'queue'.
	lock sync.RWMutex
	cond sync.Cond

	// `items` maps a key to a Deltas.
	// Each such Deltas has at least one Delta.
	items map[string]Deltas

	// `queue` maintains FIFO order of keys for consumption in Pop().
	// There are no duplicates in `queue`.
	// A key is in `queue` if and only if it is in `items`.
	queue []string

	// populated is true if the first batch of items inserted by Replace() has been populated
	// or Delete/Add/Update/AddIfNotPresent was called first.
	populated bool
	// initialPopulationCount is the number of items inserted by the first call of Replace()
	initialPopulationCount int

	// keyFunc is used to make the key used for queued item
	// insertion and retrieval, and should be deterministic.
	keyFunc KeyFunc

	// knownObjects list keys that are "known" --- affecting Delete(),
	// Replace(), and Resync()
	knownObjects KeyListerGetter

	// Used to indicate a queue is closed so a control loop can exit when a queue is empty.
	// Currently, not used to gate any of CRED operations.
	closed bool

	// emitDeltaTypeReplaced is whether to emit the Replaced or Sync
	// DeltaType when Replace() is called (to preserve backwards compat).
	emitDeltaTypeReplaced bool
}

// state of the object before it was deleted.
type Delta struct {
	Type   DeltaType
	Object interface{}
}

// Deltas is a list of one or more 'Delta's to an individual object.
// The oldest delta is at index 0, the newest delta is the last one.
type Deltas []Delta

DeltaFIFO中存储的内容

key:是通过keyFunc计算获取的,默认使用cache.MetaNamespaceKeyFunc来获取,为namespace/resourcename,例如下图中的default/etcd-2

value:是具体的对象Deltas切片,内部包含Type和Object,其中Type为DeltaType,为关注资源的操作类型。

object为具体对象的在k8s资源中的元数据。

三 Indexer数据结构图

type cache struct {
	// cacheStorage bears the burden of thread safety for the cache
	cacheStorage ThreadSafeStore
	// keyFunc is used to make the key for objects stored in and retrieved from items, and
	// should be deterministic.
	keyFunc KeyFunc
}

// threadSafeMap implements ThreadSafeStore
type threadSafeMap struct {
	lock  sync.RWMutex
	items map[string]interface{}

	// indexers maps a name to an IndexFunc
	indexers Indexers
	// indices maps a name to an Index
	indices Indices
}

Indexer为DeltaFIFO中的knownObjects,包含keyFunc和cacheStorage

四 对比

可以对比来看,在DeltaFIFO中的item的value中是一个deltas切片,内部的值包含type和具体的object对象

indexer中item的值直接是对象本身。

总结

DeltaFIFO中的Item存储了具体的元素,为了后期便于索引,在内部还包含了一个knownObjects,其内部同样存储了一份数据,deltaFIFO最后Pop出来数据后添加至indexer中,和调用用户注册的resourceEventHandler。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。