Pregunta

A1 Mi Win32 aplicación (en realidad una colección de procesos) está tratando de utilizar CreateDirectory para crear un directorio D1 dentro de directorio padre P. El camino a P es el valor de la variable de entorno TMP, lo que hace un P potencialmente ocupada, pero en general lugar permisiva. La gran mayoría de las veces, todo funciona bien, pero, en raras ocasiones, CreateDirectory falla y luego vuelve GetLastError ERROR_ACCESS_DENIED, cuyo significado en este contexto no se documenta.

Me escribió una aplicación A2 de prueba que no hace más que repetidamente crear y eliminar un directorio D2 tan rápido como se pueda dentro de P, y elegí un nombre largo torpe para D2, que estoy seguro no colisiona con cualquier que cualquier otra programa usaría. Una vez cada pocos minutos, hay una pequeña fracción de un segundo durante el cual los intentos de A2 para crear rendimiento D2 sólo fallos ERROR_ACCESS_DENIED.

A1 se pone bastante lleno dentro de P durante su funcionamiento. Mientras que A1 y A2 están ejecutando al mismo tiempo, los períodos de pérdidas de ERROR_ACCESS_DENIED producen algo más frecuencia, como si A1 y A2 están compitiendo por el acceso exclusivo a P. (estoy absolutamente seguro de que A1 no utiliza el mismo nombre que D2. :-)

Estoy un poco inclinado a tomar ERROR_ACCESS_DENIED para significar "vuelve a intentarlo en unos pocos milisegundos, y si eso no funciona después de varios intentos, se dio por vencido", pero me preocupa que [a] en algunos casos puede significar algo permanente que debería prestar atención de inmediato, y [b] porque no se sabe muy bien lo que está pasando, puede que no sea posible establecer con seguridad una cantidad razonable de tiempo para seguir intentando.

¿Alguien tiene experiencia con esto? ¿Algún consejo? De valor particular en este punto sería pistas sobre las causas de esta para que pueda reproducir el problema con mayor facilidad.

¿Fue útil?

Solución

Tienes razón muertos. El documentación hace la lista ni siquiera ERROR_ACCESS_DENIED como un posible código de error para esa función por lo que bien puede ser un error.

Yo haría lo que usted sugiere en la implementación de una estrategia de reintento / reducción de potencia.

En otras palabras, si usted consigue que el error, vuelve a intentarlo hasta tres veces sin retardo (obviamente parar en cualquier punto aquí si recibe un código de retorno distinto de error), a continuación, hasta cuatro veces más con retrasos de ( por ejemplo, 100 milisegundos, 500 milisegundos, 1 segundo y 2 segundos).

Este tipo de estrategia (que he usado antes) normalmente recibe alrededor de cualquier escasez de recursos temporales. Si todavía no se puede crear el directorio después de 7 intentos y 3,6 + segundos, es probable que pueda con seguridad asumir que no va a suceder.

Su función podría ser tan feo como (pseudo-código):

def createMyDir (dirname):
    if createDir (dirName) return true;
    if createDir (dirName) return true;
    if createDir (dirName) return true;
    sleep (100)
    if createDir (dirName) return true;
    sleep (500)
    if createDir (dirName) return true;
    sleep (1000)
    if createDir (dirName) return true;
    sleep (2000)
    return createDir (dirName);

pero es posible que desee hacer un poco más elegante:

def createMyDir (dirname):
    delay = pointer to array [0, 0, 0, 100, 500, 1000, 2000, -1]
    okay = createDir (dirName)
    while not okay and [delay] not -1:
        if [delay] not 0:
            sleep ([delay])
        delay = next delay
        okay = createDir (dirName)
    return okay
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top