Types de verrous opportunistes
Les opérations de verrouillage opportunistes fonctionnent avec quatre types de verrous opportunistes : niveau 1, niveau 2, lot et filtre. Les verrous opportunistes exclusifs sont des verrous de niveau 1, de lot et de filtre. Si un thread a un type de verrou exclusif sur un fichier, il ne peut pas également avoir un verrou de niveau 2 sur le même fichier.
Verrous opportunistes de niveau 1
Un verrou opportuniste de niveau 1 sur un fichier permet à un client de lire à l’avance dans le fichier et de mettre en cache les données en lecture-avance et en écriture à partir du fichier localement. Tant que le client dispose d’un accès unique à un fichier, il n’y a aucun danger pour la cohérence des données en fournissant un verrou opportuniste de niveau 1.
Le client peut demander un verrou opportuniste de niveau 1 après l’ouverture d’un fichier. Si aucun autre client (ou aucun autre thread sur le même client) n’a le fichier ouvert, le serveur peut accorder le verrou opportuniste. Le client peut ensuite mettre en cache les données de lecture et d’écriture à partir du fichier localement. Si un autre client a ouvert le fichier, le serveur refuse le verrou opportuniste et le client n’effectue aucune mise en cache locale. (Le serveur peut refuser le verrou opportuniste pour d’autres raisons, comme ne pas prendre en charge les verrous opportunistes.)
Lorsque le serveur ouvre un fichier qui a déjà un verrou opportuniste de niveau 1 sur celui-ci, le serveur examine l’état de partage du fichier avant de rompre le verrou opportuniste de niveau 1. Si le serveur interrompt le verrou après cet examen, le temps que le client avec l’ancien verrou passe à vider son cache d’écriture est le temps que le client demandant le fichier doit attendre. Cette dépense de temps signifie que les verrous opportunistes de niveau 1 doivent être évités sur les fichiers ouverts par de nombreux clients.
Toutefois, étant donné que le serveur vérifie l’état de partage avant d’interrompre le verrou, dans le cas où le serveur refuserait une demande ouverte en raison d’un conflit de partage, le serveur n’interrompt pas le verrou. Par exemple, si vous avez ouvert un fichier, refusé le partage pour les opérations d’écriture et obtenu un verrou de niveau 1, le serveur refuse la demande d’un autre client d’ouvrir le fichier pour écriture avant même d’examiner votre verrou sur le fichier. Dans cet exemple, votre verrou opportuniste n’est pas rompu.
Pour obtenir un exemple de fonctionnement d’un verrou opportuniste de niveau 1, consultez l’exemple de verrou opportuniste de niveau 1. Pour plus d’informations sur les verrous opportunistes cassants, consultez Cassant les verrous opportunistes.
Verrous opportunistes de niveau 2
Un verrou opportuniste de niveau 2 informe un client qu’il existe plusieurs clients simultanés d’un fichier et qu’aucun ne l’a encore modifié. Ce verrou permet au client d’effectuer des opérations de lecture et d’obtenir des attributs de fichier à l’aide d’informations locales mises en cache ou en lecture anticipée, mais le client doit envoyer toutes les autres demandes (par exemple, pour les opérations d’écriture) au serveur. Votre application doit utiliser le verrou opportuniste de niveau 2 lorsque vous attendez que d’autres applications écrivent dans le fichier au hasard ou lisent le fichier de manière aléatoire ou séquentielle.
Un verrou opportuniste de niveau 2 est très similaire à un verrou opportuniste de filtre. Dans la plupart des cas, votre application doit utiliser le verrou opportuniste de niveau 2. Utilisez uniquement le verrou de filtre si vous ne souhaitez pas que les opérations d’ouverture pour la lecture entraînent des violations en mode partage dans le délai entre l’ouverture du fichier et la réception du verrou par votre application. Pour plus d’informations, consultez Filtrer les verrous opportunistes et la réponse du serveur aux demandes ouvertes sur les fichiers verrouillés.
Pour plus d’informations sur les verrous opportunistes cassants, consultez Cassant les verrous opportunistes.
Verrous opportunistes batch
Un verrou opportuniste par lots manipule les ouvertures et les fermetures de fichiers. Par exemple, dans l’exécution d’un fichier de commandes, le fichier batch peut être ouvert et fermé une fois pour chaque ligne du fichier. Un verrou opportuniste par lot ouvre le fichier batch sur le serveur et le maintient ouvert. Comme le processeur de commandes « ouvre » et « ferme » le fichier de commandes, le redirecteur réseau intercepte les commandes d’ouverture et de fermeture. Tous les serveurs reçoivent les commandes de recherche et de lecture. Si le client lit également à l’avance, le serveur reçoit une demande de lecture particulière au plus une fois.
Lors de l’ouverture d’un fichier qui a déjà un verrou opportuniste par lot, le serveur vérifie l’état de partage du fichier après avoir rompu le verrou. Cette vérification donne au titulaire du verrou la possibilité de vider son cache et de fermer le handle de fichier. Une opération ouverte tentée pendant la vérification de partage n’entraîne pas l’échec de la vérification de partage si le détenteur du verrou libère le verrou.
Pour obtenir un exemple de fonctionnement d’un verrou opportuniste par lot, consultez Batch Opportunistic Lock Example. Pour plus d’informations sur les verrous opportunistes cassants, consultez Cassant les verrous opportunistes.
Filtrer les verrous opportunistes
Un verrou opportuniste de filtre verrouille un fichier afin qu’il ne puisse pas être ouvert pour l’accès en écriture ou en suppression. Tous les clients doivent pouvoir partager le fichier. Les verrous de filtre permettent aux applications d’effectuer des opérations de filtrage nontrusives sur les données de fichier (par exemple, un compilateur ouvrant le code source ou un programme de catalogage).
Un verrou opportuniste de filtre diffère d’un verrou opportuniste de niveau 2, car il permet aux opérations ouvertes de lecture de se produire sans violations en mode partage entre l’ouverture du fichier et la réception du verrou par votre application. Le verrou opportuniste de filtre est le meilleur verrou à utiliser lorsqu’il est important d’autoriser d’autres clients à lire l’accès. Dans d’autres cas, votre application doit utiliser un verrou opportuniste de niveau 2. Un verrou opportuniste de filtre diffère d’un verrou opportuniste par lot, car il n’autorise pas la gestion de plusieurs ouvertures et fermetures par le redirecteur réseau de la façon dont un verrou opportuniste par lot s’effectue.
Votre application doit demander un verrou opportuniste de filtre sur un fichier en trois étapes :
- Utilisez la fonction CreateFile pour ouvrir un handle dans le fichier avec le paramètre DesiredAccess défini sur zéro, indiquant qu’aucun accès n’est indiqué et que le paramètre dwShareMode est défini sur l’indicateur FILE_SHARE_READ pour autoriser le partage pour la lecture. Le handle obtenu à ce stade est appelé handle de verrouillage.
- Demandez un verrou sur ce handle avec le code de contrôle FSCTL_REQUEST_FILTER_OPLOCK .
- Lorsque le verrou est accordé, utilisez CreateFile pour ouvrir à nouveau le fichier avec DesiredAccess défini sur l’indicateur GENERIC_READ . Définissez dwShareMode sur l’indicateur FILE_SHARE_READ pour permettre à d’autres utilisateurs de lire le fichier lorsque vous l’avez ouvert, l’indicateur FILE_SHARE_DELETE pour autoriser d’autres utilisateurs à marquer le fichier pour suppression pendant que vous l’avez ouvert, ou les deux. Le handle obtenu à ce stade est appelé handle de lecture.
Utilisez le handle de lecture pour lire ou écrire dans le contenu du fichier.
Lors de l’ouverture d’un fichier qui a déjà un verrou opportuniste de filtre, le serveur interrompt le verrou, puis vérifie l’état de partage du fichier. Cette vérification donne au client qui a conservé l’ancien verrou opportuniste une chance d’abandonner toutes les données mises en cache et de confirmer l’arrêt. Une opération ouverte tentée pendant cette vérification de partage n’entraîne pas l’échec de la vérification de partage si l’ancien détenteur du verrou libère le verrou. Le système de fichiers conserve en suspens l’opération d’ouverture jusqu’à ce que le propriétaire du verrou ferme à la fois le handle de lecture, puis le handle de verrouillage. Une fois cette opération effectuée, la demande ouverte de l’autre client peut continuer.
Pour plus d’informations sur les verrous opportunistes cassants, consultez Cassant les verrous opportunistes.