-
背景 需要在gitlab pipelines中跑一堆测试 其中某些测试需要与rancher交互,在训练集群上执行一个训练任务 gitlab pipelines的默认用户是root,而rancher会默认以当前操作的user进行调度。 这里还涉及若干奇奇怪怪的,比较特异性的原因。 导致gitlab pipeline无法调度成功rancher. 总之,需求是,要在gitlab上以一个non-root 执行一些任务 由于缺少官方支持 (参考这里 ), 最终用了非常tricky的办法解决,踩了非常多的坑,因此记录下来,以飨后人 过程 为了方便表述,假设这个non-root user就叫"renkz" 在docker中添 …
Read More -
背景 每一个cpp expression都有一个type 和 value category 属性 前者大家都比较了解,但是后者却常常被忽视 Value Categories in the c language cpp是由c语言发展而来,因此这里先介绍c 语言中的value category c语言只有简单的lvalue和rvalue两种 lvalue lvalue的"l"表示"left",表示lvalue可以出现在assigment operator的左边 更准确的说 Tip "lvalue is a value refer to an object" "an …
Read More -
最近在做一个智能算力的项目,其中需要用到redis维护某个全局的时间窗口 资料 https://redis.io/docs/about/ 极客时间Redis核心技术与实战 复杂数据结构的表示方式 学习过程中唯一让我迷惑的是一个嵌套的数据结构要如何表示 比如我想表示一个key为string, value为List的Hash 按照c++的语法,也就是一个 1std::unordered_map<std::string,std::vector<int>> 但是我发现,在redis中我无法设置value的数据类型 后来发现,redis这种kv存储其实所有的key是在同一个空间的,不存在嵌套关系 嵌套关系是根据相同 …
Read More -
接口 一个ABC,后面会继承这个类做各种实现 clean up function 代码比较好懂,唯一让我感到疑惑的是 clean up function 这部分 1 2 // FIXME: 不太理解为什么需要很多个clean up function 3 // Cleanup functions are stored in a single-linked list. 4 // The list's head node is inlined in the iterator. 5 struct CleanupNode { 6 // True if the node is not used. Only head nodes …
Read More -
arena时levelDB中的内存池实现 接口 没有太多好说的,都非常直观。 补了些注释 1 2class Arena { 3 public: 4 Arena(); 5 6 Arena(const Arena&) = delete; 7 Arena& operator=(const Arena&) = delete; 8 9 ~Arena(); 10 11 // Return a pointer to a newly allocated memory block of "bytes" bytes. 12 char* Allocate(size_t bytes); 13 14 // …
Read More -
FilterPolicy接口 1 2class LEVELDB_EXPORT FilterPolicy { 3 public: 4 virtual ~FilterPolicy(); 5 6 // Return the name of this policy. Note that if the filter encoding 7 // changes in an incompatible way, the name returned by this method 8 // must be changed. Otherwise, old incompatible filters may be 9 // passed to methods …
Read More -
Cache接口 没有太多好说的,可以注意这里用了void*来表示任意类型数据。 在c++17之后可以考虑用std::any代替,参考 std::any 笔记 1 2 3namespace leveldb { 4 5class LEVELDB_EXPORT Cache; 6 7// Create a new cache with a fixed size capacity. This implementation 8// of Cache uses a least-recently-used eviction policy. 9LEVELDB_EXPORT Cache* NewLRUCache(size_t capacity); 10 …
Read More -
概述 std::shared_ptr是智能指针的一种,在modern c++中被广泛使用(甚至滥用) 虽然天天使用,但是有些细节还不是100%清楚,因此来整理一下 为了方便表述,下文只写shared_ptr,不在写std的namespace. 组成 shared_ptr的实现中,成员通常由两部分组成。一个是所涵盖对象的指针,一个是control block 的指针 control block Tip 最重要的是,control block是 dynamically-allocated 的 (校招的时候某次面试,让我手写shared_ptr的实现,当时被多个object如何共享引用计数卡住了。。主要就是没意识到control …
Read More -
背景 一种很常见的背景是,需要表示未知类型的数据。 比如可能是用户提供的数据,比如是一个Cache的实现, value想支持任意类型的数据 对于这种场景,c语言的出身的开发者通常会使用void*来实现 1struct day { 2 // ...things... 3 void* user_data; 4}; 5 6struct month { 7 std::vector<day> days; 8 void* user_data; 9}; 10 了解cpp11的开发者可能会使用std::shared_ptr<void> 来实现 1struct day { 2 // ...things... 3 …
Read More -
levelDB是一个有序的KV存储,因此key的顺序是十分关键的 levelDB提供用户自己定义key顺序的能力 先看下comparator的接口 接口 include/leveldb/comparator.h 1 2// A Comparator object provides a total order across slices that are 3// used as keys in an sstable or a database. A Comparator implementation 4// must be thread-safe since leveldb may invoke its methods …
Read More