문제

참고로 이것은 중복되지 않의 파 r/w 잠금 및 해제.(차이-플랫폼입니다.Operations 의 파일을 다음과 같은 잠금 및 삭제를 완전히 다른 의미,따라서 sultion 것 다른).

나는 다음과 같은 문제입니다.게 만들려는 파일 시스템을 기반으로 세션 저장소에는 각 세션에서 데이터가 저장되 간단의 파일 이름으로 세션 id 입니다.

나는 다음과 같은 API: write(sid,data,timeout), read(sid,data,timeout), remove(sid) where sid==파일 이름도 내가 원하는 몇 가지 종류의 GC 할 수 있는 제거하는 모든 초과되었습니다.

매우 간단한 작업과 함께 작업하는 경우 하나의 프로세스 하지만 절대적으로 간단하지 않습으로 작업할 때 여러 프로세스 또는 더 이상 공유 폴더를 지정합니다.

가장 간단한 방법을 지속적으로 연구하는지에 대해 생각하게 되었습니다:

write/read:
   hanlde=CreateFile
   LockFile(handle)
   read/write data
   UnlockFile(handle)
   CloseHanlde(handle)

GC (for each file in directory)
   hanlde=CreateFile
   LockFile(handle)
   check if timeout occured
     DeleteFile
   UnlockFile(handle)
   CloseHanlde(handle)

하지만 AFIAK 지 DeleteFile 에 opended 파일 잠금(과는 달리에서는 유닉스 파일 잠금 필수와의 연결을 해제가 허용되도 열어 파일이 있습니다.

그러나는 경우 DeleteFile 외부 잠금의 반복이 나쁜 시나리오가 일어날 수

GC - CreateFile/LockFile/Unlock/CloseHandle,
write - oCreateFile/LockFile/WriteUpdatedData/Unlock/CloseHandle
GC - DeleteFile

누군가는 방법에 대한 아이디어가 있다 이러한 문제를 해결될 수 있?어떤 트릭 허용 을 결합한 파일 잠금 기능 및 파일이 제거하거나 작업에서 파일로 원자(Win32)?

Notes:

  • 내가 사용하고 싶지 않은 데이터베이스
  • 에 대한 솔루션에 대한 Win32API for NT5.01 상

감사합니다.

도움이 되었습니까?

해결책

나는 이것이 어떻게 작동 해야하는지 이해하지 못한다. 그러나 다른 프로세스에서 열린 파일을 삭제하는 것이 가능합니다. 파일을 생성하는 프로세스는 createFile ()의 dwsharemode 인수에 file_share_delete 플래그를 사용해야합니다. 후속 DeleteFile () 호출이 성공합니다. 마지막 핸들이 닫힐 때까지 파일은 파일 시스템에서 실제로 제거되지 않습니다.

다른 팁

현재 데이터에 기록할 수 있는 GC 지 확인하려면 기록은 시간이 초과되었습니다.는 방법에 대해 확장된 객실 정돈 서비스 정보를"TooLateWeAlreadyTimedItOut"플래그입니다.

 GC sets TooLateWeAlreadyTimedItOut = true
 Release lock
    <== writer comes in here, sees the "TooLate" flag and so does not write
 GC deletes

다른 말로는 우리가 사용하는 종류의 낙관적 잠금 방식.이 필요가 일부 추가적인 복잡성에서 작가는,그러나 지금 당신은에 의존하지 않는 모든 OS-특정 주름이 있습니다.

내가 무엇인지 명확하지 않에서 발생하는 경우:

 GC checks timeout
 GC deletes
 Writer attempts write, and finds no file ...

당신이 무엇을 해야에 대한 계획,이 경우 사용할 수도 있습에서"TooLate"케이스

편집을 추가합니다:

당신이 말한 그것에 대해 유효한 이 순서가 발생합니다.

 GC Deletes
 (Very slightly later) Writer attempts a write, sees no file, creates a new one

작가가 치료할 수 있"tooLate"깃발로 동일합니다.그것은 단지를 만듭니다 파일,다른 이름으로 사용하는 버전 번호로 뒤의 일부 그것의 이름입니다.오프닝 세션에 파일을 먼저 시간이 필요합 디렉토리 검색,하지만 당신은 수 있는 숨기고 최신 이름입니다.

이는 가정 하나만 있을 수 있습니다 작가에 스레드를 위해 주어진 세 또는 그리 중재할 수 있는 사이에 두 개의 작가의 스레드를 만드는 파일이지만,해야 하는 사실에 대한 간단한 GC/작가 경우 작동합니다.

Windows의 경우 사용할 수 있습니다 file_flag_delete_on_close CreateFile에 대한 옵션 - 핸들을 닫을 때 파일이 삭제됩니다. 그러나 나는 이것이 당신의 의미론을 만족시킬 것이라고 확신하지 못한다 (나는 당신이 삭제-클로스 속성을 지울 수 있다고 생각하지 않기 때문이다.

여기에 또 다른 생각이 있습니다. 파일을 삭제하기 전에 파일을 바꾸는 것은 어떻습니까? 파일을 삭제하기로 결정한 후 쓰기가 들어오는 창을 닫을 수는 없지만 파일을 삭제하기 전에 파일의 이름을 바꾸면 어떻게됩니까? 그런 다음 쓰기가 들어 오면 세션 파일이 존재하지 않는 것을 알 수 있습니다.

명심해야 할 핵심은 단순히 문제의 창을 닫을 수 없다는 것입니다. IMHO 두 가지 솔루션이 있습니다.

  1. 언급 된 DJNA와 같은 깃발을 추가합니다
  2. 세션에 대한 직렬화의 불행한 부작용을 갖는 MUTEX라는 세션당을 인수해야합니다.

도구 플래그가있는 단점은 무엇입니까? 다시 말해, 파일을 조기에 삭제하면 어떤 문제가 있습니까? 결국 시스템이 없으면 파일을 처리해야합니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top