PostgreSQL異常重啟postmaster.pid處理

yzs87發表於2020-06-05

介紹啟動時pid檔案即鎖檔案的處理,若異常當機,導致pid檔案殘留,那麼重啟時會自動將這個檔案刪除嗎?

main>PostmasterMain->CreateDataDirLockFile->CreateLockFile::
  for (ntries = 0;; ntries++){
  // O_EXCL若存在則返回失敗,errno是17
  fd = open(filename, O_RDWR | O_CREAT | O_EXCL, pg_file_create_mode);
  if (fd >= 0)
    break; 
  if ((errno != EEXIST && errno != EACCES) || ntries > 100)//重試100次
    could not create lock file
  fd = open(filename, O_RDONLY, pg_file_create_mode);
  ...
  if ((len = read(fd, buffer, sizeof(buffer) - 1)) < 0)
  ...
  close(fd);
  //0表示檢查程式是否存在。ESRCH:沒有這個程式;EPERM:操作不允許
  if (kill(other_pid, 0) == 0 ||(errno != ESRCH && errno != EPERM)){
    lock file \"%s\" already exists
  }
  if (unlink(filename) < 0)//刪除,然後迴圈再試建立
    ...
  }
  //此時建立成功
  if (write(fd, buffer, strlen(buffer)) != strlen(buffer))//寫入pid內容
    ...
  if (pg_fsync(fd) != 0)
    ...
  if (close(fd) != 0)
    ...

說明:

1) 會以O_RDWR | O_CREAT | O_EXCL 形式open,若存在的話會返回建立檔案失敗。

2) 若建立失敗則會重試100次

3) 若檔案已存在,則以只讀的形式再次open並讀取檔案內容

4) 解析出pid,並透過kill(pid,0)判斷程式是否存在(注意,若有子程式殘留也會判斷出來)

5) 若有程式不存在,則將這個檔案刪除,然後進行重試

6) 建立成功後,將當前程式資訊寫入檔案並sync持久化。

7) 最後將檔案控制程式碼關閉


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2696595/,如需轉載,請註明出處,否則將追究法律責任。