ceph源码分析--一个entry函数的调用

标签: ceph
17人阅读 评论(0) 收藏 举报
分类:

ceph中有很多的entry函数,往往是由各线程来调用处理的,本篇文章以bluestore中的MempoolThread为例来讲讲该函数的调用。

 struct MempoolThread : public Thread {
    BlueStore *store;
    Cond cond;
    Mutex lock;
    bool stop = false;
  public:
    explicit MempoolThread(BlueStore *s)
      : store(s),
    lock("BlueStore::MempoolThread::lock") {}
    void *entry() override;
    void init() {
      assert(stop == false);
      create("bstore_mempool");
    }
    void shutdown() {
      lock.Lock();
      stop = true;
      cond.Signal();
      lock.Unlock();
      join();
    }
  } ;

首先查看其init函数,调用了父类Thread的create(“bstore_mempool”)

void init() {
    assert(stop == false);
    create("bstore_mempool");
}

void Thread::create(const char *name, size_t stacksize),调用了try_create(stacksize)

void Thread::create(const char *name, size_t stacksize)
{
  assert(strlen(name) < 16);
  thread_name = name;

  int ret = try_create(stacksize);
  if (ret != 0) {
    char buf[256];
    snprintf(buf, sizeof(buf), "Thread::try_create(): pthread_create "
         "failed with error %d", ret);
    dout_emergency(buf);
    assert(ret == 0);
  }
}

int Thread::try_create(size_t stacksize)调用了pthread_create(&thread_id, thread_attr, _entry_func, (void*)this),这是线程创建函数,关注_entry_func

int Thread::try_create(size_t stacksize)
{
  pthread_attr_t *thread_attr = NULL;
  pthread_attr_t thread_attr_loc;

  stacksize &= CEPH_PAGE_MASK;  // must be multiple of page
  if (stacksize) {
    thread_attr = &thread_attr_loc;
    pthread_attr_init(thread_attr);
    pthread_attr_setstacksize(thread_attr, stacksize);
  }

  int r;

  // The child thread will inherit our signal mask.  Set our signal mask to
  // the set of signals we want to block.  (It's ok to block signals more
  // signals than usual for a little while-- they will just be delivered to
  // another thread or delieverd to this thread later.)
  sigset_t old_sigset;
  if (g_code_env == CODE_ENVIRONMENT_LIBRARY) {
    block_signals(NULL, &old_sigset);
  }
  else {
    int to_block[] = { SIGPIPE , 0 };
    block_signals(to_block, &old_sigset);
  }
  r = pthread_create(&thread_id, thread_attr, _entry_func, (void*)this);
  restore_sigset(&old_sigset);

  if (thread_attr) {
    pthread_attr_destroy(thread_attr);  
  }

  return r;
}

void Thread::_entry_func(void *arg) 调用了((Thread)arg)->entry_wrapper()

void *Thread::_entry_func(void *arg) {
  void *r = ((Thread*)arg)->entry_wrapper();
  return r;
}

void *Thread::entry_wrapper()调用到entry~~~~旅行结束

void *Thread::entry_wrapper()
{
  int p = ceph_gettid(); // may return -ENOSYS on other platforms
  if (p > 0)
    pid = p;
  if (pid &&
      ioprio_class >= 0 &&
      ioprio_priority >= 0) {
    ceph_ioprio_set(IOPRIO_WHO_PROCESS,
            pid,
            IOPRIO_PRIO_VALUE(ioprio_class, ioprio_priority));
  }
  if (pid && cpuid >= 0)
    _set_affinity(cpuid);

  ceph_pthread_setname(pthread_self(), thread_name);
  return entry();
}
查看评论

ceph源码解析--osd篇

Ceph分布式文件系统的代码分析的文章网上是比较少的,本团队成员对ceph做过详细的代码阅读,包括mds、osd、client等模块,但是缺少条理清晰的文档总结。暂且先放上OSD的代码分析,等后续整理...
  • mightySheldor
  • mightySheldor
  • 2016年04月08日 09:28
  • 3497

ceph源码分析之读写操作流程(2)

上一篇介绍了ceph存储在上两层的消息逻辑,这一篇主要介绍一下读写操作在底两层的流程。下图是上一篇消息流程的一个总结。 在ceph中,读写操作由于分布式存储的原因,故走了不同流程。 对于读操...
  • ywy463726588
  • ywy463726588
  • 2015年01月13日 18:14
  • 3386

小伙伴们的ceph源码分析三——monitor消息处理流程

笔者在读代码初期非常想理清楚的就是ceph这么个系统在服务端与客户端是怎么响应与发起请求的。 本人主要负责monitor部分,而且追了一会cephx认证的代码,所以拿这块举例,后续osd部分主要是对同...
  • kakaxi8891
  • kakaxi8891
  • 2013年09月02日 18:03
  • 3725

Ceph 源代码分析 -OS module

Ceph的src/os 中保存了 ObjectStore代码实现。 基本概念 对象 对象存储的概念,把对象作为存储的实体。 在Ceph 文件系统里,对象的命名空间分了两层, 第一...
  • changtao381
  • changtao381
  • 2013年03月26日 14:19
  • 8600

Ceph Monitor源码机制分析(一)—— 概述

0 前言 最近终于有点时间可以看看Ceph的代码了,接下来准备就Ceph monitor这个Ceph集群中最重要的组件进行深入的分析。 1 Monitor的作用 Monitor在Ceph集群中扮演着管...
  • scaleqiao
  • scaleqiao
  • 2016年08月17日 16:17
  • 3209

ceph源码分析之线程介绍

Ceph是一款优秀的分布式存储软件,通过学习它的源码,我们可以学到很多编程技巧,ceph中关于多线程的编程,是一个很好的学习对象。 Ceph中线程的在src/common/Thread.h中定义 c...
  • ywy463726588
  • ywy463726588
  • 2015年01月15日 15:51
  • 3009

Ceph 学习——OSD读写流程与源码分析(一)

消息从客户端发送而来,之前几节介绍了 客户端下 对象存储、块存储库的实现以及他们在客户端下API请求的发送过程(Ceph学习——Librados与Osdc实现源码解析 、 Ceph学习——客户端读...
  • CSND_PAN
  • CSND_PAN
  • 2017年12月08日 16:50
  • 626

Ceph学习——Librados与Osdc实现源码解析

本文介绍Ceph客户端方面的某些模块的实现。客户端主要是实现了接口,对外提供访问的功能。上层可以通过接口来访问Ceph存储。Librados 与 Osdc 位于Ceph客户端中比较底层的位置,Libr...
  • CSND_PAN
  • CSND_PAN
  • 2017年12月04日 18:34
  • 528

Ceph 源代码分析 -librados

librados 的模块式在客户端用来访问 rados对象存储设备的, 其结构图如下: 如上图所示,各个模块的架构图。 librados就是 操作 rados 对象存储的接口。 其...
  • changtao381
  • changtao381
  • 2013年03月27日 12:29
  • 5725

Ceph代码分析---线程池

对于计算密集型的业务通常使用线程池进行多线程并发处理,线程池在一定程度上可以有效的提高CPU的利用率,降低无用消耗。Ceph中实现了两种类型的线程池类(本质相同),并实现消息队列处理类。其中线程池类负...
  • shuningzhang
  • shuningzhang
  • 2015年11月28日 10:17
  • 1712
    个人资料
    持之以恒
    等级:
    访问量: 7万+
    积分: 3248
    排名: 1万+
    最新评论