/* * Closes a given workfile and updates the diskspace accordingly * * work_set can be NULL for workfile that were created outside of the workfile manager, * e.g. for ShareInputScan workfiles or window functions * * Returns the actual size of the file on disk in bytes upon closing */ int64 workfile_mgr_close_file(workfile_set *work_set, ExecWorkFile *file, bool canReportError) { Assert(NULL != file); bool delOnClose = file->flags & EXEC_WORKFILE_DEL_ON_CLOSE; bool created = file->flags & EXEC_WORKFILE_CREATED; elog(gp_workfile_caching_loglevel, "closing file %s, delOnClose=%d", ExecWorkFile_GetFileName(file), delOnClose); int64 size = 0; PG_TRY(); { size = ExecWorkFile_Close(file, canReportError); } PG_CATCH(); { elog(gp_workfile_caching_loglevel, "Caught exception, file=%s, returned size=" INT64_FORMAT " actual size before adjustment=" INT64_FORMAT, file->fileName, size, ExecWorkFile_GetSize(file)); update_workset_size(work_set, delOnClose, created, ExecWorkFile_GetSize(file)); PG_RE_THROW(); } PG_END_TRY(); update_workset_size(work_set, delOnClose, created, size); return size; }
/* * ExecWorkFile_Close * close the work file, and release the space. * * Returns the actual size of the file on disk upon closing */ int64 ExecWorkFile_Close(ExecWorkFile *workfile) { Assert(workfile != NULL); bfz_t *bfz_file = NULL; switch(workfile->fileType) { case BUFFILE: BufFileClose((BufFile *)workfile->file); break; case BFZ: bfz_file = (bfz_t *)workfile->file; Assert(bfz_file != NULL); if (bfz_file->mode == BFZ_MODE_APPEND) { /* Flush data out to disk if we were writing */ int64 file_size = bfz_append_end(bfz_file); /* Adjust the size with WorkfileDiskspace to our actual size */ ExecWorkFile_AdjustBFZSize(workfile, file_size); } bfz_close(bfz_file, true, true); break; default: insist_log(false, "invalid work file type: %d", workfile->fileType); } int64 size = ExecWorkFile_GetSize(workfile); pfree(workfile->fileName); pfree(workfile); return size; }