|
|
#ifndef _LMP_H
#define _LMP_H
/*++
Copyright (c) 1992-1997 Microsoft Corporation
Module Name:
lmp.h
Abstract:
Private header file for quorum logging
Author:
John Vert (jvert) 15-Dec-1995
Revision History:
--*/ #include "windows.h"
#include "service.h"
#include "imagehlp.h"
#define LOG_CURRENT_MODULE LOG_MODULE_LM
//
// Definitions for the behavior of the logger
//
#define MAXNUMPAGES_PER_RECORD 16
#define GROWTH_CHUNK (MAXNUMPAGES_PER_RECORD * 2 * 1024) // size to grow file by when we need to reserve space
#define SECTOR_SIZE 1024
#define LOG_MANAGE_INTERVAL (2 * 60 * 1000) //1 minute..log management functions are performed
//
// Definitions of on-disk structures. The first sector of a log
// file is a LOG_HEADER structure, followed by a sequence of LOGPAGE structures.
// Each LOGPAGE is a size that is a multiple of the sector
// size of the drive. Each LOGPAGE contains a series of LOG_RECORDs, which
// contain the data logged by the client.
//
//
// Define log structure
//
#define LOG_HEADER_SIG 'GOLC' // "CLOG"
#define LOG_SIG 'GOLH' // "HLOG"
#define LOGREC_SIG 'SAQS' // "random"
#define XSACTION_SIG 'CASX' // "XSAC"
#define CHKSUM_SIG L"SKHC" // "CHKS"
//SS:size of logrecord is 48 bytes
typedef struct _LOGRECORD { DWORD Signature; //we need the signature to validate the record
LSN CurrentLsn; LSN PreviousLsn; DWORD RecordSize; RMID ResourceManager; TRID Transaction; TRTYPE XsactionType; DWORD Flags; FILETIME Timestamp; DWORD NumPages; // set to 1 if not a large record, else set to the number of pages required by the large record.
DWORD DataSize; //date size
BYTE Data[]; } LOGRECORD, *PLOGRECORD;
typedef struct _LOGPAGE { DWORD Offset; DWORD Size; LOGRECORD FirstRecord; } LOGPAGE, *PLOGPAGE;
//
// LOG_HEADER structure is the first 512 bytes of every log
// file. The structure below is carefully computed to be 512
// bytes long.
//
typedef struct _LOG_HEADER { DWORD Signature; // LOG_HEADER_SIG = "CLOG"
DWORD HeaderSize; FILETIME CreateTime; LSN LastChkPtLsn; //points to the lsn of the endchkpt record of the last lsn
WCHAR FileName[256-(sizeof(DWORD)*2+sizeof(LSN)+sizeof(FILETIME))]; } LOG_HEADER, *PLOG_HEADER;
typedef struct _LOG_CHKPTINFO{ WCHAR szFileName[LOG_MAX_FILENAME_LENGTH]; LSN ChkPtBeginLsn; //points to the lsn of the begin chkptrecord for this chkpt.
DWORD dwCheckSum; //checksum for the checkpoint file
}LOG_CHKPTINFO,*PLOG_CHKPTINFO;
//
// Define in-memory structure used to contain current log data
// The HLOG returned to callers by LogCreate is actually a pointer
// to this structure.
//
typedef struct _LOG { DWORD LogSig; // "HLOG"
LPWSTR FileName; HANDLE FileHandle; DWORD SectorSize; PLOGPAGE ActivePage; LSN NextLsn; LSN FlushedLsn; DWORD FileSize; // physical size of file
DWORD FileAlloc; // total filespace used (always <= FileSize)
DWORD MaxFileSize; PLOG_GETCHECKPOINT_CALLBACK pfnGetChkPtCb; PVOID pGetChkPtContext; //this is passed back to the checkpoint callback function.
OVERLAPPED Overlapped; // use for overlapped I/O
CRITICAL_SECTION Lock; HANDLE hTimer; //timer for managing this lock
} LOG, *PLOG;
typedef struct _XSACTION{ DWORD XsactionSig; //signature for this structure
LSN StartLsn; //the LSN for the start xsaction record
TRID TrId; //the transaction id for the LSN
RMID RmId; //the id of the resource Manager
} XSACTION, *PXSACTION; //
// Define macros for creating and translating LSNs
//
//
// LSN
// MAKELSN(
// IN PLOGPAGE Page,
// IN PLOGRECORD Pointer
// );
//
// Given a pointer to a page, and a pointer to a log record within that page, generates
// the LSN.
//
#define MAKELSN(Page,Pointer) (LSN)((Page)->Offset + ((ULONG_PTR)Pointer - (ULONG_PTR)Page))
//
// DWORD
// LSNTOPAGE(
// IN LSN Lsn
// );
//
// Given an LSN returns the page that contains it.
//
#define LSNTOPAGE(Lsn) ((Lsn) >> 10)
//
// GETLOG(
// PLOG pLog,
// HLOG hLog
// );
//
// Translates an HLOG handle to a pointer to a LOG structure
//
#define GETLOG(plog, hlog) (plog) = (PLOG)(hlog); \
CL_ASSERT((plog)->LogSig == LOG_SIG)
// Given a pointer to a record, it fetches the LSN of the next or
// previous record
//
#define GETNEXTLSN(pLogRecord,ScanForward) ((ScanForward) ? \
(pLogRecord->CurrentLsn + pLogRecord->RecordSize) : \ (pLogRecord->PreviousLsn))
//
// GETXSACTION(
// PXSACTION pXsaction,
// HXSACTION hXsaction
// );
//
// Translates an HLOG handle to a pointer to a LOG structure
//
#define GETXSACTION(pXsaction, hXsaction) (pXsaction) = (PXSACTION)(hXsaction); \
CL_ASSERT((pXsaction)->XsactionSig == XSACTION_SIG)
// given the header of the log file, check its validity.
//
#define ISVALIDHEADER(Header) ((Header).Signature == LOG_HEADER_SIG)
//
// Private helper macros
//
#define CrAlloc(size) LocalAlloc(LMEM_FIXED, (size))
#define CrFree(size) LocalFree((size))
#define AlignAlloc(size) VirtualAlloc(NULL, (size), MEM_COMMIT, PAGE_READWRITE)
#define AlignFree(ptr) VirtualFree((ptr), 0, MEM_RELEASE)
//Timeractivity related stuff
#define MAX_TIMER_ACTIVITIES 5
#define TIMER_ACTIVITY_SHUTDOWN 1
#define TIMER_ACTIVITY_CHANGE 2
//state values for timer activity structure management
#define ACTIVITY_STATE_READY 1 //AddTimerActivity sets it to ready
#define ACTIVITY_STATE_DELETE 2 //RemoveTimerActivity sets it to delete
#define ACTIVITY_STATE_PAUSED 3 //PauseTimerActivity sets it to pause
typedef struct _TIMER_ACTIVITY { LIST_ENTRY ListEntry; DWORD dwState; HANDLE hWaitableTimer; LARGE_INTEGER Interval; PVOID pContext; PFN_TIMER_CALLBACK pfnTimerCb; }TIMER_ACTIVITY, *PTIMER_ACTIVITY;
//
// Extern variables
//
extern BOOL bLogExceedsMaxSzWarning;
//inline functions
_inline DWORD LSNOFFSETINPAGE( IN PLOGPAGE Page, IN LSN Lsn );
//_inline
DWORD RECORDOFFSETINPAGE( IN PLOGPAGE Page, IN PLOGRECORD LogRecord );
//_inline
PLOGRECORD LSNTORECORD( IN PLOGPAGE Page, IN LSN Lsn );
//
// Define function prototypes local to this module
//
PLOG LogpCreate( IN LPWSTR lpFileName, IN DWORD dwMaxFileSize, IN PLOG_GETCHECKPOINT_CALLBACK CallbackRoutine, IN PVOID pGetChkPtContext, IN BOOL bForceReset, OPTIONAL OUT LSN *LastLsn );
DWORD LogpMountLog( IN PLOG Log );
DWORD LogpInitLog( IN PLOG Log );
DWORD LogpGrowLog( IN PLOG Log, IN DWORD GrowthSize );
PLOGPAGE LogpAppendPage( IN PLOG Log, IN DWORD Size, OUT PLOGRECORD *Record, OUT BOOL *pbMaxFileSizeReached, OUT DWORD *pdwNumPages );
DWORD LogpRead(IN PLOG pLog, OUT PVOID pBuf, IN DWORD dwBytesToRead, OUT PDWORD pdwBytesRead );
DWORD LogpWrite( IN PLOG pLog, IN PVOID pData, IN DWORD dwBytesToWrite, IN DWORD *pdwBytesWritten);
void WINAPI LogpManage( IN HANDLE hTimer, IN PVOID pContext);
DWORD LogpWriteLargeRecordData( IN PLOG pLog, IN PLOGRECORD pLogRecord, IN PVOID pLogData, IN DWORD dwDataSize);
DWORD LogpCheckFileHeader( IN PLOG pLog, OUT LPDWORD pdwHeaderSize, OUT FILETIME *HeaderCreateTime, OUT LSN *pChkPtLsn );
DWORD LogpValidateChkPoint( IN PLOG pLog, IN LSN ChkPtLsn, IN LSN LastChkPtLsn );
DWORD LogpValidateLargeRecord( IN PLOG pLog, IN PLOGRECORD pRecord, OUT LSN *pNextLsn ) ;
DWORD LogpInvalidatePrevRecord( IN PLOG pLog, IN PLOGRECORD pRecord );
DWORD LogpEnsureSize( IN PLOG pLog, IN DWORD dwTotalSize, IN BOOL bForce );
DWORD LogpReset( IN PLOG Log, IN LPCWSTR lpszInChkPtFile );
VOID LogpWriteWarningToEvtLog( IN DWORD dwWarningType, IN LPCWSTR lpszLogFileName );
//timer activity functions
DWORD TimerActInitialize(VOID);
DWORD TimerActShutdown(VOID);
#endif //_LMP_H
|