sinval.c

shared cache invalidation communication code
backend間で、システムカタログなどのキャッシュが無効になったことを通知し合う仕組み。
システムカタログのキャッシュはbackendごとに持っているので、create tableなどでカタログが更新されたときに、無効になったデータを通知することで、キャッシュ上のデータが矛盾しないようにする。
通知messageはcreate tableなどを実行したbackendがcommitされる時に、SendSharedInvalidMessage()で登録する。
他のbackendはトランザクションの開始やリレーションのopen時に、ReceiveSharedInvalidMessages()を実行することでmessageの受信を行う。

messageは、共有メモリ上のstruct SISegで管理する。(sinvaladt.hに定義)
SendSharedInvalidMessage()で、SISegのbufferにmessageが登録される。(bufferはmessageの配列)
messageが登録されるごとにMsgNumがインクリメントされる。buffer上のmessageの位置は、MsgNum % buffer_sizeで計算される。このような計算をすることでbufferを循環して再利用している。
また、SISegのProcStateでbackendごとの受信状況を管理している。ProcStateのnextMsgNumに、次に読むべきMsgNumが入る。backendがReceiveSharedInvalidMessages()するたびに、該当するProcStateのnextMsgNumがインクリメントされる。

SISegにmessageをSend/Recieveするときは、共有メモリを操作するので、SInvalLockをLWLockする。

全backendへの通知が完了し、不要になったmessageは、SIDelExpiredDataEntries()で削除する。
SISegには、minMsgNumとmaxMsgNumの2つのMsgNumがあり、maxMsgNumは次に登録されるMsgNumが設定され、minMsgNumには全ProcStateの最小のnextMsgNumが設定される。
minMsgNumより以前のmessageは、全backendへ通知が完了しているので、削除できる。(実際には削除しないで、bufferが循環されたときに上書きする)
また、MsgNumがオーバーフローしないように、minMsgNumがしきい値を超えたときは、minMsgNum, maxMsgNum, 全ProcStateのnextMsgNumから、しきい値分をマイナスして、MsgNumを小さくする。