Archivos por Etiqueta: bug

Java: El poltergeist (arrays, negativos y excepciones)

Despues de varias horas volviendome loco, he descubierto que algo que en a primera vista es imposible, no lo es…

Aqui el error (aparece de modo aleatorio):

java.lang.ArrayIndexOutOfBoundsException: -2
        at RandomTextGenerator$1.run(RandomTextGenerator.java:38)
        ... cut ...

El error no me parecería extraño (no se puede usar un numero negativo como indice para un array), si no fuera porque tengo el codigo delante y ya estaba controlada esa posibilidad: si el numero es menor de cero, le cambia el signo, por tanto era aparentemente imposible esa excepcion y aún así…

private static final char[] chars = "0123456789ab...".toCharArray(); // Linea 18
// ... cut ...
final int n = rand.nextInt(); // Linea 37
os.write(chars[(n < 0 ? -n : n) % chars.length]); // Linea 38

¿Como es posible que diga -2 si nunca debería devolver un numero negativo?

Explicación:
Para un cierto valor [Integer.MIN_VALUE=(-2^31)=(-2147483648)] el resultado del cambio de signo “-N” no varía… -2147483648.
Aunque a primera vista podría parecer un bug; al parecer en una recóndita nota del API de Java [Math.abs(int n)] ya hablan del tema.
PD2: En C tambien sucede.
El origen de todo es el [complemento a 2] que se usa para la representación binaria de los numeros.

El codigo fuente completo en GitHub

Anuncios

Linux Marvell (88E8053) – (2) Bug Stack-Trace Hardware Checksum

Al parecer hay un bug en el driver (sky2, kernel 2.6.27) para el chipset Marvell 88E8053, cuando hay mucha carga (yo lo uso como iSCSI-target) y está activo el checksum acelerado por hardware salen unos stacktraces horribles, en otro sitio ([2]) lei de otro problema con el mismo driver que se solucionaba arrancando el kernel con idle=poll, no lo he probado, pero como tampoco sé si eso tendrá un efecto colateral sobre otras cosas prefiero directamente deshabilitarlo solo en la tarjeta…
Este es el stacktrace del kernel:
Sep  6 01:56:47 linux kernel: eth1: hw csum failure.
Sep  6 01:56:47 linux kernel: Pid: 0, comm: swapper Tainted: G        W 2.6.27.23-0.1-pae #1
Sep  6 01:56:47 linux kernel:  [<c010X1cc>] dump_trace+0x6b/0x249
Sep  6 01:56:47 linux kernel:  [<c010Xca3>] show_trace+0x20/0x39
Sep  6 01:56:47 linux kernel:  [<c034Xfd8>] dump_stack+0x71/0x76
Sep  6 01:56:47 linux kernel:  [<c02eX179>] __skb_checksum_complete_head+0x45/0x57
Sep  6 01:56:47 linux kernel:  [<c031X7f3>] tcp_v4_rcv+0x10e/0x601
Sep  6 01:56:47 linux kernel:  [<c030Xa0b>] ip_local_deliver_finish+0xf6/0x1ac
Sep  6 01:56:47 linux kernel:  [<c030X6dd>] ip_rcv_finish+0x28d/0x2a3
Sep  6 01:56:47 linux kernel:  [<c02eX8b4>] netif_receive_skb+0x43d/0x48a
Sep  6 01:56:47 linux kernel:  [<f8a4X035>] sky2_status_intr+0x14a/0x442 [sky2]
Sep  6 01:56:47 linux kernel:  [<f8a4X37d>] sky2_poll+0x50/0xcf [sky2]
Sep  6 01:56:47 linux kernel:  [<c02eX178>] net_rx_action+0x92/0x161
Sep  6 01:56:47 linux kernel:  [<c012X515>] __do_softirq+0x83/0x107
Sep  6 01:56:47 linux kernel:  [<c012X5cb>] do_softirq+0x32/0x36
Sep  6 01:56:47 linux kernel:  [<c012X6c9>] irq_exit+0x35/0x69
Sep  6 01:56:47 linux kernel:  [<c010X408>] do_IRQ+0x5c/0x70
Sep  6 01:56:47 linux kernel:  [<c010X9c3>] common_interrupt+0x23/0x30
Sep  6 01:56:47 linux kernel:  [<c010X545>] default_idle+0x2a/0x3d
Sep  6 01:56:47 linux kernel:  [<c010X629>] c1e_idle+0xd1/0xd6
Sep  6 01:56:47 linux kernel:  [<c010Xaaa>] cpu_idle+0xc7/0xe9
El workarround:
# /etc/sysconfig/network/ifcfg-ethX
ETHTOOL_OPTIONS=”-K iface rx off tx off” # DISABLE HW CSUM
Si se prefiere, se puede hacer a manija o colocar en algun script de arranque:
# ethtool -K ethX rx off tx off

Se reinicia la maquina (o se hace un rmmod sky2 / modprobe sky2) y deberia volver a funcionar:

 
# ethtool -k ethX
Offload parameters for ethX:
rx-checksumming: off
tx-checksumming: off
scatter-gather: off
tcp segmentation offload: off
udp fragmentation offload: off
generic segmentation offload: on
large receive offload: off
 
Y eso es todo…
A %d blogueros les gusta esto: