🔗 缓存管理器 API
此页面仍在开发中。它反映了 FrancescoChemolli 在尝试实现新的 cachemgr 框架时所做的发现。它可能包含不准确的信息。
本文档详细介绍了如何为 Squid 3.2+ 实现多 CPU 缓存管理器操作,遵循 AlexRousskov 实现的 API 框架。
🔗 概述
为了在多 CPU 系统中正确累积信息,需要一个框架来跨实例累积信息,以便以汇总的形式显示给用户。
为此,需要使用几个关键类
🔗 缓存管理器操作数据
这是需要在实例之间通过 IPC 机制传递以累积数据的各类信息。其基本签名是
class MyModuleMgrActionData
{
MyModuleMgrActionData();
MyModuleMgrActionData& operator += (const MyModuleMgrActionData&)
type1 datamember1;
type2 datamember2;
//.. etc
};
虽然此签名并非严格强制 - 因为它主要由耦合的 CacheManagerAction 类使用,但为了保持一致性,建议使用它。
🔗 缓存管理器操作
这是当缓存管理器框架收到用户的一些操作请求时激活的模块。其基本签名是
#include "mgr/Action.h"
class MyModuleMgrAction : public Mgr::Action
{
protected:
MyModuleMgrAction(const Mgr::CommandPointer &cmd);
virtual void collect();
virtual void dump(StoreEntry* entry);
public:
static Pointer Create(const Mgr::CommandPointer &); // factorty method
virtual void add(const Mgr::Action&);
virtual void pack(Ipc::TypedMsgHdr&) const;
virtual void unpack(const Ipc::TypedMsgHdr&);
private:
MyModuleMgrActionData data;
};
其中 Pointer 在 Mgr::Action 中定义为指向操作的引用计数指针;同样,CommandPointer 是指向命令的引用计数指针。
数据成员用于在 Squid 实例之间累积数据。执行流程是
- 一个实例收到 cachemgr 请求;它通过其静态 Create 函数实例化一个 MyModuleMgrAction
- (不详细说明)此 Action 的
run()方法调用每个工作进程的collect()方法 collect()应该用任何相关数据填充 MyModuleMgrAction 的数据成员- 数据通过
pack()和unpack()重新打包回协调器进程 - 协调器进程使用 Action 的
add()方法将来自所有工作进程的信息合并进来。Action 参数实际上是 MyModuleMgrAction 的多态引用,可以安全地动态转换为正确的类型 - 一旦数据累积完毕,就会调用
dump()方法来打印信息。
pack() 和 unpack() 可以依赖 IPC 库提供的通用基础设施,因此它们通常看起来像这样
void
MyModuleMgrAction::pack(Ipc::TypedMsgHdr& msg) const
{
msg.setType(Ipc::mtCacheMgrResponse);
msg.putPod(data);
}
void
MyModuleMgrAction::unpack(const Ipc::TypedMsgHdr& msg)
{
msg.checkType(Ipc::mtCacheMgrResponse);
msg.getPod(data);
}
🔗 注册
XXX 待办
导航:网站搜索,网站页面,分类,🔼 向上