Question

Mon Win32 app A1 (en fait un ensemble de processus) tente d'utiliser CreateDirectory pour créer un répertoire D1 au sein de répertoire parent P. Le chemin P est la valeur de la variable d'environnement TMP, ce qui rend P a potentiellement occupé, mais en général lieu permissive. La grande majorité du temps, tout fonctionne très bien, mais rarement, CreateDirectory échoue et GetLastError retourne alors ERROR_ACCESS_DENIED, dont le sens dans ce contexte n'est pas documenté.

J'ai écrit une application de test A2 qui ne fait rien, mais crée à plusieurs reprises et supprimer un répertoire D2 aussi vite que possible au sein de P, et j'ai choisi un nom long pour Goofy D2 que je suis confiant ne pas entrer en collision avec tout ce que tout autre programme utiliserait. Une fois toutes les quelques minutes, il y a une petite fraction de seconde au cours de laquelle les tentatives de A2 pour créer le rendement D2 seulement des échecs ERROR_ACCESS_DENIED.

A1 devient très occupé au sein de P au cours de sa course. Alors que A1 et A2 sont en cours d'exécution en même temps, les périodes d'insuffisance ERROR_ACCESS_DENIED se produisent un peu plus souvent, comme si A1 et A2 sont en compétition pour l'accès exclusif à P. (Je suis absolument certain que A1 n'utilise pas le même nom que D2. :-)

Je suis un peu enclin à prendre ERROR_ACCESS_DENIED signifie « essayer à nouveau dans quelques millisecondes, et si cela ne fonctionne pas après quelques essais, abandonner », mais je suis inquiète du fait que [a] dans certains cas peut signifier quelque chose de permanent que je tenir compte tout de suite, et [b] parce que je ne sais pas vraiment ce qui se passe, il peut ne pas être possible d'établir avec confiance une quantité raisonnable de temps pour continuer à essayer.

Quelqu'un a une expérience avec cela? Aucun conseil? D'une valeur particulière à ce stade serait des indices sur les causes de ce que je puisse reproduire le problème plus facilement.

Était-ce utile?

La solution

Vous avez raison mort. ne liste même pas ERROR_ACCESS_DENIED comme possible code d'erreur pour cette fonction il pourrait bien être un bug.

Je ne vous suggérez que la mise en œuvre d'une stratégie de nouvelle tentative / backoff.

En d'autres termes, si vous obtenez cette erreur, essayez à nouveau jusqu'à trois fois sans retard (arrêt de toute évidence à tout moment ici si vous obtenez un code de retour d'erreur), puis jusqu'à quatre fois avec des retards ( par exemple, 100 millisecondes, 500 millisecondes, 1 seconde et 2 secondes).

Ce genre de stratégie (que je l'ai utilisé auparavant) obtient habituellement autour de toute pénurie de ressources temporaires. Si vous ne pouvez toujours pas créer le répertoire après 7 tentatives et 3.6 + secondes, vous pouvez probablement supposer sans risque, il ne va pas se produire.

Votre fonction pourrait être aussi laid que (pseudo-code):

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);

mais vous pouvez vous rendre un peu plus élégant:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top