00001 #include "physPath.h"
00002 #include "dataObjFsync.h"
00003 #include "rsGlobalExtern.h"
00004 #include "rcGlobalExtern.h"
00005 #include "reGlobalsExtern.h"
00006 #include "fileFsync.h"
00007 #include "fileFstat.h"
00008 #include "modDataObjMeta.h"
00009
00010
00011
00012 #include "eirods_resource_backport.h"
00013
00014
00015 int
00016 rsDataObjFsync (rsComm_t *rsComm, openedDataObjInp_t *dataObjFsyncInp)
00017 {
00018 int rv = 0;
00019 int l1descInx = dataObjFsyncInp->l1descInx;
00020
00021 if ((l1descInx < 2) || (l1descInx >= NUM_L1_DESC))
00022 {
00023 rodsLog (LOG_NOTICE,
00024 "rsDataObjFsync: l1descInx %d out of range",
00025 l1descInx);
00026 return (SYS_FILE_DESC_OUT_OF_RANGE);
00027 }
00028 if (L1desc[l1descInx].inuseFlag != FD_INUSE)
00029 return BAD_INPUT_DESC_INDEX;
00030 if (L1desc[l1descInx].remoteZoneHost != NULL)
00031 {
00032
00033 dataObjFsyncInp->l1descInx = L1desc[l1descInx].remoteL1descInx;
00034 rv = rcDataObjFsync (L1desc[l1descInx].remoteZoneHost->conn,
00035 dataObjFsyncInp);
00036 dataObjFsyncInp->l1descInx = l1descInx;
00037 } else {
00038 rv = _rsDataObjFsync (rsComm, dataObjFsyncInp);
00039
00040 #if 0
00041 if (rv >= 0)
00042 {
00043 ruleExecInfo_t rei;
00044 initReiWithDataObjInp (&rei, rsComm,
00045 L1desc[l1descInx].dataObjInp);
00046 rei.doi = L1desc[l1descInx].dataObjInfo;
00047 rei.status = rv;
00048 rei.status = applyRule ("acPostProcForUpdate", NULL, &rei,
00049 NO_SAVE_REI);
00050
00051
00052 }
00053 #endif
00054 }
00055
00056 return (rv);
00057 }
00058
00059
00060 int
00061 _rsDataObjFsync (rsComm_t *rsComm, openedDataObjInp_t *dataObjFsyncInp)
00062 {
00063 int status = 0;
00064 int l1descInx, l3descInx;
00065 dataObjInfo_t *dataObjInfo;
00066 keyValPair_t regParam;
00067 modDataObjMeta_t modDataObjMetaInp;
00068 char tmpStr[MAX_NAME_LEN];
00069 rodsLong_t vsize;
00070
00071 l1descInx = dataObjFsyncInp->l1descInx;
00072 l3descInx = L1desc[l1descInx].l3descInx;
00073
00074
00075 if (l3descInx > 3)
00076 {
00077 status = l3Fsync (rsComm, l1descInx);
00078
00079 if (status < 0)
00080 {
00081 rodsLog (LOG_NOTICE,
00082 "_rsDataObjFsync: l3Fsync of %d failed, status = %d",
00083 l3descInx, status);
00084 return (status);
00085 }
00086 }
00087
00088 if (L1desc[l1descInx].oprStatus < 0)
00089 {
00090
00091 rodsLog (LOG_NOTICE, "_rsDataObjFsync oprStatus error");
00092 return L1desc[l1descInx].oprStatus;
00093 }
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 dataObjInfo = L1desc[l1descInx].dataObjInfo;
00105 vsize = getSizeInVault(rsComm, dataObjInfo);
00106 snprintf (tmpStr, MAX_NAME_LEN, "%lld", vsize);
00107 addKeyVal (®Param, DATA_SIZE_KW, tmpStr);
00108
00109 snprintf (tmpStr, MAX_NAME_LEN, "%d", (int) time (NULL));
00110 addKeyVal (®Param, DATA_MODIFY_KW, tmpStr);
00111
00112 addKeyVal (®Param, ALL_REPL_STATUS_KW, "");
00113
00114 modDataObjMetaInp.dataObjInfo = dataObjInfo;
00115 modDataObjMetaInp.regParam = ®Param;
00116 status = rsModDataObjMeta (rsComm, &modDataObjMetaInp);
00117
00118 return (status);
00119 }
00120
00121
00122 int
00123 l3Fsync (rsComm_t *rsComm, int l1descInx)
00124 {
00125 int rescTypeInx;
00126 fileFsyncInp_t fileFsyncInp;
00127 int rv = 0;
00128
00129
00130 rescTypeInx = L1desc[l1descInx].dataObjInfo->rescInfo->rescTypeInx;
00131
00132 #if 0 // JMC legacy resource
00133 switch (RescTypeDef[rescTypeInx].rescCat)
00134 {
00135 case FILE_CAT:
00136 #endif // JMC legacy resource
00137 memset (&fileFsyncInp, 0, sizeof (fileFsyncInp));
00138 fileFsyncInp.fileInx = L1desc[l1descInx].l3descInx;
00139 rv = rsFileFsync (rsComm, &fileFsyncInp);
00140 #if 0 // JMC legacy resource
00141 break;
00142 default:
00143 rodsLog (LOG_NOTICE,
00144 "l3Write: rescCat type %d is not recognized",
00145 RescTypeDef[rescTypeInx].rescCat);
00146 rv = SYS_INVALID_RESC_TYPE;
00147 break;
00148 }
00149 #endif // JMC legacy resource
00150
00151 return (rv);
00152 }