/* * Writes state of a LogicalTapeSet to a state file */ static void DumpLogicalTapeSetState(ExecWorkFile *statefile, LogicalTapeSet *lts, LogicalTape *lt) { Assert(lts && lt && lt->frozen); bool res = ExecWorkFile_Write(statefile, &(lts->nFileBlocks), sizeof(lts->nFileBlocks)); Assert(res); res = ExecWorkFile_Write(statefile, &(lt->firstBlkNum), sizeof(lt->firstBlkNum)); Assert(res); }
/* * Write a block-sized buffer to the specified block of the underlying file. * * NB: should not attempt to write beyond current end of file (ie, create * "holes" in file), since BufFile doesn't allow that. The first write pass * must write blocks sequentially. * * No need for an error return convention; we ereport() on any error. */ static void ltsWriteBlock(LogicalTapeSet *lts, int64 blocknum, void *buffer) { Assert(lts != NULL); if (ExecWorkFile_Seek(lts->pfile, blocknum * BLCKSZ, SEEK_SET) != 0 || !ExecWorkFile_Write(lts->pfile, buffer, BLCKSZ)) { ereport(ERROR, /* XXX is it okay to assume errno is correct? */ (errcode_for_file_access(), errmsg("could not write block " INT64_FORMAT " of temporary file: %m", blocknum), errhint("Perhaps out of disk space?"))); } }
/* * Save the serialized plan to a file in the workfile set. * It will be used to do full plan matching before reusing. */ static void workfile_mgr_save_plan(workfile_set *work_set, workfile_set_plan *sf_plan) { Assert(work_set); Assert(sf_plan); ExecWorkFile *plan_file = workfile_mgr_create_fileno(work_set, WORKFILE_NUM_ALL_PLAN); insist_log(plan_file != NULL, "Could not create temporary work file: %m"); elog(gp_workfile_caching_loglevel, "Saving query plan to file %s", ExecWorkFile_GetFileName(plan_file)); bool res = ExecWorkFile_Write(plan_file, sf_plan->serialized_plan, sf_plan->serialized_plan_len); if(!res) { workfile_mgr_report_error(); } workfile_mgr_close_file(work_set, plan_file); }