[kernel32.dll]CreateHardLink 실패"파일을 만들 수 없습니다 해당 파일이 이미 있는 경우에"Azure 웹 사이트 중 RavenDb 임베디드 백업

StackOverflow https://stackoverflow.com//questions/23041289

문제

나는 실행 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,하지만 작업을 바꾸기 위해 노력하는 것이 이러한 디렉터리로 전체 경로로는 것처럼 보이게 한다.내가 보고서에서 버그니다.면 알려주는 작품을 위해 당신

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