- recount subjob states if int_jobstat version changes
authorMiloš Mulač <mulac@civ.zcu.cz>
Tue, 30 Sep 2008 12:29:04 +0000 (12:29 +0000)
committerMiloš Mulač <mulac@civ.zcu.cz>
Tue, 30 Sep 2008 12:29:04 +0000 (12:29 +0000)
- return all subjobs despite of their int_jobstat version

org.glite.lb.server/src/jobstat.c

index c1bc6e1..bfc9796 100644 (file)
@@ -91,9 +91,9 @@ int edg_wll_JobStatusServer(
 #if DAG_ENABLE 
        char            *stmt = NULL;
 #endif
-       char *stat_str, *s_out;
+       char *s_out;
        intJobStat *js;
-       char *out[1];
+       char *out[1], *out_stat[3];
        glite_lbu_Statement sh = NULL;
        int num_sub, num_f, i, ii;
 
@@ -171,9 +171,7 @@ int edg_wll_JobStatusServer(
 
                        if (flags & EDG_WLL_STAT_CHILDSTAT) {
 
-                               trio_asprintf(&stmt, "SELECT int_status FROM states WHERE parent_job='%|Ss'"
-                                                       " AND version='%|Ss'",
-                                               md5_jobid, INTSTAT_VERSION);
+                               trio_asprintf(&stmt, "SELECT version,int_status,jobid FROM states WHERE parent_job='%|Ss'", md5_jobid);
                                if (stmt != NULL) {
                                        num_sub = edg_wll_ExecSQL(ctx, stmt, &sh);
                                        if (num_sub >=0 ) {
@@ -183,16 +181,42 @@ int edg_wll_JobStatusServer(
                                                        edg_wll_SetError(ctx, ENOMEM, "edg_wll_JobStatusServer() calloc children_states failed!");
                                                        goto rollback;
                                                }
-                                               while ((num_f = edg_wll_FetchRow(ctx, sh, 1, NULL, &stat_str)) == 1
+                                               while ((num_f = edg_wll_FetchRow(ctx, sh, sizeof(out_stat), NULL, out_stat)) == 3
                                                        && i < num_sub) {
-                                                       js = dec_intJobStat(stat_str, &s_out);
-                                                       if (s_out != NULL && js != NULL) {
+                                                       if (!strcmp(INTSTAT_VERSION,out_stat[0])) {
+                                                               js = dec_intJobStat(out_stat[1], &s_out);
+                                                               if (s_out != NULL && js != NULL) {
+                                                                       stat->children_states[i] = js->pub;
+                                                                       destroy_intJobStat_extension(js);
+                                                                       free(js);
+                                                                       i++; // Careful, this value will also be used further
+                                                               }
+                                                       }
+                                                       else { // recount state
+                                                               glite_jobid_t   subjob;
+                                                               intJobStat      js_real;
+                                                               char            *name;
+                                                               int             port;
+
+
+                                                               js = &js_real;
+                                                               glite_jobid_getServerParts(job, &name, &port);
+                                                               if (glite_jobid_recreate(name, port, out_stat[2], &subjob)) {
+                                                                       goto rollback;
+                                                               }
+                                                               free(name);
+
+                                                               if (edg_wll_intJobStatus(ctx, subjob, flags, js, js_enable_store, 0)) {
+                                                                       goto rollback;
+                                                               }
+                                                               glite_jobid_free(subjob);
                                                                stat->children_states[i] = js->pub;
                                                                destroy_intJobStat_extension(js);
-                                                               free(js);
                                                                i++; // Careful, this value will also be used further
                                                        }
-                                                       free(stat_str);
+                                                       free(out_stat[0]); out_stat[0] = NULL;
+                                                       free(out_stat[1]); out_stat[1] = NULL;  
+                                                       free(out_stat[2]); out_stat[2] = NULL;
                                                }
                                                if (num_f < 0) goto rollback;
 
@@ -234,17 +258,43 @@ int edg_wll_JobStatusServer(
                                }
                                else {
                                        // Get child states from the database
-                                       trio_asprintf(&stmt, "SELECT status FROM states WHERE parent_job='%|Ss' AND version='%|Ss'",
-                                                               md5_jobid, INTSTAT_VERSION);
-                                       out[1] = NULL;
+                                       trio_asprintf(&stmt, "SELECT version,status,jobid FROM states WHERE parent_job='%|Ss'", md5_jobid);
                                        if (stmt != NULL) {
                                                num_sub = edg_wll_ExecSQL(ctx, stmt, &sh);
                                                if (num_sub >=0 ) {
-                                                       while ((num_f = edg_wll_FetchRow(ctx, sh, sizeof(out)/sizeof(out[0]), NULL, out)) == 1 ) {
-                                                               num_f = atoi(out[0]);
-                                                               if (num_f > EDG_WLL_JOB_UNDEF && num_f < EDG_WLL_NUMBER_OF_STATCODES)
-                                                                       stat->children_hist[num_f+1]++;
-                                                               free(out[0]); 
+                                                       while ((num_f = edg_wll_FetchRow(ctx, sh, sizeof(out_stat)/sizeof(out_stat[0]), NULL, out_stat)) == 3 ) {
+                                                               if (!strcmp(INTSTAT_VERSION,out_stat[0])) {
+                                                                       num_f = atoi(out_stat[1]);
+                                                                       if (num_f > EDG_WLL_JOB_UNDEF && num_f < EDG_WLL_NUMBER_OF_STATCODES)
+                                                                               stat->children_hist[num_f+1]++;
+                                                               }
+                                                               else { // recount state
+                                                                       glite_jobid_t   subjob;
+                                                                       intJobStat      js_real;
+                                                                       char            *name;
+                                                                       int             port;
+
+
+                                                                       js = &js_real;
+                                                                       glite_jobid_getServerParts(job, &name, &port);
+                                                                       if (glite_jobid_recreate(name, port, out_stat[2], &subjob)) {
+                                                                               goto rollback;
+                                                                       }
+                                                                       free(name);
+
+                                                                       if (edg_wll_intJobStatus(ctx, subjob, flags, js, js_enable_store, 0)) {
+                                                                               goto rollback;
+                                                                       }
+                                                                       glite_jobid_free(subjob);
+                                                                       num_f = js->pub.state;
+                                                                       if (num_f > EDG_WLL_JOB_UNDEF && num_f < EDG_WLL_NUMBER_OF_STATCODES)
+                                                                               stat->children_hist[num_f+1]++;
+
+                                                                       destroy_intJobStat(js);
+                                                               }
+                                                               free(out_stat[0]); out_stat[0] = NULL;
+                                                               free(out_stat[1]); out_stat[1] = NULL;  
+                                                               free(out_stat[2]); out_stat[2] = NULL;
                                                        }
                                                        if (num_f < 0) goto rollback;
 
@@ -287,8 +337,8 @@ int edg_wll_JobStatusServer(
                        if (flags & EDG_WLL_STAT_CHILDREN) {
 
                                trio_asprintf(&stmt, "SELECT j.dg_jobid FROM states s,jobs j "
-                                               "WHERE s.parent_job='%|Ss' AND s.version='%|Ss' AND s.jobid=j.jobid",
-                                       md5_jobid, INTSTAT_VERSION);
+                                               "WHERE s.parent_job='%|Ss' AND s.jobid=j.jobid",
+                                       md5_jobid);
                                if (stmt != NULL) {
                                        num_sub = edg_wll_ExecSQL(ctx, stmt, &sh);
                                        if (num_sub >=0 ) {