[kernel32.dll]CreateHardLink produce el error de que No puede crear un archivo que ya existe" en el sitio Web de Azure durante RavenDb Incrustado de copia de seguridad

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

Pregunta

Estoy corriendo RavenDb.Incrustado v2.0.2370 dentro de un sitio Web de Azure.

Todo esto está funcionando como se esperaba, excepto para la copia de seguridad.La rutina de copia de seguridad que se inicia con EmbeddableDocumentStore.DocumentDatabase.StartBackup(...) se utiliza para trabajar perfectamente hasta que me di cuenta de que la última copia de seguridad correcta, data de alrededor del 30 de enero (no pregunte :-)) alrededor de las 6 PM UTC0 y que la próxima copia de seguridad inició el 11 de febrero alrededor de las 8 AM UTC0 fracasado, como lo hacen todos los otros iniciados posteriormente hasta ahora.

Así que parece que algo debe de haber cambiado entre esas 2 fechas en el lado de Azure, como no ha habido cambios o implementaciones de la aplicación web desde Mayo de 2013

Así que hice un poco de investigación y aquí están mis conclusiones:

  • La RavenDb de copia de seguridad de estado muestra el mensaje siguiente después de cada copia de seguridad iniciada:

    No se pudo completar la copia de seguridad porque:No se puede crear un archivo que ya existe

  • Después de activar el registro de RavenDb el archivo de registro muestra el siguiente error cuando se ejecuta la copia de seguridad

    2014-04-12 10:38:20.5797,Raven.De almacenamiento.Esent.De copia de seguridad.BackupOperation,Error,no pudo completar la copia de seguridad"del Sistema.ComponentModel.Win32Exception (0 x 80004005):No se puede crear un archivo que ya existe en Raven.La base de datos.De copia de seguridad.DirectoryBackup.Prepare() en Raven.De almacenamiento.Esent.De copia de seguridad.BackupOperation.Ejecutar(Objeto ignorado)

  • De acuerdo a la Azure Web Sites foro no ha habido ningún mantenimiento planificado de los Sitios Web de Azure en el período comprendido entre la última y la primera fallando copia de seguridad.Ha habido entre 9-15 de diciembre de 2013 y entre el 10-14 de Marzo de 2014

  • Me di cuenta en el Azure Servicio De Dashboard un problema con los Sitios Web el 31 de enero, en el Oeste de la Región Europea, pero el sitio está alojado en el Norte de la Región Europea de

  • Cuando buscando (incluso la última versión) en el errores RavenDb código Raven.Database.Backup.DirectoryBackup.Prepare parece que la excepción se produce cuando llamar CreateHardLink que es un método externo definido como

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

    Lo extraño es que el código que realmente se comprueba la excepción específica se muestra arriba (0 x 80004005), sin embargo, la excepción es lanzado todavía...

    if (Marshal.GetLastWin32Error() != 0x80004005)
      throw new Win32Exception();
    
  • Para excluir RavenDb a partir de la ecuación, he creado el siguiente programa que simula lo que RavenDb está haciendo en realidad durante su rutina de copia de seguridad, y después de implementar el ejecutable y ejecutarlo (a través de la Consola característica que se encuentra en la nuevo portal de azure) en el Sitio Web de Azure se produce un error así:

    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);
                }
            }
        }
    }
    
  • Para excluir mi aplicación web específica de la ecuación, he creado un nuevo Sitio Web de Azure y desplegado el mismo ejecutable mencionados anteriormente y se produce un error así

  • Es justo suponer que aún no están en ejecución en ReFS (que no admite enlaces duros), pero todavía están usando NTFS?

tl;dr

  • Lo que ha cambiado en Azure Sitios Web que realiza una llamada a [kernel32.dll]CreateHardLink fallar mientras se trabajaba antes?

  • ¿Cómo puede ser esto fijo fuera de RavenDb código o en el interior de RavenDb código de...?

¿Fue útil?

Solución

Actualización: este problema se ha resuelto ahora. CreateHardLink debe trabajar con D:\home rutas de acceso.

Creo que es un problema con los Sitios web de Azure.Básicamente cuando intenta crear una ruta de acceso relativa por defecto D:\home\.Esta carpeta no existe realmente en la máquina, pero los Sitios web de Azure falsificaciones por comodidad.Sin embargo aquí parece estar provocando el problema con CreateHardLink la función.

si usted acaba de cambiar esta línea en el ejemplo anterior

const string tempPath = "TestTemp";

a este

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

reemplazar <sitename> con el nombre de su sitio web

te va a funcionar.

No estoy muy familiarizado con los RavenDb, sino como un trabajo alrededor de usted puede tratar de cambiar estos directorios en las rutas de acceso completas que se parecen a la de arriba.Voy a reportar el error en el ínterin.Déjeme saber si funciona para usted

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top