|
|
// Copyright (c) 1996-1999 Microsoft Corporation
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// File: seqstg.cxx
//
// Contents: Refresh sequence number storage
//
// Classes:
//
// Functions:
//
//
//
// History: 03-Oct-97 BillMo Created
//
// Notes:
//
// Codework:
//
//--------------------------------------------------------------------------
#include "pch.cxx"
#pragma hdrstop
#include "trksvr.hxx"
class CLdapRefreshSeqDn { public: // specific volume
CLdapRefreshSeqDn( const TCHAR * ptszBaseDn ) { // Compose, the following DN:
// "CN=RefreshSequence,CN=VolumeTable,CN=FileLinks,DC=TRKDOM"
_tcscpy(_szDn, TEXT("CN=RefreshSequence,CN=VolumeTable,")); _tcscat(_szDn, ptszBaseDn );
TrkAssert(_tcslen(_szDn) < ELEMENTS(_szDn)); }
inline operator TCHAR * () { return _szDn; }
private: TCHAR _szDn[MAX_PATH]; };
//+----------------------------------------------------------------------------
//
// CRefreshSequenceStorage::GetSequenceNumber
//
// Get the current value of the sequence number. If the cached value is
// old and we're not the designated DC, then re-read it from the DS. (Since
// the designated DC is the only one that writes this value, it needn't
// ever refresh its cache).
//
//+----------------------------------------------------------------------------
SequenceNumber CRefreshSequenceStorage::GetSequenceNumber() { CVolumeId volidZero; CMachineId mcidZero(MCID_INVALID); CVolumeSecret secretZero; CFILETIME cft; // Initializes to current time
_cs.Enter(); __try { // See if our cached value is young enough.
cft.DecrementSeconds( _psvrconfig->GetRefreshStorageTTL() ); if ( _pQuotaTab->IsDesignatedDc() && _cftLastRead != 0 || _cftLastRead >= cft ) { // Yes, we can just return _seq as is.
//TrkLog(( TRKDBG_GARBAGE_COLLECT | TRKDBG_SVR,
// TEXT("CRefreshSequenceStorage using cached value (%d)"), _seq ));
__leave; }
// We need to read the sequence number from the DS.
if ( _pVolTab->GetVolumeInfo( volidZero, &mcidZero, &secretZero, &_seq, &cft ) == TRK_S_VOLUME_NOT_FOUND ) { // volidZero doesn't exist, so we'll assume the sequence number is zero.
// If we're the designated DC, write this out.
if( _pQuotaTab->IsDesignatedDc() ) { TrkLog((TRKDBG_GARBAGE_COLLECT | TRKDBG_SVR, TEXT("CRefreshSequenceStorage::GetSequenceNumber - creating volume id 0")));
_pVolTab->AddVolidToTable( volidZero, mcidZero, secretZero ); } _seq = 0; } #if DBG
else { // We read it successfully.
TrkLog(( TRKDBG_GARBAGE_COLLECT | TRKDBG_SVR, TEXT("CRefreshSequenceStorage read %d"), _seq )); } #endif
_cftLastRead = CFILETIME();
} __finally { _cs.Leave(); }
return(_seq); }
void CRefreshSequenceStorage::IncrementSequenceNumber() { SequenceNumber seq; CVolumeId volidZero;
_cs.Enter(); __try { TrkAssert( _pQuotaTab->IsDesignatedDc() );
if( _cftLastRead == CFILETIME(0) ) GetSequenceNumber();
_pVolTab->SetSequenceNumber( volidZero, ++_seq ); _cftLastRead = CFILETIME(); } __finally { _cs.Leave(); } }
|