2004-01-01から1年間の記事一覧

ソート

・tuplesort.c: SelectSortFunction() ソート関数を選択する。・nodeSort.c: ExecSort() outer treeのソートを実行。 tuplesort_begin_heap()で,Tuplesortstateを作成する。 ループでouterNodeのタプルを取得して,tpulesort_puttuple()でtuplesortstateへ …

CritSectionCount

クリティカルセクションカウンタ START_CRIT_SECTION()マクロで,クリティカルセクションの開始。 (CritSectionCountをインクリメント) END_CRIT_SECTION()マクロで,クリティカルセクションの終了。 (CritSectionCountをデクリメント) マクロを使わず,Crit…

libpq.dll

libpq.dllで検索SQLを実行して検索結果を取得するとき,getAnotherTuple()に負荷が集中する。 getAnotherTuple()の中で負荷が高い場所は,for (i = 0; i pqGetInt()は,引数にバイト数(2 or 4)を渡すようになっており,pqGetInt()内部でswitch文で処理を分け…

tupleのinsert/update/delete

・insertの処理 insertは,ExecProcNodeで新しいタプルを作成後,ExecInsertでタプルをinsertする。 ExecutePlan ExecProcNode ExecResult ExecProject ExecTargetList ExecStoreTuple ExecInsert ExecConstraints heap_insert RelationGetBufferForTuple Re…

libpq

・pqformat.c: pq_beginmessage() initStringInfoでbufを初期化する buf->cursorにmsgtypeをセット・pqformat.c: pq_sendint() 送信バイト数で処理を振り分ける。 appendBinaryStringInfo()でbufに追加する。・pqformat.c: pq_sendcountedtext() pg_server_t…

fmgr

・fmgr.c: fmgr_info_cxt() 関数のOidから,関数の情報(FmgrInfo構造体)を取得する。 fmgr_info_cxt_security()を実行している。・fmgr.c: fmgr_info_cxt_security() 最初にfinfoをinvalidデータで初期化する。 fmgr_isbuiltin()でbuiltin functionかチェッ…

pqResultAlloc()

pqResultAlloc()は,libpqで検索結果を保存するときのメモリを確保する。pqResultAlloc()は,PGRESULT_DATA_BLOCKSIZEで指定されている大きさのメモリブロックを確保して,PGresultのcurBlockに線形リストで管理する。 ブロックの割り当て済みのoffsetと空き…

node

・nodes.h: makeNode(_type_) nodeを作成するマクロ。 newNode()を実行する。 makeNode(Var)とすると,((Var *)newNode(sizeof(Var), T_Var))に展開される。・node.h: newNode(size, tag) 指定したsizeのメモリをpalloc0fast()で確保して,typeフィールドに…

printtup()

検索結果を出力する。 heap_deformtuple()でカラムごとのデータに分割して,FunctionCall3()でtextへ変換後,pq_sendcountedtext()で出力する。

backendをprofileする

backendをプロファイルしたいときは,configureを実行する前に, CFLAGS="-g -pg"; export CFLAGS などとして,CFLAGSに-pgを設定してからビルドする。 linuxの場合は, CFLAGS="-g -pg -DLINUX_PROFILE"; export CFLAGS などとする。あとは普通にpostgresql…

heap_getattr

HeapTupleからカラムのデータを取得するマクロ。 attnum attnum > 0のときは,以下の2通り。 指定したカラム番号がtupleのカラム数以上はNULL。 カラム番号がtupleのカラム数より小さいときはfastgetattrを実行する。

fastgetattr

heap_getattrなどから実行されるマクロ。 isnullがNULL以外のとき,*isnullをfalseで初期化する。 HeapTupleNoNulls()でタプルにNULLデータが存在しないときは,以下の2通り。 tupleDescのattcacheoffに有効な値が入っているとき,fetchatt()を実行。 無効…

catcache.c: SearchCatCacheList()

SearchCatCacheListでリストを構築するとき,cacheのエントリを使うか,新しく エントリを作成するか判断するために,以下の4つの条件を調べる・if (ct->dead || ct->negative) エントリがdeadかnegativeの場合は使わない・if (ct->hash_value != hashValue)…

catcache

Low-level catalog cache definitions. カタログキャッシュは、次の4種類の構造体で構成される。・catcacheheader: 全てのキャッシュデータを管理する ・catcache: 1つのキャッシュの情報 ・catctup: キャッシュ上のタプル ・catclist: キャッシュの検索結…

LWLockRelease

LightWeightLockを開放する。 まず、held_lwlocksを検索し,lockされていることを確認する。 spinlockを取得する。 exclusiveロックのときは,lock->exclusiveをデクリメント。それ以外は,lock->sharedをデクリメント。次にlock待ちのプロセスを起こす。 lo…

カタログキャッシュ

キャッシュは,SysCacheに構築される。SysCacheはstruct cachedescの配列。 SysCacheはbackendの起動時に,InitCatalogCache()で初期化される。 また,SearchSysCacheが最初に実行されたときに,CatalogCacheInitializeCache()で,ハッシュ関数の設定など,…

pgstat.c

statプロセス。 PgStatCollectorMain()がメインルーチン。 他のbackendとはPipeで通信する。 switch (msg.msg_hdr.m_type)で,処理を振り分ける。 backendが起動・停止するなどのイベントを記録する。 stats_row_levelなどのパラメータを有効にすると,検索…

ipc.c

inter-process communication definitions ファイル名はIPCだが、ファイルの中身はプロセス終了時に実行する処理を管理するための仕組み。(ソースのコメントにもmisnamedとある) on_proc_exit_list配列で、プロセス終了時に実行する関数と引数のリストを管理…

sinval.c

shared cache invalidation communication code backend間で、システムカタログなどのキャッシュが無効になったことを通知し合う仕組み。 システムカタログのキャッシュはbackendごとに持っているので、create tableなどでカタログが更新されたときに、無効…

データ型の追加

(1)include/utilsにデータ型を定義する 新しいデータ型の定義,DatumGetXXXマクロ, XXXGetDatumマクロ, PG_GETARG_XXXマクロ, PG_RETURN_XXXマクロが必要。 xxx_in(), xxx_out()関数の宣言も記述する。 新しいデータ型が可変長データのときは,データを構造…

LWLock

storage/lmgr/lwlock.c LWLockAcquire()でロック取得。 LWLockRelease()でロック開放。 LWLockAcquire()でロックが取得できないときは、LWLock構造体のhead, tailにロック待ちのプロセスがリストでつながれ、PGSemaphoreLock()でwaitする。 ロックを持ってい…

regexp.c

utils/adt/regexp.cに、SQLの検索条件などで正規表現を使う場合に実行される関数がある。 RE_compile_and_executeで、正規表現のコンパイル結果をキャッシュしてから、正規表現の検索を実行している。 正規表現のコンパイルや実行のメインルーチンは、regex/…

Resouce Owner

utils/resowner/resowner.c リソースオーナーは、テーブルロックやバッファーPINを取得したことを記録しておくためのオブジェクト。 サブトランザクションがabortしたときに、リソースオーナに登録されているリソースをリリースするなどの処理を行う。 デー…

VariableCache

include/access/transam.h VariableCacheは共有メモリ上に確保されるデータで、次のxidの値や次のoidの値を持っている。 xidの番号は、トランザクションの開始時に、GetNewTransactionId()で取得される。

TAS()

int TAS(slock_t *lock) TASはtest and setの略で、s_lock()内でロックの取得を試みる関数。s_lock()ではロックが取得できるまで高速にループし、TASの実行を繰り返す。 lockの値は、以下の値を持つ。 ・他のプロセスからロックされているとき:1 ・ロックさ…

SPIN_DELAY()

PostgreSQL8.0では、スピンロックを取得するs_lock()にSPIN_DELAYマクロが追加された。 SPIN_DELAYはx86環境では、アセンブラでrep; nopを実行する。 rep; nopはPentium4およびXeon環境では、pause命令として解釈される。それ以外のx86-CPUでは、単なるnopと…

dynahash.c

PostgreSQLのハッシュテーブル(dynahash.c)は、リニアハッシュというアルゴリズムで実装されており、ロックマネージャや共有メモリ、リレーションキャッシュなどで利用されている。 リニアハッシュはテーブルサイズを1つずつ拡張できるアルゴリズムであり、…