[Kernel32.dll] RateehardLinkは、RavenDB Embedded Backupの間にAzure Webサイトに「ファイルを既存の場合はファイルを作成できません」で失敗する

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

質問

Azure Webサイト内でRavendb.Embedded v2.0.2370を実行しています。

これはすべてバックアップ以外の期待どおりに機能しています。最後の成功したバックアップが最後に成功したバックアップが完全に機能するために使用されるバックアップルーチンは、1月6日の30日頃から日付(尋ねない)が1月6日午後6時、2月11日に次のバックアップを開始したことに気付きました。今までの他のすべてのものが始まったように、午前8時頃に失敗しました。

だから、2013年5月からWebアプリケーションの変更や展開がなかったため、Azureの横の2日の日付の間に何かが変更されている必要があるようです

だから私は調査をしました、そしてここに私の知見があります:

  • RAVENDBバックアップステータスは、開始された各バックアップ後の次のメッセージを表示します。

    バックアップの完了に失敗しました:そのファイルが既に存在するときにファイルを作成できません

  • RavenDBのロギングの有効化ログバックアップ

    を実行しているときに次のエラーが表示されます。

    2014-04-12 10:38:20.5797、Raven.Storage.Eesent.Backup.Backuperation、Error、完全なバックアップに失敗しました。 raven.database.backup.directorybackup.prepare()で raven.storage.esent.backup.backupperation.execute(オブジェクト無視)

  • Azure WebサイトForum 最後に成功したバックアップと最初のバックアップの間の期間内にAzure Webサイトのメンテナンスは計画されていません。 2013年12月9~15ルームと2014年3月10日から16歳までの

  • 私は azureサービスダッシュボードに気付いた。西ヨーロッパ地域の1月31日のWebサイトの問題は、北ヨーロッパの地域でホストされています

  • http://www.symbolsource.org/public/metadata/nuget/project/ravendb.database/2.5.2850/release/.netFramework.Version%3Dv4.5/Raven .database / raven.database / backup / directorybackup.cs?imagename= raven.database "rel=" nofollow "> Looking(最後のバージョンでさえ)障害 RavenDBコードEmbeddableDocumentStore.DocumentDatabase.StartBackup(...)

    として定義された外部メソッドであるRaven.Database.Backup.DirectoryBackup.Prepareを呼び出すときに例外がスローされているようです。
    [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を除外するために、私はバックアップルーチンの間に実際に何をしているかをシミュレートし、実行可能なものを展開して実行した後、次の小さなプログラムを作成しました(新しいAzure Portal

    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);
                }
            }
        }
    }
    
  • 式から特定のWebアプリケーションを除外するために、私は新しいAzure Webサイトを作成し、上記の同じ実行可能ファイルを作成し、

  • 彼らがまだRefsで起動していないと仮定するのは公平です(はハードリンクをサポートしていませんが、まだNTFSを使用していますか?

    < / li>

tl; dr

  • CreateHardLinkを呼び出しているAzure Webサイトで変更されたのは、前に機能している間に失敗しましたか?

  • これはどのようにラベンド語コードまたはRavenDBコードの外部に固定することができますか?

役に立ちましたか?

解決

アップデート:この問題は現在修正されています。CreateHardLinkD:\homeパスで動作する必要があります。

Azure Webサイトに関する問題であると思います。基本的には、デフォルトの相対パスを作成しようとすると、D:\home\になります。このフォルダは実際にはマシン上に存在しませんが、Azure Webサイトは便宜上偽造します。しかし、ここではCreateHardLink関数の問題を引き起こしているようです。

上記のサンプルのこの行を変更するだけの場合

const string tempPath = "TestTemp";
.

この

const string tempPath = @"C:\DWASFiles\Sites\<sitename>\VirtualDirectory0\site\TestTemp";
.

<sitename>をサイト名

に置き換えます。

それは仕事をします。

私は実際にはRavenDBに精通していませんが、上の仕事として、これらのディレクトリを上記のように見えるフルパスに変更しようとすることができます。その間にバグを報告します。それがあなたのためにうまくいくかどうか私に知らせてください

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top