- From: Anselm Baird_Smith <abaird@www43.inria.fr>
- Date: Fri, 28 Feb 1997 10:57:50 +0100 (MET)
- To: mura@kansai.oki.co.jp (Toshiki Murata)
- Cc: www-jigsaw@w3.org
Toshiki Murata writes: > I used w3c.tools.dbm.jdbm for very large data(size > 7000). > Then w3c.tools.dbm.jdbm#lookup(key) cause > > java.lang.ArrayIndexOutOfBoundsException: 362 > at w3c.tools.dbm.jdbm.lookupBucket(jdbm.java:687) > at w3c.tools.dbm.jdbm.lookup(jdbm.java:738) > > jdbm#splitBucket(jdbm.java:296) > dir_size <<= 1 ; > dir_adr = allocateSpace(dir_size*4) ; > int ndiridx[] = new int[dir_size] ; > for (int i = 0 ; i < (dir_size/2) ; i++) { > ndiridx[2*i] = diridx[i] ; > ndiridx[2*i+1] = diridx[i] ; > } > diridx = ndiridx ; > dir_bits = newbits ; > dir_changed = true ; > So diridx[] is increased here. > > jdbm#saveDirectory(jdbm.java:452) > for (int i = 0 ; i < diridx.length ; i++) > out.writeInt(diridx[i]) ; > And increased diridx[] is written to jdbm file. > > But I think jdbm#saveBucket(jdbm.java:439) perhaps over-writes > bucket data in diridx[] area. > ( because (jdbm.java:556) fileptr is not changed. ) > > I tried to fix this problem, > but it is difficult for me. That's a difficult bug to track, I haven't tried storing such big objects within that database. You may want to turn traces on (set debug = true, in jdbm.java). I think a related bug has been fixed (some times ago, check comments) in jdbm::write(jdbmBucket, key, value) a long time ago. Also you have to make sure to shtdown the database properly between to runs of your application (otherwise you may have the files in a inconsistent state), but I guess you did it ? Anselm.
Received on Friday, 28 February 1997 04:59:33 UTC