[ 
https://issues.apache.org/jira/browse/TS-2471?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13865673#comment-13865673
 ] 

ASF subversion and git services commented on TS-2471:
-----------------------------------------------------

Commit 7fd40eba2157a3d709a9f254cad156ab44fbb465 in branch refs/heads/master 
from [~happy_fish100]
[ https://git-wip-us.apache.org/repos/asf?p=trafficserver.git;h=7fd40eb ]

TS-2471: records.config becomes empty when the disk full

In lib/records/RecLocal.cc and lib/records/RecProcess.cc, records.config
may become empty when the disk is full because we write records.config
directly. We should write to a temporary file, then rename it to
records.config.


> records.config becomes empty when the disk full
> -----------------------------------------------
>
>                 Key: TS-2471
>                 URL: https://issues.apache.org/jira/browse/TS-2471
>             Project: Traffic Server
>          Issue Type: Bug
>          Components: Management
>            Reporter: Yu Qing
>            Assignee: James Peach
>             Fix For: 4.2.0
>
>         Attachments: 0001-TS-2471-records.config-becomes-empty-V2.patch, 
> 0001-TS-2471-records.config-becomes-empty-when-the-disk-f.patch
>
>
> 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:
> {code}
>         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);
> {code}
> in {{mgmt/Rollback.cc}}: we check the result of write, but do NOT check the 
> return code of fsync and close.
> the codes as:
> {code}
>  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   }
> {code}
> we should check the result of {{closeFile(diskFD)}}



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to