windows-nt/Source/XPSP1/NT/base/cluster/service/lm/lmp.h

365 lines
8.7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
#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