365 lines
8.7 KiB
C
365 lines
8.7 KiB
C
|
#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
|