[Kernel32.dll] RateehardLinkは、RavenDB Embedded Backupの間にAzure Webサイトに「ファイルを既存の場合はファイルを作成できません」で失敗する
-
21-12-2019 - |
質問
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サービスダッシュボードに気付いた。西ヨーロッパ地域の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コードの外部に固定することができますか?
解決
アップデート:この問題は現在修正されています。CreateHardLink
はD:\home
パスで動作する必要があります。
Azure Webサイトに関する問題であると思います。基本的には、デフォルトの相対パスを作成しようとすると、D:\home\
になります。このフォルダは実際にはマシン上に存在しませんが、Azure Webサイトは便宜上偽造します。しかし、ここではCreateHardLink
関数の問題を引き起こしているようです。
上記のサンプルのこの行を変更するだけの場合
const string tempPath = "TestTemp";
.
この
にconst string tempPath = @"C:\DWASFiles\Sites\<sitename>\VirtualDirectory0\site\TestTemp";
.
<sitename>
をサイト名
それは仕事をします。
私は実際にはRavenDBに精通していませんが、上の仕事として、これらのディレクトリを上記のように見えるフルパスに変更しようとすることができます。その間にバグを報告します。それがあなたのためにうまくいくかどうか私に知らせてください