NDBDのシグナルとブロック

提供:MySQL Practice Wiki

移動: 案内, 検索

NDB関連のソースコードは大きく分けて二つある。ndbd, ndb_mgmdなどのデーモンと、NDB APIを利用したMySQLサーバ内部のストレージエンジンインターフェイス部分のソースコードである。MySQL Cluster 5.1以降では、以下のようなディレクトリ階層でソースコードが格納されている。

storage/ndb|ここにはndbdやndb_mgmdなどのソースコードが格納されている。
sql/ndb_*|ここにはmysqld内のNDBストレージエンジン関連のソースコードが定義されている。つまり、SQLノードとしてのMySQLサーバの定義がなされているのである。

目次

Signalクラス

src/kernel/vm/VMSignal.hpp
src/kernel/vm/VMSignal.cpp

ブロック間で交換されるメッセージ=シグナルを定義するクラスである。メッセージを格納するための受け皿としての機能を実装している。シグナルは自ノード内のブロックに対しても、他ノード内のブロックに対しても同じ関数を用いて送る事が可能である。SimulatedBlock::sendSignal()関数を参照のこと。

Signalクラス内にはSignalHeaderというメンバが定義されていて、シグナルのタイプ、送信先、送信元、シグナルの長さなどの情報が格納されている。SignalHeaderはinclude/transporter/TransporterDefinitions.hppにおいて以下のように定義されている。

struct SignalHeader {	
  Uint32 theVerId_signalNumber;    // 4 bit ver id - 16 bit gsn
  Uint32 theReceiversBlockNumber;  // Only 16 bit blocknum  
  Uint32 theSendersBlockRef;
  Uint32 theLength;
  Uint32 theSendersSignalId;
  Uint32 theSignalId;
  Uint16 theTrace;
  Uint8  m_noOfSections;
  Uint8  m_fragmentInfo;
}; /** 7x4 = 28 Bytes */

GlobalSignalNumber

略してGSN。シグナルのタイプを表す番号であり、ndbdで共通の番号が使われている。シグナルを受け取ったブロックはGSNに従って特定の処理を行うという寸法である。GSNはinclude/kernel/GlobalSignalNumbers.hで定義されている。


SimulatedBlockクラス

src/kernel/vm/SimulatedBlock.hpp
src/kernel/vm/SimulatedBlock.cpp

全てのブロックの親になるクラス。各ブロック間でシグナルを交換するロジックを実装している。様々なsendSignal()関数のバリエーションを定義している。ただしいずれのバリエーションにおいてもBlockReferenceというブロックのIDを第一引数にとる。BlockReferenceはクラスター全体(すべてのndbd)においてユニークなIDである。

BlockNumbereとBlockReference

以下のデータタイプがinclude/kernel/kernel_types.hで定義されている。

typedef Uint16 NodeId; 
typedef Uint16 BlockNumber;
typedef Uint32 BlockReference;

BlockNumberは各ブロックに割り当てられたユニークなIDであり、以下のようにinclude/kernel/BlockNumbers.hにおいて定義されている。BlockNumberはブロックのタイプを示すものであると考えると良い。

#define BACKUP      0xF4
#define DBTC        0xF5
#define DBDIH       0xF6
#define DBLQH       0xF7
#define DBACC       0xF8
#define DBTUP       0xF9
#define DBDICT      0xFA
#define NDBCNTR     0xFB
#define CNTR        0xFB
#define QMGR        0xFC
#define NDBFS       0xFD
#define CMVMI       0xFE
#define TRIX        0xFF
#define DBUTIL     0x100
#define SUMA       0x101
#define DBTUX      0x102
#define TSMAN      0x103
#define LGMAN      0x104
#define PGMAN      0x105
#define RESTORE    0x106

各ブロックのインスタンスは、クラスタ全体を通じてユニークなIDを持っている。IDのタイプはBlockReferenceであり、NodeIdとBlockNumberを組み合わせることで一意的に導き出されるようになっている。以下のnumberToRef()はinclude/kernel/RefConvert.hppで定義されている。

inline 
BlockReference numberToRef(BlockNumber bnr, NodeId proc){
  return (((Uint32)bnr) << 16) + proc;
}

16ビット幅のBlockNumberを上位に16ビットシフトして、16ビットのNodeIdと組み合わせることで、32ビットのBlockReferenceを生成する単純な関数である。BlockReferenceからNodeIdを取り出すことも、またBlockNumberを取り出すことも容易であり、そのための関数refToNode()、refToBlockがinclude/kernel/RefConvert.hppで定義されている。

SimBlockListクラス

src/kernel/vm/SimBlockList.hpp
src/kernel/SimBlockList.cpp

ndbdデーモン内で利用されるブロックへのポインタを格納するクラスである。load()メンバ関数により、各ブロックのインスタンスを作成する。各ブロックが持っているバッファのサイズなどは、globalEmulatorDataというインスタンスに格納されており、globalEmulatorDataを参照しながら各インスタンスを初期化する。

EmulatorData構造体

src/kernel/vm/Emulator.hpp
src/kernel/vm/Emulator.cpp

ndbdデーモンが実行するプログラムの環境を定義する構造体である。具体的には以下のメンバを保持している。

 class Configuration * theConfiguration;
 class WatchDog      * theWatchDog;
 class ThreadConfig  * theThreadConfig;
 class SimBlockList  * theSimBlockList;
 class SocketServer  * m_socket_server;
 class Ndbd_mem_manager * m_mem_manager;

globalEmulatorDataというインスタンスがあり、globalEmulatorDataから各メンバにアクセスすることができる。

GlobalData構造体

その他、 グローバルなスコープでアクセスするためのデータが格納されている。

Configurationクラス

MySQL Clusterの構成情報を保持するためのクラスで、MGMから構成情報を取得するロジックも実装している。詳細はNDBD fetching configを参照のこと。

ThreadConfigクラス

ThreadConfig::ipControlLoop()はndbdのメインループである。doStart()はndbdが初期化を行うためのシグナルを送信する。

個人用ツール