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 les 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 anticipée et en écriture à partir du fichier localement. Tant que le client a seul accès à un fichier, il n’y a aucun danger pour la cohérence des données à fournir 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 ouvert le fichier, le serveur peut accorder le verrou opportuniste. Le client peut ensuite mettre en cache des 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 également refuser le verrou opportuniste pour d’autres raisons, par exemple pour ne pas prendre en charge les verrous opportunistes.)

Lorsque le serveur ouvre un fichier qui a déjà un verrou opportuniste de niveau 1, le serveur examine l’état de partage du fichier avant de briser 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 que de nombreux clients ouvrent.

Toutefois, étant donné que le serveur vérifie l’état de partage avant de briser le verrou, dans le cas où le serveur refuserait une demande ouverte en raison d’un conflit de partage, le serveur ne casse 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 cette instance, votre verrou opportuniste n’est pas cassé.

Pour obtenir un exemple de fonctionnement d’un verrou opportuniste de niveau 1, consultez 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 vous attendez à ce 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 le verrou de filtre uniquement si vous ne souhaitez pas que les opérations d’ouverture pour la lecture entraînent des violations du mode de partage dans l’intervalle de temps entre l’ouverture du fichier de votre application et la réception du verrou. Pour plus d’informations, consultez Filtrer les verrous opportunistes et réponse du serveur aux demandes d’ouverture sur les fichiers verrouillés.

Pour plus d’informations sur les verrous opportunistes cassants, consultez Cassant les verrous opportunistes.

Verrous opportunistes par lots

Un verrou opportuniste par lot manipule les ouvertures et les fermetures de fichiers. Par exemple, dans l’exécution d’un fichier batch, le fichier batch peut être ouvert et fermé une fois pour chaque ligne du fichier. Un verrou opportuniste de lot ouvre le fichier batch sur le serveur et le maintient ouvert. Lorsque le processeur de commandes « ouvre » et « ferme » le fichier batch, le redirecteur réseau intercepte les commandes ouvrir et fermer. Toutes les commandes reçues par le serveur sont 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 case activée donne au titulaire du verrou la possibilité de terminer le vidage de son cache et de fermer le handle de fichier. Une opération d’ouverture tentée pendant le case activée de partage n’entraîne pas l’échec de l’case activée de partage si le verrou est libéré par le verrou.

Pour obtenir un exemple de fonctionnement d’un verrou opportuniste par lot, consultez Exemple de verrou opportuniste batch. 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 un 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 non intrusives sur des 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 en ce qu’il permet aux opérations ouvertes de lecture de se produire sans violations du mode de partage dans l’intervalle de temps entre l’ouverture du fichier de votre application et la réception du verrou. 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 en ce qu’il ne permet pas à plusieurs ouvertures et fermetures d’être gérés par le redirecteur réseau comme le fait un verrou opportuniste de lot.

Votre application doit demander un verrou opportuniste de filtre sur un fichier en trois étapes :

  1. Utilisez la fonction CreateFile pour ouvrir un handle dans le fichier avec le paramètre DesiredAccess défini sur zéro, indiquant aucun accès, et le paramètre dwShareMode défini sur l’indicateur FILE_SHARE_READ pour permettre le partage à des fins de lecture. Le handle obtenu à ce stade est appelé handle de verrouillage.
  2. Demandez un verrou sur ce handle avec le code de contrôle FSCTL_REQUEST_FILTER_OPLOCK .
  3. 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 personnes de lire le fichier pendant que vous l’avez ouvert, l’indicateur FILE_SHARE_DELETE pour permettre à d’autres personnes de marquer le fichier en vue de sa suppression lorsque 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 case activée donne au client qui détenait l’ancien verrou opportuniste la possibilité d’abandonner toutes les données mises en cache et de reconnaître l’interruption. Une opération d’ouverture tentée pendant cette case activée de partage n’entraîne pas l’échec de l’case activée de partage si l’ancien verrou libère le verrou. Le système de fichiers conserve en suspens l’opération ouverte 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.