postgresql 核心開發之系統引數增加(下)

2021-07-25 05:42:05 字數 3042 閱讀 5733

上篇介紹了怎麼加乙個常規引數,同時也留下了乙個問題,如何加乙個奇葩引數設定功能,使任意乙個session設定引數值,全域性所有連線立即生效。

如何實現呢?我們來分析下。

如果要使當前session生效,直接設定即可,它能直接讀寫當前程序的引數值。那其它的session呢?首先我們明確乙個問題,資料庫一旦正常執行起來後,所有的動作都是在事務中進行的,如果乙個連線session在等待任務中,其它連線session的一些語句動作是無法直接影響到處於等待連線的session的。但是不同連線session肯定是有相互影響的,比方說a session建個表,b session讀寫這個表,肯定是可以的,任何session中事務只要提交那麼就對全域性都可見,這是資料庫的基礎,比方說是在starttransaction()函式中的atstart_cache()函式會根據主程序的訊息判斷本地cache是否需要更新。也就是說可以延遲點間接的更新到當前資料庫的最新狀態。一開始也是想以這樣的方式去實現引數生效功能,後來看了下pg_reload_conf()函式恍然大悟,何必這麼麻煩,直接用postgres程序間訊號即可,因為postgres已經有通知所有session重新讀引數功能了,要做的就只要把引數寫進去通知大家重讀引數檔案就可以了。

那麼現在的問題就轉化成了如何寫引數了,遺憾的是沒有發現核心有對postgresql.conf檔案引數的寫相關功能,postgresql.conf 檔案是從 postgresql.conf.sample copy過來的,並不是動態生成的。不過postgresql.conf有include_if_exists 用法,如果存在某個引數檔案就追加到後面,那麼我們就可以增加乙個新的引數檔案,裡面就寫我們在設定的引數值。

以函式方式實現,在date.c的增加相關**:

extern

char *configfilename;

extern

bool oracle_style;

extern file * allocatefile(const

char *name, const

char *mode);

datum swap_oracle_mode(pg_function_args)

; int pos = 0;

int count = 1;

char *tmpfile = configfilename;

file *fp;

if (null == configfilename)

while ('\0' != *tmpfile) //找到引數檔案路徑

count++;

tmpfile++;

}if (pos + strlen("oracle.conf") > sizeof(conf_path))

memcpy(conf_path, configfilename, pos);

memcpy(conf_path + pos, "oracle.conf", strlen("oracle.conf")); //生成新路徑名字

fp = allocatefile(conf_path, "w+");

if (null == fp)

else

else

if (freefile(fp))

if (kill(postmasterpid, sighup)) /*****通知其它程序重讀引數****/

}pg_return_bool(true);

}

在pg_proc.h中增加函式註冊

data(insert oid = 9995 (swap_oracle_mode   pgnsp pguid 1210

00 f f f f t f s r 0016

"" _null_ _null_ _null_ _null_ _null_ swap_oracle_mode _null_ _null_ _null_));

執行swap_oracle_mode()函式剛修改oracle_style 引數值,覆寫到新引數檔案 oracle.conf,通知其它連線重讀引數,當然別忘了在postgresql.conf中加上一句:

include_if_exists = 'oracle.conf'
小功告成,看看效果,session 1執行引數修改函式,session 2在session 1修改函式前後分別查oracle_style引數值。

postgres=#  ---session 1;

postgres=# show oracle_style;

oracle_style

--------------

on(1 row)

postgres=# select swap_oracle_mode();

swap_oracle_mode

------------------

t(1 row)

postgres=# show oracle_style;

oracle_style

--------------

off(1 row)

postgres=# ---session 2;

postgres=# show oracle_style;

oracle_style

--------------

on(1 row)

postgres=# show oracle_style;

--session 1 swap_oracle_mode()執行前

oracle_style

--------------

on(1 row)

postgres=# show oracle_style;

--session 2 swap_oracle_mode()執行後

oracle_style

--------------

off(1 row)

PostgreSQL的核心架構

注意本人的部落格都遷移到本人自己搭建的部落格位址,通過此處可檢視。1.訪問介面總體圖 1.程序和記憶體結構圖 2.主程序 postmaster 是整個資料庫例項的總控程序,負責啟動和關閉該資料庫例項。3.syslogger 系統日誌 程序 需要在postgres.conf中logging colle...

Linux核心開發之Kset

1 kset 是具有相同型別的kobject的集合 在sysfs 中體現成乙個目錄,在核心中用 kset 資料結構表示,定義為 struct kset 2 kset操作 int kset register struct kset kset 在核心中註冊乙個 kset void kset unregi...

PostgreSQL雲上開發實踐

功能 通過postgis外掛程式,可以輕鬆支援2d 3d位址資訊模型,更支援地球不規則球體的偏移量,實現達到國際opengis標準的精確定位。基於sql支援json xml key value等非結構化資料型別,實現另類的not only sql nosql 解決方案 通過全文搜尋,應用將不再需要額...