[kernel32.dll]CreateHardLink فشل مع "لا يمكن إنشاء ملف عند وجود الملف بالفعل" على أزور الموقع خلال RavenDb جزءا لا يتجزأ من النسخ الاحتياطي
-
21-12-2019 - |
سؤال
أنا على التوالي RavenDb.جزءا لا يتجزأ v2.0.2370 داخل أزور موقع ويب.
كل هذه تعمل كما هو متوقع باستثناء النسخ الاحتياطي.النسخ الاحتياطي الروتين الذي بدأ مع EmbeddableDocumentStore.DocumentDatabase.StartBackup(...)
أعمل تماما حتى أنني لاحظت أن أنا, التمور من حوالي 30 يناير (لا تسأل :-)) حوالي 6 مساء UTC0 القادم النسخ الاحتياطي التي بدأت في 11 شباط / فبراير حوالي الساعة 8 صباحا UTC0 فشلت ، كما تفعل كل منها الأخرى بدأت بعد ذلك حتى الآن.
لذلك يبدو أن شيئا قد تغير في بين 2 التواريخ على جانب أزور ، كما كانت هناك أي تغييرات أو نشر تطبيق ويب منذ مايو 2013
هكذا فعلت بعض التحقيقات و ها هي النتائج:
على RavenDb النسخ الاحتياطي حالة تظهر الرسالة التالية بعد كل شرع النسخ الاحتياطي:
فشل في إكمال النسخ الاحتياطي بسبب:لا يمكن إنشاء ملف عند وجود الملف بالفعل
بعد تمكين تسجيل RavenDb ملف السجل يظهر الخطأ التالي عند تشغيل النسخ الاحتياطي
2014-04-12 الساعة 10:38:20.5797 ، الغراب.تخزين.Esent.النسخ الاحتياطي.BackupOperation,خطأ,فشل في إكمال النسخ الاحتياطي"النظام.ComponentModel.Win32Exception (0x80004005):لا يمكن إنشاء ملف عند وجود الملف بالفعل في الغراب.قاعدة البيانات.النسخ الاحتياطي.DirectoryBackup.إعداد() في الغراب.تخزين.Esent.النسخ الاحتياطي.BackupOperation.تنفيذ(كائن تجاهل)
وفقا أزور المواقع المنتدى لم يكن هناك أي مخطط صيانة أزور المواقع على شبكة الإنترنت في الفترة الأخيرة الناجحة الأولى فشل النسخ الاحتياطي.كان هناك ما بين 9-15 كانون الأول / ديسمبر 2013 بين 10-14 مارس 2014
لم ألاحظ على أزور الخدمة لوحة التحكم مشكلة مع مواقع ويب على 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 يقوم به فعلا أثناء النسخ الاحتياطي الروتينية ، بعد نشر الملف القابل للتنفيذ وتنفيذ ذلك (من خلال وحدة التحكم ميزة الاطلاع على جديد أزور البوابة) على أزور الموقع فإنه فشل كذلك:
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;dr
ما الذي تغير على أزور مواقع ويب الذي يجعل الدعوة إلى
[kernel32.dll]CreateHardLink
تفشل في حين أنه كان يعمل من قبل ؟كيف يمكن أن يكون هذا ثابت خارج RavenDb رمز أو داخل RavenDb رمز...?
المحلول
تحديث: تم إصلاح هذه المشكلة من الآن. CreateHardLink
يجب أن تعمل مع D:\home
مسارات.
اعتقد انها مشكلة أزور المواقع.أساسا عند محاولة إنشاء مسار نسبي الافتراضي إلى D:\home\
.هذا المجلد لا وجود لها في الواقع على الجهاز ، ولكن أزور مواقع مزيفة من الراحة.لكن هنا يبدو أن تسبب المشكلة مع CreateHardLink
وظيفة.
إذا كنت مجرد تغيير هذا الخط في عينة أعلاه
const string tempPath = "TestTemp";
هذا
const string tempPath = @"C:\DWASFiles\Sites\<sitename>\VirtualDirectory0\site\TestTemp";
محل <sitename>
مع اسم موقعك
أنه سوف يعمل.
أنا لست على دراية RavenDb ، ولكن كما عمل في جميع أنحاء يمكنك محاولة تغيير هذه الدلائل في المسارات الكاملة التي تبدو مثل واحد أعلاه.سوف تقرير علة في هذه الأثناء.اسمحوا لي أن أعرف إذا كان هذا يناسبك