*** xlog.c Sun Apr 24 03:49:54 2005 --- xlog.dio.c Mon May 23 19:14:21 2005 *************** *** 74,79 **** --- 74,98 ---- #endif #endif + #ifdef O_DIRECT + #define OPEN_DIRECT_FLAG O_DIRECT + #endif + + /* TODO: Aligment depends on OS and filesystem. */ + #define O_DIRECT_BUFFER_ALIGN 4096 + + /* assume sizeof(ptrdiff_t) == sizeof(void*) */ + #define POINTERALIGN(ALIGNVAL,PTR) \ + (((ptrdiff_t) (PTR) + (ALIGNVAL-1)) & ~((ptrdiff_t) (ALIGNVAL-1))) + + #ifdef OPEN_DIRECT_FLAG + #define XLOG_EXTRA_BUFFERS O_DIRECT_BUFFER_ALIGN + #define XLOG_BUFFERS_ALIGN(PTR) (char *)POINTERALIGN(XLOG_EXTRA_BUFFERS, (PTR)) + #else + #define XLOG_EXTRA_BUFFERS 0 + #define XLOG_BUFFERS_ALIGN(PTR) (char *)POINTERALIGN(MAXIMUM_ALIGNOF, (PTR)) + #endif + #if defined(OPEN_DATASYNC_FLAG) #define DEFAULT_SYNC_METHOD_STR "open_datasync" #define DEFAULT_SYNC_METHOD SYNC_METHOD_OPEN *************** XLOGShmemSize(void) *** 3417,3423 **** XLOGbuffers = MinXLOGbuffers; return MAXALIGN(sizeof(XLogCtlData) + sizeof(XLogRecPtr) * XLOGbuffers) ! + BLCKSZ * XLOGbuffers + MAXALIGN(sizeof(ControlFileData)); } --- 3436,3442 ---- XLOGbuffers = MinXLOGbuffers; return MAXALIGN(sizeof(XLogCtlData) + sizeof(XLogRecPtr) * XLOGbuffers) ! + XLOG_EXTRA_BUFFERS + BLCKSZ * XLOGbuffers + MAXALIGN(sizeof(ControlFileData)); } *************** XLOGShmemInit(void) *** 3435,3441 **** ShmemInitStruct("XLOG Ctl", MAXALIGN(sizeof(XLogCtlData) + sizeof(XLogRecPtr) * XLOGbuffers) ! + BLCKSZ * XLOGbuffers, &foundXLog); ControlFile = (ControlFileData *) ShmemInitStruct("Control File", sizeof(ControlFileData), &foundCFile); --- 3454,3460 ---- ShmemInitStruct("XLOG Ctl", MAXALIGN(sizeof(XLogCtlData) + sizeof(XLogRecPtr) * XLOGbuffers) ! + XLOG_EXTRA_BUFFERS + BLCKSZ * XLOGbuffers, &foundXLog); ControlFile = (ControlFileData *) ShmemInitStruct("Control File", sizeof(ControlFileData), &foundCFile); *************** XLOGShmemInit(void) *** 3463,3470 **** * buffers have worst-case alignment. */ XLogCtl->pages = ! ((char *) XLogCtl) + MAXALIGN(sizeof(XLogCtlData) + ! sizeof(XLogRecPtr) * XLOGbuffers); memset(XLogCtl->pages, 0, BLCKSZ * XLOGbuffers); /* --- 3482,3489 ---- * buffers have worst-case alignment. */ XLogCtl->pages = ! XLOG_BUFFERS_ALIGN(((char *) XLogCtl) ! + sizeof(XLogCtlData) + sizeof(XLogRecPtr) * XLOGbuffers); memset(XLogCtl->pages, 0, BLCKSZ * XLOGbuffers); /* *************** BootStrapXLOG(void) *** 3494,3499 **** --- 3513,3519 ---- { CheckPoint checkPoint; char *buffer; + char buffer0[BLCKSZ + XLOG_EXTRA_BUFFERS + MAXIMUM_ALIGNOF]; XLogPageHeader page; XLogLongPageHeader longpage; XLogRecord *record; *************** BootStrapXLOG(void) *** 3522,3529 **** /* First timeline ID is always 1 */ ThisTimeLineID = 1; ! /* Use malloc() to ensure buffer is MAXALIGNED */ ! buffer = (char *) malloc(BLCKSZ); page = (XLogPageHeader) buffer; memset(buffer, 0, BLCKSZ); --- 3542,3548 ---- /* First timeline ID is always 1 */ ThisTimeLineID = 1; ! buffer = XLOG_BUFFERS_ALIGN(buffer0); page = (XLogPageHeader) buffer; memset(buffer, 0, BLCKSZ); *************** assign_xlog_sync_method(const char *meth *** 5225,5230 **** --- 5244,5256 ---- new_sync_bit = OPEN_DATASYNC_FLAG; } #endif + #ifdef OPEN_DIRECT_FLAG + else if (pg_strcasecmp(method, "open_direct") == 0) + { + new_sync_method = SYNC_METHOD_OPEN; + new_sync_bit = OPEN_DIRECT_FLAG; + } + #endif else return NULL;