windows-nt/Source/XPSP1/NT/com/svcdlls/trksvcs/trksvr/seqstg.cxx
2020-09-26 16:20:57 +08:00

150 lines
3.6 KiB
C++

// 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();
}
}