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