[kernel32.dll]CreateHardLink échoue avec “Impossible de créer un fichier existe déjà” sur Azure Site web pendant RavenDb Intégré de sauvegarde

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

Question

Je suis en cours d'exécution RavenDb.Intégré v2.0.2370 à l'intérieur d'un Azure Web site.

Tout cela fonctionne comme prévu, sauf pour la sauvegarde.La routine de sauvegarde initiée avec EmbeddableDocumentStore.DocumentDatabase.StartBackup(...) utilisés pour fonctionner parfaitement jusqu'à ce que j'ai remarqué que la dernière sauvegarde réussie, les dates de partout dans le 30 janvier (ne demandez pas :-)) autour de 6 H UTC0 et que le prochain lancement d'une sauvegarde, le 11 février, vers 8 heures UTC0 échoué, comme le font tous les autres initiée par la suite jusqu'à maintenant.

Il semble donc que quelque chose doit avoir été changé entre ces 2 dates sur la côte d'Azur, comme il n'y a pas de changements ou de déploiement de l'application web depuis Mai 2013

J'ai donc fait quelques recherches et voici mes conclusions:

  • Le RavenDb de sauvegarde d'état affiche le message suivant après chaque sauvegarde à l'initiative de:

    N'a pas pu terminer la sauvegarde, car:Impossible de créer un fichier existe déjà

  • Après activation de la journalisation pour RavenDb le fichier journal indique l'erreur suivante lors de l'exécution de la sauvegarde

    2014-04-12 10:38:20.5797,Raven.Le stockage.Esent.La sauvegarde.BackupOperation,l'Erreur,l'Échec de sauvegarde complète,"le Système de.ComponentModel.Win32Exception (0x80004005):Impossible de créer un fichier existe déjà Raven.La base de données.La sauvegarde.DirectoryBackup.Prepare() Raven.Le stockage.Esent.La sauvegarde.BackupOperation.Execute(Objet ignoré)

  • Selon l' Azure Web Sites forum il n'y a pas d'entretien planifié de l'Azure Web Sites dans la période entre la dernière et la première à défaut de sauvegarde.Il y a eu entre 9-15 décembre 2013 et entre 10-14 Mars 2014

  • J'ai fait un avis sur la Azure Service De Tableau De Bord un problème avec les Sites Web sur le 31 janvier dans l'Ouest de la Région Européenne, mais le site est hébergé dans la Région Nord de l'europe

  • Lorsque à la recherche (même la dernière version) à l' défaillant RavenDb code Raven.Database.Backup.DirectoryBackup.Prepare il semble que l'exception est levée lors de l'appel CreateHardLink qui est une méthode externe définie comme

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool CreateHardLink(string lpFileName, string lpExistingFileName, IntPtr lpSecurityAttributes);
    

    La chose étrange est que le code vérifie l'exception spécifique indiqué ci-dessus (0 x 80004005), mais l'exception est encore jetés...

    if (Marshal.GetLastWin32Error() != 0x80004005)
      throw new Win32Exception();
    
  • Afin d'exclure RavenDb à partir de l'équation, j'ai créé un petit programme qui simule ce RavenDb est en train de faire au cours de sa routine de sauvegarde, et après le déploiement de l'exécutable et l'exécution (par le biais de la Console de fonctionnalité que l'on trouve sur le nouveau portail azure) sur le Site Web Azure il échoue aussi bien:

    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);
                }
            }
        }
    }
    
  • Exclure mon application web spécifique à partir de l'équation ainsi, j'ai créé une nouvelle Azure Web Site et déployé le même exécutable mentionné ci-dessus et il échoue aussi bien

  • Il est juste de supposer qu'ils ne sont pas encore en cours d'exécution sur ReFS (qui ne prend pas en charge les liens durs), mais sont toujours à l'aide de NTFS?

tl;dr

  • Ce qui a changé sur Azure Web Sites qui effectue un appel à [kernel32.dll]CreateHardLink l'échec alors que ça marchait avant?

  • Comment cela peut-il être fixé à l'extérieur de RavenDb code ou à l'intérieur de RavenDb code...?

Était-ce utile?

La solution

Mise à jour: ce problème est résolu maintenant. CreateHardLink devrait fonctionner avec D:\home les chemins d'accès.

Je pense que c'est un problème avec les Sites web Azure.Fondamentalement, lorsque vous essayez de créer un chemin relatif par défaut D:\home\.Ce dossier n'existe pas réellement sur la machine, mais Azure Sites fakes pour la commodité.Cependant ici, il semble être à l'origine de la question avec CreateHardLink fonction.

si vous venez de modifier cette ligne dans votre exemple ci-dessus

const string tempPath = "TestTemp";

pour ce

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

remplacer <sitename> avec le nom de votre site

il vous permettra de travailler.

Je ne suis pas vraiment familier avec RavenDb, mais comme un travail, vous pouvez essayer de modifier ces répertoires dans le chemin qui ressemble à celui ci-dessus.Je vais signaler le bug dans l'intervalle.Laissez-moi savoir si cela fonctionne pour vous

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top