/* * Initialize shared memory area for the WorkfileDiskspace module */ void WorkfileDiskspace_Init(void) { WorkfileQueryspace_Init(); WorkfileSegspace_Init(); WorkfileDiskspace_SetFull(false /* isFull*/); }
/* * BufFileDumpBuffer * * Dump buffer contents starting at curOffset. * At call, should have dirty = true, nbytes > 0. * On exit, dirty is cleared if successful write, and curOffset is advanced. */ static void BufFileDumpBuffer(BufFile *file, const void* buffer, Size nbytes) { size_t wpos = 0; size_t bytestowrite; int wrote = 0; /* * Unlike BufFileLoadBuffer, we must dump the whole buffer. */ while (wpos < nbytes) { bytestowrite = nbytes - wpos; if (FileSeek(file->file, file->offset, SEEK_SET) != file->offset) { elog(ERROR, "could not seek in temporary file: %m"); } wrote = FileWrite(file->file, (char *)buffer + wpos, (int)bytestowrite); if (wrote != bytestowrite) { if (file->isWorkfile) { elog(gp_workfile_caching_loglevel, "FileWrite failed while writing to a workfile. Marking IO Error flag." " offset=" INT64_FORMAT " pos=" INT64_FORMAT " maxoffset=" INT64_FORMAT " wpos=%d", file->offset, file->pos, file->maxoffset, (int) wpos); Assert(!WorkfileDiskspace_IsFull()); WorkfileDiskspace_SetFull(true /* isFull */); } elog(ERROR, "could not write %d bytes to temporary file: %m", (int)bytestowrite); } file->offset += wrote; wpos += wrote; } file->dirty = false; /* * Now we can set the buffer empty without changing the logical position */ file->pos = 0; file->nbytes = 0; }