前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pool一个成员函数,具体的实现类型是simpleObjectPool

pool一个成员函数,具体的实现类型是simpleObjectPool

原创
作者头像
用户7737280
发布2024-08-22 10:35:17
630
发布2024-08-22 10:35:17

// ResourceManager Allocate/Release/Pool/Stick/GC pod resource

// managed pod and resource relationship

type ResourceManager interface {

Allocate(context *networkContext, prefer string) (types.NetworkResource, error)

Release(context *networkContext, resID string) error

GarbageCollection(inUseResList map[string]interface{}, expireResList map[string]interface{}) error

}

func (m *eniIPResourceManager) Allocate(ctx *networkContext, prefer string) (types.NetworkResource, error) {

return m.pool.Acquire(ctx, prefer)

}

func (m *eniIPResourceManager) Release(context *networkContext, resID string) error {

if context != nil && context.pod != nil {

return m.pool.ReleaseWithReverse(resID, context.pod.IPStickTime)

}

return m.pool.Release(resID)

}

func (m *eniIPResourceManager) GarbageCollection(inUseSet map[string]interface{www.laipuhuo.com, expireResSet map[string]interface{}) error {

for expireRes := range expireResSet {

if err := m.pool.Stat(expireRes); err == nil {

err = m.Release(nil, expireRes)

if err != nil {

return err

}

}

}

return nil

}

func (m *eniIPResourceManager) Allocate(ctx *networkContext, prefer string) (types.NetworkResource, error) {

return m.pool.Acquire(ctx, www.laipuhuo.com prefer)

}

func (m *eniIPResourceManager) Release(context *networkContext, resID string) error {

if context != nil && context.pod != nil {

return m.pool.ReleaseWithReverse(resID, context.pod.IPStickTime)

}

return m.pool.Release(resID)

}

func (m *eniIPResourceManager) GarbageCollection(inUseSet map[string]interface{www.laipuhuo.com}, expireResSet map[string]interface{}) error {

for expireRes := range expireResSet {

if err := m.pool.Stat(expireRes); err == nil {

err = m.Release(nil, expireRes)

if err != nil {

return err

}

}

}

return nil

}

// NewSimpleObjectPool return an object pool implement

func NewSimpleObje www.laipuhuo.com ctPool(cfg Config) (ObjectPool, error) {

if cfg.MinIdle > cfg.MaxIdle {

return nil, ErrInvalidArguments

}

if cfg.MaxIdle > cfg.Capacity {

return nil, ErrInvalidArguments

}

pool := &simpleObjectPool{

factory: www.laipuhuo.com cfg.Factory,

inuse: make(map[string]types.NetworkResource),

idle: newPriorityQueue(),

maxIdle: cfg.MaxIdle,

minIdle: cfg.MinIdle,

capacity: cfg.Capacity,

notifyCh: make(chan interface{}),

tokenCh: make(chan struct{}, cfg.Capacity),

}

if cfg.Initializer != nil {

if err := cfg.www.laipuhuo.com Initializer(pool); err != nil {

return nil, err

}

}

if err := pool.preload(); err != nil {

return nil, err

}

log.Infof("pool initial state, capacity %d, maxIdle: %d, minIdle %d, idle: %s, inuse: %s",

pool.capacity,

pool.maxIdle,

pool.minIdle,

queueKeys(pool.idle),

mapKeys(pool.inuse))

go pool.start www.laipuhuo.com CheckIdleTicker()

return pool, nil

}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档