Domanda

Il mio Win32 app A1 (in realtà un insieme di processi) sta cercando di utilizzare CreateDirectory creare una directory D1 all'interno di directory padre P. Il percorso P è il valore della variabile d'ambiente TMP, il che rende un P potenzialmente occupato, ma in generale posto permissiva. La stragrande maggioranza del tempo, tutto funziona bene, ma, raramente, CreateDirectory non riesce e GetLastError poi ritorna ERROR_ACCESS_DENIED, il cui significato in questo contesto non è documentato.

Ho scritto un'applicazione A2 test che non fa altro che ripetutamente creare ed eliminare una directory D2 veloce come si può all'interno di P, e ho scelto un nome lungo goofy per il D2, che sono sicuro non entri in collisione con qualsiasi che qualsiasi altro il programma avrebbe utilizzato. Una volta ogni pochi minuti, c'è una piccola frazione di secondo, durante il quale i tentativi di A2 per creare D2 resa solo i malfunzionamenti ERROR_ACCESS_DENIED.

A1 diventi molto affollato all'interno di P durante la sua corsa. Mentre A1 e A2 sono eseguiti contemporaneamente, i periodi di fallimento ERROR_ACCESS_DENIED verificano po 'più frequentemente, come se A1 e A2 sono in competizione per l'accesso esclusivo a P. (sono assolutamente certo che A1 non utilizza lo stesso nome di D2. :-)

Sono un po 'incline a prendere ERROR_ACCESS_DENIED a significare "provare di nuovo in pochi millisecondi, e se questo non funziona dopo alcuni tentativi, rinunciare", ma sono preoccupato che [a] in alcuni casi può significare qualcosa di permanente che avrei dovuto ascoltare subito, e [b] perché io non so davvero cosa sta succedendo, potrebbe non essere possibile stabilire con sicurezza un ragionevole lasso di tempo per continuare a provare.

Qualcuno ha esperienza con questo? Qualche consiglio? Di particolare valore a questo punto sarebbe indizi su ciò che provoca questo in modo da poter riprodurre il problema più facilmente.

È stato utile?

Soluzione

Hai ragione morto. Il documentazione fa elenco neanche ERROR_ACCESS_DENIED come un possibile codice di errore per quella funzione così può ben essere un bug.

I avrebbe fatto come lei suggerisce l'implementazione di una strategia / tentativi di backoff.

In altre parole, se si ottiene questo errore, riprovare fino a tre volte senza alcun ritardo (ovviamente interrompere in qualsiasi punto qui se si ottiene un codice di ritorno diverso da errore), poi fino a quattro volte di più con ritardi di ( per esempio, 100 millisecondi, 500 millisecondi, 1 secondo e 2 secondi).

Questo tipo di strategia (che ho usato prima) di solito ottiene intorno a qualsiasi carenza di risorse temporanee. Se ancora non è possibile creare la directory dopo 7 tentativi e 3,6 + secondi, probabilmente si può tranquillamente assumere che non succederà.

La funzione potrebbe essere brutto come (pseudo-codice):

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

, ma si può decidere di rendere un po 'più 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top