00001
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <SUM.h>
00017 #include <sys/time.h>
00018 #include <rpc/rpc.h>
00019 #include <soi_key.h>
00020 #include <soi_error.h>
00021 #include <sum_rpc.h>
00022 #include <sys/statvfs.h>
00023
00024 extern PADATA *pahdr_uid_start[];
00025 extern PADATA *pahdr_uid_end[];
00026 extern PADATA *pahdr_rw;
00027 extern PADATA *pahdr_ro;
00028 extern PADATA *pahdr_dp;
00029 extern PADATA *pahdr_ap;
00030 extern PART ptab[];
00031 extern CLIENT *current_client;
00032 extern uint32_t rinfo, procnum;
00033 extern int debugflg;
00034 extern int write_log();
00035 static struct timeval TIMEOUT = { 20, 0 };
00036 void logkey();
00037
00038
00039 KEY *sumrmdo_1(KEY *params)
00040 {
00041 static KEY *retlist;
00042 CLIENT *clresp;
00043 PART *pptr;
00044 PADATA *pdptr;
00045 PADATA *prptr;
00046 struct statvfs vfs;
00047 enum clnt_stat clnt_stat;
00048 double df_avail, bytesdeleted;
00049 double max_free_set[MAXSUMSETS];
00050 double max_free_part[MAXSUMSETS];
00051 double allbytes[MAXSUMSETS];
00052 double bytesreq[MAXSUMSETS];
00053 double bytespart[MAXSUMSETS];
00054 double bytestmp[MAXSUMSETS];
00055 char *cptr, *call_err, *dbname, *effstr;
00056 char line[80];
00057 char partn_name[MAX_STR], ext[MAX_STR], ext2[MAX_STR];
00058 char rootdir[MAX_STR], rootcmp[MAX_STR];
00059 int max_found[MAXSUMSETS], maxpart_found[MAXSUMSETS];
00060 int dpcnt[MAXSUMSETS], need[MAXSUMSETS];
00061 int status, num_sets, i, j, sn, set;
00062 int num_wd = 0;
00063 uint64_t eff_date, today_date;
00064
00065 write_time();
00066 debugflg = getkey_int(params, "DEBUGFLG");
00067 if(debugflg) {
00068 write_log("!!Keylist in sumrmdo_1() is:\n");
00069 keyiterate(logkey, params);
00070 }
00071 if(!(clresp = set_client_handle(SUMRMPROG, SUMRMVERS))) {
00072 rinfo = 1;
00073 send_ack();
00074 return((KEY *)1);
00075 }
00076 dbname = GETKEY_str(params, "dbname");
00077 retlist=newkeylist();
00078 add_keys(params, &retlist);
00079 rinfo = 0;
00080 send_ack();
00081
00082 for(i=0; i<MAX_PART-1; i++) {
00083 pptr=(PART *)&ptab[i];
00084 if(pptr->name == NULL) break;
00085 if(status = statvfs(pptr->name, &vfs)) {
00086 write_log("Error %d on statvfs() for %s\n",status,pptr->name);
00087 }
00088 else {
00089 df_avail = (double)vfs.f_bavail;
00090 df_avail = df_avail * (double)vfs.f_bsize;
00091 if(SUMLIB_PavailUpdate(pptr->name,df_avail))
00092 write_log("Err: SUMLIB_PavailUpdate(%s, %e, ...)\n",
00093 pptr->name,df_avail);
00094 else
00095 write_log("%s Update free bytes to %e\n", pptr->name, df_avail);
00096 }
00097 }
00098 num_sets = getkey_int(params, "num_sets_in_cfg");
00099 for(i=0; i < num_sets; i++) {
00100 sprintf(line, "max_free_%d", i);
00101 max_free_set[i] = getkey_double(params, line);
00102 sprintf(line, "max_part_free_%d", i);
00103 max_free_part[i] = getkey_double(params, line);
00104 allbytes[i] = 0.0;
00105 bytespart[i] = 0.0;
00106 max_found[i] = 0;
00107 maxpart_found[i] = 0;
00108 }
00109 for(i=0; i<MAX_PART-1; i++) {
00110 pptr=(PART *)&ptab[i];
00111 if(pptr->name == NULL) break;
00112 sn = pptr->pds_set_num;
00113 allbytes[sn] += pptr->bytes_left;
00114 if(pptr->bytes_left >= max_free_part[sn])
00115 maxpart_found[sn] = 1;
00116 else {
00117 if(max_free_part[sn] > pptr->bytes_left) {
00118 bytestmp[sn] = max_free_part[sn] - pptr->bytes_left;
00119
00120 if(bytestmp[sn] > bytespart[sn]) bytespart[sn] = bytestmp[sn];
00121 }
00122 }
00123 }
00124 for(i=0; i < num_sets; i++) {
00125 if(allbytes[i] >= max_free_set[i]) max_found[i] = 1;
00126 }
00127 for(i=0; i < num_sets; i++) {
00128 if(maxpart_found[i] && max_found[i]) continue;
00129 break;
00130 }
00131 if(i == num_sets) {
00132 write_log("sumrmdo_1() reports storage available\n");
00133 clnt_destroy(clresp);
00134 return((KEY *)1);
00135 }
00136 for(i=0; i < num_sets; i++) {
00137
00138 if(max_free_set[i] > allbytes[i])
00139 bytesreq[i] = max_free_set[i] - allbytes[i];
00140 else
00141 bytesreq[i] = bytespart[i];
00142 write_log("Attempt to del on SUM set %d %g bytes...\n", i, bytesreq[i]);
00143 }
00144
00145
00146 for(i=0; i < num_sets; i++) {
00147 dpcnt[i] = 0;
00148 need[i] = 0;
00149 if(pahdr_uid_start[i] == NULL) need[i] = 1;
00150 }
00151 effstr = get_effdate(0);
00152 today_date = (uint64_t)atol(effstr);
00153 free(effstr);
00154 for(i=0; i < num_sets; i++) {
00155 if(need[i]) break;
00156 }
00157 if(i != num_sets) {
00158 for(pdptr=(PADATA *)getpanext(pahdr_dp); pdptr != NULL;
00159 pdptr=(PADATA *)getpanext((PADATA *)-1))
00160 {
00161 if(prptr=(PADATA *)getpawd(pahdr_ro, pdptr->wd))
00162 continue;
00163
00164 if(pdptr->effective_date)
00165 eff_date = (uint64_t)atol(pdptr->effective_date);
00166 else
00167 eff_date = 0;
00168 if(eff_date != 0 && eff_date > today_date)
00169 continue;
00170
00171
00172 set = 0;
00173
00174 if(need[set]) {
00175 dpcnt[set]++;
00176 uidpadata(pdptr, &pahdr_uid_start[set], &pahdr_uid_end[set]);
00177 }
00178 }
00179 for(i=0; i < num_sets; i++) {
00180 if(need[i])
00181 write_log("Total current eligible dp entries SUM set %d = %d\n",
00182 i, dpcnt[i]);
00183 }
00184 }
00185 for(i=0; i < num_sets; i++) {
00186 if(need[i] && !dpcnt[i])
00187 write_log("No SUM set %d del pend storage available\n", i);
00188 }
00189 for(i=0; i < num_sets; i++) {
00190 if(pahdr_uid_start[i] != NULL) break;
00191 }
00192 if(i == num_sets) {
00193 sprintf(line, "/bin/rm -f %s.%s", SUM_STOP_NOT, dbname);
00194 if(system(line)) {
00195 write_log("Error on system cmd: %s\n", line);
00196 }
00197 clnt_destroy(clresp);
00198 return((KEY *)1);
00199 }
00200
00201
00202
00203 for(i=0; i < num_sets; i++) {
00204 bytesdeleted = 0.0;
00205 for(pdptr=(PADATA *)getpanext(pahdr_uid_start[i]); pdptr != NULL;
00206 pdptr=(PADATA *)getpanext((PADATA *)-1))
00207 {
00208 if(bytesdeleted >= bytesreq[i])
00209 break;
00210 if(prptr=(PADATA *)getpawd(pahdr_ro, pdptr->wd)) {
00211
00212 remuidpadata(&pahdr_uid_start[i], &pahdr_uid_end[i],
00213 pdptr->wd, pdptr->sumid);
00214 continue;
00215 }
00216
00217
00218 prptr=(PADATA *)getpadata(pahdr_dp, pdptr->wd, pdptr->sumid);
00219 if(prptr->effective_date)
00220 eff_date = (uint64_t)atol(prptr->effective_date);
00221 else
00222 eff_date = 0;
00223 if(eff_date != 0 && eff_date > today_date) {
00224
00225 remuidpadata(&pahdr_uid_start[i], &pahdr_uid_end[i],
00226 pdptr->wd, pdptr->sumid);
00227 continue;
00228 }
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239 strcpy(rootdir, pdptr->wd);
00240 strcpy(rootcmp, pdptr->wd);
00241 write_log("Del from db: %s\n", rootdir);
00242
00243 if(!(cptr = strstr(rootcmp+1, "/D"))) {
00244 write_log("The wd=%s doesn't have a /.../Dxxx term!\n",rootcmp);
00245 remuidpadata(&pahdr_uid_start[i], &pahdr_uid_end[i],
00246 pdptr->wd, pdptr->sumid);
00247 continue;
00248 }
00249 *cptr = (char)NULL;
00250
00251
00252 for(j=0; j<MAX_PART-1; j++) {
00253 pptr=(PART *)&ptab[j];
00254 if(pptr->name == NULL) {
00255 write_log("Error attempting to take off-line wd=%s\n", rootdir);
00256 write_log(" Cannot find corresponding entry in partn_avail tbl\n");
00257 write_log(" You've either removed the entry from the partn_avail table (forbidden)\n");
00258 write_log(" or this is a bum entry in the del pend table\n");
00259 write_log("Removing entry from my partial dp list for now\n");
00260 remuidpadata(&pahdr_uid_start[i], &pahdr_uid_end[i],
00261 pdptr->wd, pdptr->sumid)
00262 ;
00263 break;
00264 }
00265 if(!strcmp(rootcmp, pptr->name)) {
00266 cptr = rootdir+strlen(pptr->name)+1;
00267 if(cptr = index(cptr, '/'))
00268 *cptr = (char)NULL;
00269 break;
00270 }
00271 }
00272 if(pptr->name == NULL) continue;
00273 strcpy(partn_name, pptr->name);
00274
00275
00276
00277 if(prptr->archsub != DADMVC) {
00278 if(SUM_StatOffline(pdptr->ds_index)) {
00279 write_log("Err: SUM_StatOffline(%l, ...)\n", pdptr->ds_index);
00280 }
00281 }
00282
00283 if(NC_PaUpdate
00284 (pdptr->wd, pdptr->sumid,pdptr->bytes,DADP,0,0,0,0,0,0,1))
00285 {
00286 write_log("Err: NC_PaUpdate(%s,%l,%e,DADP,0,0,0, ...)to rm from dp list\n", pdptr->wd,pdptr->sumid,pdptr->bytes);
00287 write_log(" ??This is how we got the info in the first place!\n");
00288 }
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300 if(pdptr->archsub == DAAEDDP) {
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 sprintf(ext, "tmp_wd_%d", num_wd);
00311 sprintf(ext2, "tmp_ds_index_%d", num_wd);
00312 setkey_uint64(&retlist, ext2, pdptr->ds_index);
00313 }
00314 else {
00315 sprintf(ext, "wd_%d", num_wd);
00316 }
00317 setkey_str(&retlist, ext, pdptr->wd);
00318 sprintf(ext, "rootdir_%d", num_wd);
00319 setkey_str(&retlist, ext, rootdir);
00320 setkey_int(&retlist, "num_wd", ++num_wd);
00321 pptr->bytes_left += pdptr->bytes;
00322 bytesdeleted += pdptr->bytes;
00323 rempadata(&pahdr_dp, pdptr->wd, pdptr->sumid);
00324
00325 remuidpadata(&pahdr_uid_start[i], &pahdr_uid_end[i],
00326 pdptr->wd, pdptr->sumid);
00327 }
00328 }
00329 clnt_stat = clnt_call(clresp, RMRESPDO, (xdrproc_t)xdr_Rkey, (char *)retlist,
00330 (xdrproc_t)xdr_void, 0, TIMEOUT);
00331 if(clnt_stat != 0) {
00332 clnt_perrno(clnt_stat);
00333 write_log("***Error on clnt_call() back to RMRESPDO procedure\n");
00334 call_err = clnt_sperror(current_client, "Err");
00335 write_log("%s\n", call_err);
00336 }
00337 clnt_destroy(clresp);
00338 freekeylist(&retlist);
00339 return((KEY *)1);
00340 }
00341