-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/netmem.c,v 6.43 2010-07-30 09:19:31 hadaq Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/netmem.c,v 6.44 2010-08-04 09:16:37 hadaq Exp $";
#define _POSIX_C_SOURCE 199309L
#define SYSLOG_NAMES
#define MAXINPATH 100
+static char msglog[300];
+
typedef struct TheArgsS {
char inPathS[MAXINPATH][PARAM_MAX_NAME_LEN];
char *inPath[MAXINPATH];
char verbosity[PARAM_MAX_VALUE_LEN];
char shmname[PARAM_MAX_VALUE_LEN];
- char evtstat[PARAM_MAX_VALUE_LEN];
+ char logname[PARAM_MAX_VALUE_LEN];
+ char hostname[PARAM_MAX_VALUE_LEN];
unsigned long portNr[MAXINPATH];
int portNrCnt;
strcpy(my->shmname, "");
- sprintf(my->evtstat, "%s_evtstat.txt", getenv("DAQ_SETUP"));
+ sprintf(my->logname, "%s%s_log.txt", getenv("DAQ_SETUP"), my->shmname);
+
+ /* Get host name */
+ gethostname(my->hostname, 30);
}
static int argsFromCL(TheArgs *my, int argc, char *argv[])
my->inPathCnt = inPathCntFromParam;
}
+ sprintf(my->logname, "%s%s_log.txt", getenv("DAQ_SETUP"), my->shmname);
+
/* Extract port numbers */
char fam[32];
char pa[32];
return retVal;
}
+static void storeLogInfo(TheArgs *theArgs, const char *msg)
+{
+
+ FILE *fp;
+ char ltime[20]; /* local time */
+ time_t t = time(NULL);
+ strftime(ltime, 20, "%b %2d %2H:%2M:%2S", localtime(&t));
+
+ fp = fopen(theArgs->logname, "a+");
+ fprintf(fp, "%s %10s %s %2s %13s %s\n", ltime, theArgs->hostname, "EB", theArgs->shmname, "daq_netmem:", msg);
+ fclose(fp);
+}
+
static int checkDataSources(TheArgs *theArgs, TheStats *theStats)
{
int ready2check = 0;
if (ready2check) {
for (i = 0; i < theArgs->nrOfMsgs; i++) {
if (dataSources[i] == 0) {
- fprintf(stderr, "<E> daq_netmem: source %d, port %d: no data received.\n", i, theArgs->portNr[i]);
+ sprintf(msglog, "<E> daq_netmem: source %d, port %d: no data received.", i, theArgs->portNr[i]);
+ fprintf(stderr, "%s\n", msglog);
+ storeLogInfo(theArgs, msglog);
+
go2exit = 1;
}
}
/* Add statistic for fill levels of buffers in percentage. */
static time_t t_0 = 0;
+ static time_t t_q = 0;
+ int alarm_fillLevel = 0;
+
unsigned long buffSize, queueSize;
time_t t, dT;
int i;
(*my->recvBytesRate[i]) = *nettr[i]->bytesReceived;
}
lastBytesRecv[i] = *nettr[i]->bytesReceived;
+
+ if (fillLevel > 95)
+ alarm_fillLevel = 1;
+ }
+
+ /* Store error message once per minite */
+ if (alarm_fillLevel) {
+ if (t - t_q > 60) {
+ storeLogInfo(theArgs, "<E> queue fill level exceeded 95%");
+ alarm_fillLevel = 0;
+ t_q = t;
+ }
}
t_0 = t;
}
}
-static void storeEvtStat(TheArgs *myArgs, unsigned long pktsDiscard, unsigned long msgsDiscard, unsigned long queue)
-{
-
- FILE *fp;
- char ltime[20]; /* local time */
- time_t t = time(NULL);
- strftime(ltime, 20, "%Y-%m-%d %H:%M:%S", localtime(&t));
-
- fp = fopen(myArgs->evtstat, "a+");
- fprintf(fp, "%s %d %s %d %d %d\n", "daq_netmem: ", (int) getpid(), ltime, queue, pktsDiscard, msgsDiscard);
- fclose(fp);
-}
-
static void statsDump(TheArgs *theArgs, NetTrans **my, int interval)
{
static unsigned long lastPR[MAXINPATH];
lastMD[i] = 0;
}
- if ((*my[i]->pktsDiscarded - lastPD[i]) > 0 || (*my[i]->msgsDiscarded - lastMD[i]) > 0)
- storeEvtStat(theArgs, *my[i]->pktsDiscarded - lastPD[i], *my[i]->msgsDiscarded - lastMD[i], i);
-
lastPR[i] = *my[i]->pktsReceived;
lastPD[i] = *my[i]->pktsDiscarded;
lastMD[i] = *my[i]->msgsDiscarded;
sprintf(buf, "%s%s", argv[0], theArgs->shmname);
if (NULL == (worker = Worker_initBegin(buf, sigHandler, theArgs->priority, theArgs->isStandalone))) {
+ sprintf(msglog, "<E> %s, %d: Worker_initBegin: failed to init: %s", __FILE__, __LINE__, strerror(errno));
+ storeLogInfo(theArgs, msglog);
syslog(LOG_ERR, "%s, %d: %s", __FILE__, __LINE__, strerror(errno));
exit(EXIT_FAILURE);
}
netTrans[i] = NetTrans_create(theArgs->inPath[i], 0, worker);
if (netTrans[i] == NULL) {
+ sprintf(msglog, "<E> %s, %d: NetTrans_create: failed to create %s: %s", __FILE__, __LINE__, theArgs->inPath[i],
+ strerror(errno));
+ storeLogInfo(theArgs, msglog);
syslog(LOG_ERR, "%s, %d: %s", __FILE__, __LINE__, strerror(errno));
exit(EXIT_FAILURE);
}
shmTrans[i] = ShmTrans_open(buf, 2 * theArgs->queueSize[i]);
if (shmTrans[i] == NULL) {
+ sprintf(msglog, "<E> %s, %d: ShmTrans_open: failed to open shmem segment %d: %s", __FILE__, __LINE__, i,
+ strerror(errno));
+ storeLogInfo(theArgs, msglog);
syslog(LOG_ERR, "%s, %d: %s", __FILE__, __LINE__, strerror(errno));
exit(EXIT_FAILURE);
}