Windows operativni sistemi imaju ugrađen mehanizam za ubrzanje rada mrežnih aplikacija. Sistem funkcioniše kao klasično keširanje: recimo kad radna stanica zatraži upis podataka na server, server potvrđuje da je upis uspeo pre stvarnog upisa. U realnom radu se time donekle poboljšavaju performanse, ali postoji opasnost od oštećenja deljenih fajlova na serveru. Ako se to desi, dobijaju se greške “Read Error”, “Corruption detected” i sl.

Opportunistic Locking i Read Caching

Glavni uzroci (mada ne i jedini) ovih grešaka su Opportunistic Locking i Read Caching.

Opportunistic Locking (oplocks) je protokol koji koristi Windows LAN Manager da bi ubrzao rad mrežnih aplikacija i prvenstveno je namenjen client-server aplikacijama, dok file-based aplikacije imaju problem sa aktivnim oplocks mehanizmom. Ovaj protokol kešira zahteve za lokovanjem od klijenata i ne zaključava file na serveru, nego u lokalnom kešu. Oplocks je aktivan kao nadgradnja osnovnog file-sharing protokola. Da bi funkcionisao, mora biti uključen i na serveru i radnim stanicama. U tom slučaju server i stanice imaju svoje lokalne keševe koji se sinhronizuju preko oplocksa. Na primer, dve radne stanice pročitaju neki podatak sa servera u svoj interni keš. Ako stanica 1 izmeni te podatke i upiše ih na server, podaci u kešu stanice 1 više nisu validni i ne odgovaraju stvarnim podacima na serveru. Ako je uključen oplocks, stanica 2 dobija informaciju da je keš neispravan. Problem je u tome što je ovaj sistem zamišljen za umeren mrežni saobraćaj, dok App u normalnom radu ima izuzetno visok mrežni saobraćaj. Takođe, slanje ovih sinhro poruka stvara dodatni mrežni saobraćaj i sprečava klijenta da izvrši započetu operaciju.

Deo oplocksa je i Read-ahead caching. Radi se o keširanju zahteva u lokalnom kešu, a kada se uputi više zahteva za izmenu jednog dela fajla na serveru, server “sumira” sve zahteve u jedan i fizički ga upisuje na server. Tako klijent aplikacija brže nastavlja rad jer dobija odgovor da su podaci upisani pre stvarnog upisa. Osnovni problem sa ovakvim mehaniznom jeste u slučaju da se desi neki prekid mreže, pa podaci ne mogu biti zaista upisani na server. Microsoft kaže:

‘Under extreme conditions, some multiuser database applications that use a common data store over a network connection on a file server may experience transactional integrity issues or corruption of the database files and/or indexes stored on the server. This typically applies to some so-called “ISAM style”, or “record oriented” multiuser database applications, not to a client/server relational system like SQL Server’ and ‘A hazard of local caching is that written data only has as much integrity as the client itself for as long as the data is cached on the client. In general, locally cached data should be flushed to the server as soon as possible.’

SMB2

Vista, Server 2008 i Windows 7 imaju mehanizam za deljenje fajlova SMB2. To je nova verzija SMB1 (Server Message Block) protokola koja i dalje postoji u novim verzijama OS. Microsoft nije dokumentovao isključenje SMB protokola, ali postoji način koji je objavio u forumu za podršku:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters SMB2 = 0

Kada se siključi SMB2, aktivira se SMB1 i oplocks se može isključiti.

Za normalan rad App aplikacije, neophodno je isključiti oplocks mehanizam. To se radi sledećim izmenama u registry bazi:

Windows server:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters]
"autodisconnect"              =  dword:ffffffff
"ConnectionNoSessionsTimeout" = dword:ffffffff
"SMB2"                        = dword:00000000
"CachedOpenLimit"= dword:00000000
"EnableOpLockForceClose" = dword:00000001
"EnableOpLocks"          = dword:00000000
"SharingViolationDelay"   = dword:00000000
"SharingViolationRetries" = dword:00000000

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MRXSmb\Parameters]
"OplocksDisabled" = dword:00000001 

Windows radna stanica:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters]
"UseOpportunisticLocking" = dword:00000000
"EnableOpLocks"           = dword:00000000
"EnableOpLockForceClose"  = dword:00000001
"UtilizeNtCaching" = dword:00000000
"UseUnlockBehind"  = dword:00000001
"UseLockReadUnlock" = dword:00000000

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MRXSmb\Parameters]
"OplocksDisabled" = dword:00000001

Ove izmene u registry bazi se moraju izvršiti na serveru i SVIM radnim stanicima koje direktno pristupaju file-serveru.

Više detalja:

http://www.superbase.com/services_tech_support_oplocks.htm

http://www.dataaccess.com/whitepapers/opportunlockingreadcaching.html

http://msdn.microsoft.com/en-us/library/aa365433.aspx

http://www.witzendcs.co.uk/nt_networking.html

http://www.datafastsoftware.com/netsafeinfo.htm