[kernel32.dll]CreateHardLink 실패"파일을 만들 수 없습니다 해당 파일이 이미 있는 경우에"Azure 웹 사이트 중 RavenDb 임베디드 백업
-
21-12-2019 - |
문제
나는 실행 RavenDb.임베디드 v2.0.2370 내부 Azure 웹 사이트입니다.
이 모두가 예상대로 작동하 제외한 백업입니다.백업이 일상적인으로 시작 EmbeddableDocumentStore.DocumentDatabase.StartBackup(...)
용을 완벽하게 작동될 때까지는 것으로 나타났 마지막 백업이 성공적으로,날짜국에서 월 30 일(묻지 않:-))6PM UTC0 과는 다음 백업 시작 11 월 8AM UTC0,실패했으로 다른 모든 사람을 시작한 이후 지금까지.
그래서 그는 무언가가 있어야에서 변경된 사람들 2 날짜의 측면에 Azure,가 없기 때문에 변경하거나 배포의 웹 응용 프로그램을 수 있기 때문에 2013
그래서 나는 몇 가지 조사하고 여기에 내 결과:
이 RavenDb 백업 상태를 보여줍니다 다음과 같은 메시지 후에는 각 시작한 백업:
을 완료하지 못했기 때문에 백업:파일을 만들 수 없습니다 해당 파일이 이미 있는 경우
후에 로그 사용을 위한 RavenDb 로그를 파일에 다음과 같은 오류가 표시됩니다 실행하는 경우 백업
2014-04-12 10:38:20.5797,Raven.스토리지.Esent.백업입니다.BackupOperation,오류,을 완료하지 못했는"백업 시스템입니다.당 이벤트를 처리.Win32Exception(0x80004005):파일을 만들 수 없습니다 해당 파일이 이미 있는 경우 에서 까마귀.데이터베이스입니다.백업입니다.DirectoryBackup.Prepare() 에서 까마귀.스토리지.Esent.백업입니다.BackupOperation.Execute(객체를 무시)
에 따라 푸른 웹 사이트 forum 이 없었다는 계획된 유지 관리의 푸른 웹 사이트 사이의 기간에 마지막으로 성공한 첫 번째 실패 백업입니다.가 있었 사 9-15 월 2013 및 사 10-14 월 2014
았다에 통보 Azure 대시보드 서비스 문제는 웹사이트에 대 월 31 일에 서부 유럽 지역이지만 사이트를 호스팅하는 북한에서는 유럽 지역
면 고(심지어는 마지막 버전) 에 오류 RavenDb 코드
Raven.Database.Backup.DirectoryBackup.Prepare
그것은 예외가 발생되는 호출할 때CreateHardLink
는 외부 방법으로 정의[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool CreateHardLink(string lpFileName, string lpExistingFileName, IntPtr lpSecurityAttributes);
이상한 것은 코드를 실제로는 검사에 대한 특정한 예외는 다음과 같은 위(0x80004005),아직 예외는 여전히 던져...
if (Marshal.GetLastWin32Error() != 0x80004005) throw new Win32Exception();
그래서 제외 RavenDb 에서 방정식을 만들고,다음과 같은 작은 프로그램을 시뮬레이션 무엇 RavenDb 실제로 일을 하는 동안에 백업과 배포한 후 실행하고 그것을 실행(콘솔을 통해 기능을에서 찾을 새로운 azure 포털)에 푸른 웹 사이트 그것은 실패로:
using System; using System.ComponentModel; using System.IO; using System.Runtime.InteropServices; namespace HardLinkCreationTester { public class Program { [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool CreateHardLink(string lpFileName, string lpExistingFileName, IntPtr lpSecurityAttributes); static void Main() { const string sourcePath = "TestSource"; const string targetPath = "TestTarget"; const string tempPath = "TestTemp"; try { Directory.CreateDirectory(sourcePath); Directory.CreateDirectory(targetPath); Directory.CreateDirectory(tempPath); File.WriteAllText(Path.Combine(sourcePath, "testfile.txt"), "Test content"); string[] sourceFilesSnapshot = Directory.GetFiles(sourcePath); for (int index = 0; index < sourceFilesSnapshot.Length; index++) { var sourceFile = sourceFilesSnapshot[index]; var destFileName = Path.Combine(tempPath, Path.GetFileName(sourceFile)); if (!CreateHardLink(destFileName, sourceFile, IntPtr.Zero)) { // 'The system cannot find the file specified' is explicitly ignored here if (Marshal.GetLastWin32Error() != 0x80004005) throw new Win32Exception(); } } } finally { Directory.Delete(sourcePath); Directory.Delete(targetPath); Directory.Delete(tempPath); } } } }
을 제외한 웹 응용 프로그램 방정식에서,뿐만 아니라 내가 만들어 새로운 푸른 웹 사이트 배포되고 동일한 실행 위에서 언급하고 그것은 실패로
그것이 공평하다고 가정하지 않는 것을 아직에서 실행 되는 심판(는 하드 링크를 지원하지 않는 다)하지만 아직도 사용하여 NTFS?
tl;박사
에서 변경된 것은 무엇 Azure 웹 사이트를 만드는 전화
[kernel32.dll]CreateHardLink
실패하는 동안 그것은 작동하는 데 사용됩니까?방법이 될 수 있는 조정 외부 RavenDb 코드 또는 내부 RavenDb 코드...?
해결책
업데이트: 이 문제는 문제가 해결되었습니다. CreateHardLink
작동 D:\home
경로입니다.
나는 그것이 문제가 Azure 웹사이트입니다.기본적으로 만들려고 할 때 상대 경로로 그것은 기본적으로 D:\home\
.이 폴더에 실재하지 않은 기계에 있지만,Azure 웹사이트 그것은 가짜 편리합니다.그러나 여기에 그것이 될 것으로 보인 문제를 일으키는 가 CreateHardLink
기능입니다.
당신이 라인에서의 위 샘플
const string tempPath = "TestTemp";
이
const string tempPath = @"C:\DWASFiles\Sites\<sitename>\VirtualDirectory0\site\TestTemp";
대체 <sitename>
귀하의 사이트는 이름
그것은 작동합니다.
내가 정말 잘 알고 RavenDb,하지만 작업을 바꾸기 위해 노력하는 것이 이러한 디렉터리로 전체 경로로는 것처럼 보이게 한다.내가 보고서에서 버그니다.면 알려주는 작품을 위해 당신