[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [hobbit] Arithmetic exception in hobbitd_client



On Wed, Aug 03, 2005 at 04:50:05PM +0200, cits.bogajewski (at) daimlerchrysler.com wrote:
> would you mind take a look on my next problem? :)

Sure ;-)

> As just reported, hobbitd_client module stopped work. This is probably 
> because i copied the fresh compiled hpux-meminfo tool to my client 
> machine. On this machine this tool reports following:
> [memory]
> Total:0
> Free:0

Oops - doesn't look good. Could it be that the system you compiled 
hpux-meminfo on is a different OS version than the one you're running it
on ? Still I'd expect the code to be runnable across the two.

The obvious thing to try is to compile it on the machine where it
fails - I know that might be easier said than done.

One thing you could try: There's a bug in the hpux-meminfo tool, the
line that reads:
    pstat_getdynamic(&dbuf, sizeof(sbuf), 1, 0);
should be
    pstat_getdynamic(&dbuf, sizeof(dbuf), 1, 0);

i.e. an "d" instead of an "s" in the "sizeof(Xbuf)". You could try
fixing this and recompiling the tool, although it shouldn't cause the 
problem you see. 

> Anyway, hobbitd_client crashes leaving a core file. It seems to be a 
> problem with zero values.

Yeah, it doesn't like doing a divide by zero. Patch attached.


Regards,
Henrik

--- hobbitd/hobbitd_client.c	2005/07/25 13:57:56	1.21
+++ hobbitd/hobbitd_client.c	2005/08/03 16:24:18
@@ -363,16 +363,16 @@
 
 	get_memory_thresholds(hinfo, &physyellow, &physred, &swapyellow, &swapred, &actyellow, &actred);
 
-	memphyspct = (100 * memphysused) / memphystotal;
+	memphyspct = (memphystotal > 0) ? ((100 * memphysused) / memphystotal) : 0;
 	if (memphyspct > physyellow) physcolor = COL_YELLOW;
 	if (memphyspct > physred)    physcolor = COL_RED;
 
-	memswappct = (100 * memswapused) / memswaptotal;
+	memswappct = (memswaptotal > 0) ? ((100 * memswapused) / memswaptotal) : 0;
 	if (memswappct > swapyellow) swapcolor = COL_YELLOW;
 	if (memswappct > swapred)    swapcolor = COL_RED;
 
 	if (memactused != -1) {
-		memactpct = (100 * memactused) / memphystotal;
+		memactpct = (memphystotal > 0) ? ((100 * memactused) / memphystotal) : 0;
 		if (memactpct  > actyellow)  actcolor  = COL_YELLOW;
 		if (memactpct  > actred)     actcolor  = COL_RED;
 	}
@@ -386,6 +386,11 @@
 		memorysummary = "CRITICAL";
 	}
 
+	if ((memphystotal == 0) && (memorycolor == COL_GREEN)) {
+		memorycolor = COL_YELLOW;
+		memorysummary = "detection FAILED"
+	}
+
 	init_status(memorycolor);
 	sprintf(msgline, "status %s.memory %s %s - Memory %s\n",
 		commafy(hostname), colorname(memorycolor), timestr, memorysummary);