{
char* times[SERVER_STATISTICS_COUNT];
int i;
+ char *head;
for (i = 0; i < SERVER_STATISTICS_COUNT; i++)
if (edg_wll_ServerStatisticsGetStart(ctx, i))
times[i] = strdup((const char*)ctime(edg_wll_ServerStatisticsGetStart(ctx, i)));
else
times[i] = 0;
+ if (edg_wll_ServerStatisticsInTmp())
+ asprintf(&head,
+ "<b>WARNING: L&B statistics are stored in /tmp, please, configure L&B server to make them really persistent!</b><br/><br/>\n");
+ else
+ asprintf(&head, "");
+
asprintf(&out,
"<h2>LB Server Usage Statistics</h2>\n"
+ "%s"
"<table halign=\"left\">\n"
"<tr><td>Variable</td><td>Value</td><td>Measured from</td></tr>\n"
"<tr><td>gLite job regs</td><td>%i</td><td>%s</td></tr>\n"
"<tr><td>Plain text accesses</td><td>%i</td><td>%s</td></tr>\n"
"<tr><td>RSS accesses</td><td>%i</td><td>%s</td></tr>\n"
"</table>\n",
+ head,
edg_wll_ServerStatisticsGetValue(ctx, SERVER_STATS_GLITEJOB_REGS),
times[SERVER_STATS_GLITEJOB_REGS],
edg_wll_ServerStatisticsGetValue(ctx, SERVER_STATS_PBSJOB_REGS),
for (i = 0; i < SERVER_STATISTICS_COUNT; i++)
free(times[i]);
+ free(head);
}
*message = out;
static edg_wll_server_statistics *serverStatisticsMap = NULL;
static int serverStatisticsFD;
+static int stats_in_tmp = 0;
+static int msync_counter = 0;
int edg_wll_InitServerStatistics(edg_wll_Context ctx, char *file)
{
//TODO get file name from command line
char *fname;
+ char *lblocenv = NULL;
if (file)
asprintf(&fname, "%s", file);
else{
- asprintf(&fname, "/tmp/lb_server_stats");
- glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_INFO,
- "server stats file not found, using default %s", fname);
+
+ if (! (lblocenv = getenv("GLITE_LB_LOCATION_VAR"))) {
+ struct stat info;
+ if (stat("/var/glite", &info) == 0 && S_ISDIR(info.st_mode))
+ asprintf(&fname, "/var/glite/lb_server_stats");
+ else {
+ asprintf(&fname, "/tmp/lb_server_stats");
+ stats_in_tmp = 1;
+ }
+ glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_INFO,
+ "server stats file not configured, using default %s", fname);
+ }
+ else
+ asprintf(&fname, "%s/lb_server_stats", lblocenv);
}
serverStatisticsFD = open(fname, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
- if (serverStatisticsFD < 0)
+ if (serverStatisticsFD < 0){
+ serverStatisticsFD = open("/tmp/lb_server_stats", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
+ glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_WARN,
+ "Server statistics: cannot open %s, trying to use /tmp/lb_server_stats instead.", fname);
+ stats_in_tmp = 1;
+ }
+ if (serverStatisticsFD < 0) {
+ glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_WARN, "Cannot use server statistics!");
+ free(fname);
return edg_wll_SetError(ctx,errno,fname);
+ }
off_t size = lseek(serverStatisticsFD, 0, SEEK_END) - lseek(serverStatisticsFD, 0, SEEK_SET);
msync(serverStatisticsMap, SERVER_STATISTICS_COUNT*sizeof(*serverStatisticsMap), MS_ASYNC);
+ free(fname);
+
return 0;
}
serverStatisticsMap[type].value++;
flock(serverStatisticsFD, LOCK_UN);
+ if (++msync_counter % 100 == 0)
+ msync(serverStatisticsMap, SERVER_STATISTICS_COUNT*sizeof(*serverStatisticsMap), MS_ASYNC);
+
return 0;
}
return &(serverStatisticsMap[type].start);
}
+int edg_wll_ServerStatisticsInTmp()
+{
+ return stats_in_tmp;
+}
+