00001
00002
00003
00004
00005
00006
00007
00008 #include "fileFsync.h"
00009 #include "miscServerFunct.h"
00010 #include "rsGlobalExtern.h"
00011
00012
00013
00014 #include "eirods_log.h"
00015 #include "eirods_file_object.h"
00016 #include "eirods_stacktrace.h"
00017
00018 int
00019 rsFileFsync (rsComm_t *rsComm, fileFsyncInp_t *fileFsyncInp)
00020 {
00021 rodsServerHost_t *rodsServerHost;
00022 int remoteFlag;
00023 int retVal;
00024
00025 remoteFlag = getServerHostByFileInx (fileFsyncInp->fileInx,
00026 &rodsServerHost);
00027
00028 if (remoteFlag == LOCAL_HOST) {
00029 retVal = _rsFileFsync (rsComm, fileFsyncInp);
00030 } else if (remoteFlag == REMOTE_HOST) {
00031 retVal = remoteFileFsync (rsComm, fileFsyncInp, rodsServerHost);
00032 } else {
00033 if (remoteFlag < 0) {
00034 return (remoteFlag);
00035 } else {
00036 rodsLog (LOG_NOTICE,
00037 "rsFileFsync: resolveHost returned unrecognized value %d",
00038 remoteFlag);
00039 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00040 }
00041 }
00042
00043
00044
00045 return (retVal);
00046 }
00047
00048 int
00049 remoteFileFsync (rsComm_t *rsComm, fileFsyncInp_t *fileFsyncInp,
00050 rodsServerHost_t *rodsServerHost)
00051 {
00052 int status;
00053
00054 if (rodsServerHost == NULL) {
00055 rodsLog (LOG_NOTICE,
00056 "remoteFileFsync: Invalid rodsServerHost");
00057 return SYS_INVALID_SERVER_HOST;
00058 }
00059
00060 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00061 return status;
00062 }
00063
00064 fileFsyncInp->fileInx = convL3descInx (fileFsyncInp->fileInx);
00065 status = rcFileFsync (rodsServerHost->conn, fileFsyncInp);
00066
00067 if (status < 0) {
00068 rodsLog (LOG_NOTICE,
00069 "remoteFileFsync: rcFileFsync failed for %d, status = %d",
00070 fileFsyncInp->fileInx, status);
00071 }
00072
00073 return status;
00074 }
00075
00076
00077
00078 int _rsFileFsync( rsComm_t *rsComm, fileFsyncInp_t *fileFsyncInp ) {
00079
00080 if(FileDesc[fileFsyncInp->fileInx].objPath == NULL ||
00081 FileDesc[fileFsyncInp->fileInx].objPath[0] == '\0') {
00082 std::stringstream msg;
00083 msg << __FUNCTION__;
00084 msg << " - Empty logical path.";
00085 eirods::log(LOG_ERROR, msg.str());
00086 return -1;
00087 }
00088
00089
00090
00091 eirods::file_object file_obj( rsComm,
00092 FileDesc[fileFsyncInp->fileInx].objPath,
00093 FileDesc[fileFsyncInp->fileInx].fileName,
00094 FileDesc[fileFsyncInp->fileInx].rescHier,
00095 FileDesc[fileFsyncInp->fileInx].fd,
00096 0, 0 );
00097 eirods::error fsync_err = fileFsync( rsComm, file_obj );
00098
00099
00100
00101 if( !fsync_err.ok() ) {
00102 std::stringstream msg;
00103 msg << "_rsFileFsync: fsync for ";
00104 msg << FileDesc[fileFsyncInp->fileInx].fileName;
00105 msg << ", status = ";
00106 msg << fsync_err.code();
00107 eirods::error ret_err = PASS( false, fsync_err.code(), msg.str(), fsync_err );
00108 eirods::log( ret_err );
00109 }
00110
00111 return (fsync_err.code());
00112
00113 }