編寫好的資源DLL的誡條
只要仔細注意幾條規則和指引,編寫好的資源DLL其實相當簡單。大部分上文已經討論過。本節是對編寫資源DLL要牢記的關鍵事情的總結。
- 使用Visual C++ 4.2b或以上(確保從www.microsoft.com安裝了最新更新)和平台SDK來編寫資源DLL和群集管理擴充DLL。高度整合的開發環境使得工作相當輕鬆。同樣地,使用Visual C++調試器或WinDbg來調試DLL。
- 在資源DLL的Startup常式中初始化全域資料,在Open中初始化資源特定的資料。
- 在資源DLL中,確保使用分離的線程來執行耗時比較長的操作,比如開啟資源,聯機,離線,等等。分離線程的建立使與資源監視器(以及其上的叢集服務)的通訊流程更加高效。假如,舉例來說,資源要花費超過300毫秒的時間來聯機,派生一個分離的線程來完成這個操作,可以使得入口能夠立即返回。
- 如果不想讓資源DLL被叢集服務的狀態查詢打斷,返回一個事件控制代碼以通知叢集服務不要調用LooksAlive。然後,使用該事件控制代碼向叢集服務發送狀態資訊。
- 在任何可能的情況下使用回呼函數。回呼函數允許資源DLL和資源監視器進行非同步通訊。典型情況下,一般資源DLL使用LogEvent和SetResourceStatus函數向叢集服務記錄資源事件記錄和進行調試。調用 SetResourceStatus向資源監視器發送狀態資訊。
- 如果要求群集事件、節時間點事件、組狀態改變、群集資料庫改變或更新事件通知到資源,建立一個群集通知連接埠(使用CreateClusterNotifyPort)來處理事件通知。注意,如果在多線程中使用通知連接埠,要小心競爭條件。例如,一個線程可能調用CloseClusterNotifyPort關閉通知商品,而另一個線程則調用了GetClusterNotify,正等待著從同一連接埠擷取資訊。要防止這種情況,可以在調用GetClusternotify的線程加入對CLUSTER_CHANGE_HANDLE_CLOSE的檢查。關於更多關於事件通知和產生通知的事件,請參考平台SDK。
- 支援CLUSCTL_RESOURCE_GET_PRIVATE_PROPERTIES控制功能以便於諸如Cluster.Exe之類的管理工具能夠設定那些仍沒有被設定的屬性。
- 支援CLUSCTL_RESOURCE_VALIDATE_PRIVATE_PROPERTIES和CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES控制功能以便於資源DLL能夠在屬性被儲存之前進行校正。
- 支援CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTIES、CLUSCTL_RESOURCE_TYPE_VALIDATE_PRIVATE_PROPERTIES以及CLUSCTL_RESOURCE_TYPE_SET_PRIVATE_PROPERTIES控制功能,如果資源類型具有私人屬性。
- 支援CLUSCTL_RESOURCE_GET_REQUIRED_DEPENDENCIES和CLUSCTL_RESOURCE_TYPE_GET_REQUIRED_DEPENDENCIES控制功能,如果資源需要依賴於另一資源。
- 如果可能,應該在在Open函數中讀取屬性。如果不可能,則應該在Online函數中讀取。