[kernel32.dll]CreateHardLink فشل مع "لا يمكن إنشاء ملف عند وجود الملف بالفعل" على أزور الموقع خلال RavenDb جزءا لا يتجزأ من النسخ الاحتياطي

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

سؤال

أنا على التوالي 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 ، ولكن كما عمل في جميع أنحاء يمكنك محاولة تغيير هذه الدلائل في المسارات الكاملة التي تبدو مثل واحد أعلاه.سوف تقرير علة في هذه الأثناء.اسمحوا لي أن أعرف إذا كان هذا يناسبك

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top