Description
we change the config parameters in cluster then the config file records.config becomes empty in race case when the system disk is full.
in lib/records/RecLocal.cc and lib/records/RecProcess.cc:
records.config maybe empty when the disk is full because we write records.config directly. we should write to a temp file, then rename it to records.config.
one of the codes as:
int nbytes; RecDebug(DL_Note, "Writing '%s'", g_rec_config_fpath); RecHandle h_file = RecFileOpenW(g_rec_config_fpath); RecFileWrite(h_file, tb->bufPtr(), tb->spaceUsed(), &nbytes); RecFileClose(h_file);
in mgmt/Rollback.cc: we check the result of write, but do NOT check the return code of fsync and close.
the codes as:
466 // Write the buffer into the new configuration file 467 writeBytes = write(diskFD, buf->bufPtr(), buf->spaceUsed()); 468 closeFile(diskFD); 469 if (writeBytes != buf->spaceUsed()) { 470 mgmt_log(stderr, "[Rollback::intrernalUpdate] Unable to write new version of %s : %s\n", fileName, strerror(errno)); 471 returnCode = SYS_CALL_ERROR_ROLLBACK; 472 goto UPDATE_CLEANUP; 473 }
we should check the result of closeFile(diskFD)