startup: java.lang.NegativeArraySizeException

Hier finden YaCy User Hilfe wenn was nicht funktioniert oder anders funktioniert als man dachte. Bei offensichtlichen Fehlern diese bitte gleich in die Bugs (http://bugs.yacy.net) eintragen.
Forumsregeln
In diesem Forum geht es um Benutzungsprobleme und Anfragen für Hilfe. Wird dabei ein Bug identifiziert, wird der thread zur Bearbeitung in die Bug-Sektion verschoben. Wer hier also einen Thread eingestellt hat und ihn vermisst, wird ihn sicherlich in der Bug-Sektion wiederfinden.

startup: java.lang.NegativeArraySizeException

Beitragvon dulcedo » Sa Feb 20, 2010 11:21 am

SVN6682 nach Update von SVN6678 beim Hochfahren. Tabelle danach gelöscht, Startup erfolgreich. Beim nächsten Neustart selber Fehler mit der diesmal neuesten Tabelle.

Code: Alles auswählen
I 2010/02/20 10:20:54 TABLE initialization of text.urlmd.20091214044445374.table. table copy: no, available RAM: 5016MB, needed: 5048MB, allocating space for 3886559 entries
I 2010/02/20 10:20:54 TABLE D:\yacy-b\DATA\INDEX\freeworld\SEGMENTS\default\text.urlmd.20091214044445374.table: TABLE D:\yacy-b\DATA\INDEX\freeworld\SEGMENTS\default\text.urlmd.20091214044445374.table has table copy DISABLED
I 2010/02/20 10:20:54 TABLE initializing RAM index for TABLE text.urlmd.20091214044445374.table, please wait.
I 2010/02/20 10:21:17 kelondroSplitTable opening partial eco table D:\yacy-b\DATA\INDEX\freeworld\SEGMENTS\default\text.urlmd.20090101000008766.table
E 2010/02/20 10:21:17 STARTUP FATAL ERROR: null
java.lang.NegativeArraySizeException
   at net.yacy.kelondro.index.RowCollection.ensureSize(RowCollection.java:232)
   at net.yacy.kelondro.index.RowCollection.<init>(RowCollection.java:92)
   at net.yacy.kelondro.index.RowSet.<init>(RowSet.java:50)
   at net.yacy.kelondro.table.Table.<init>(Table.java:125)
   at net.yacy.kelondro.table.SplitTable.init(SplitTable.java:205)
   at net.yacy.kelondro.table.SplitTable.<init>(SplitTable.java:122)
   at net.yacy.kelondro.table.SplitTable.<init>(SplitTable.java:95)
   at de.anomic.search.MetadataRepository.<init>(MetadataRepository.java:76)
   at de.anomic.search.Segment.<init>(Segment.java:131)
   at de.anomic.search.Segments.segment(Segments.java:140)
   at de.anomic.search.Segments.segment(Segments.java:132)
   at de.anomic.search.Switchboard.<init>(Switchboard.java:354)
   at net.yacy.yacy.startup(yacy.java:221)
   at net.yacy.yacy.main(yacy.java:1029)
S 2010/02/20 10:21:17 SHUTDOWN goodbye. (this is the last line)
dulcedo
 
Beiträge: 1006
Registriert: Do Okt 16, 2008 6:36 pm
Wohnort: Bei Karlsruhe

Re: startup: java.lang.NegativeArraySizeException

Beitragvon Quix0r » Sa Feb 20, 2010 3:48 pm

In der Zeile 232 habe ich folgendes stehen:
Code: Alles auswählen
final byte[] newChunkcache = new byte[(int) allocram]; // increase space

Also muss allocram < 0 sein? Eine Methode darueber sehe ich dazu ein Statement, was in Frage kommen kann...
Code: Alles auswählen
final long needed = elements * rowdef.objectsize;

... da needed zurueckgegeben wird. elements wird am Anfang der Methode mit einem assert() geprueft, was okay aussieht. Also bleibt nur rowdef.objectsize ueberig welches ein oeffentliches Attribut ist, aber final ist und somit nur im Konstruktur gesetzt werden kann.

Im Konstruktor von Row scheint, die lokale Variable oe berechnet und in das besagte oeffentliche Attribut gesetzt:
Code: Alles auswählen
this.objectsize = os;

Die Zeile zum Berechnen lautet:
os+= this.row[i].cellwidth;
Was daraus schliessen laeesst, dass eventuell ein cellwith negativ ist (+- ist nach mathematischen Regeln immer noch -). Und sollte mit einem assert() getract werden.

Ich habe mal vor der Zeile mit os+= folgendes eingebaut, habe aber keine Commit-Rechte:
Code: Alles auswählen
assert (this.row[i].cellwidth >=0) : "cellwith["+i+"]="+this.row[i].cellwidth;

Vielleicht bekomme ich das nachgestellt. :)
Quix0r
 
Beiträge: 1345
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld

Re: startup: java.lang.NegativeArraySizeException

Beitragvon sixcooler » Mo Feb 22, 2010 5:20 pm

Ist dieses hier noch aktuell?

Quix0r hat geschrieben:Also muss allocram < 0 sein?


Das kann ich wenig glauben - immerhin wird kurz vorher geprüft das es auch größer
als der aktuelle chunkcache wird, und der kann ja keine negative größe haben.

Daher kann nur noch der cast schieflaufen - z.b. mit einem allocram > Integer.MAX_VALUE

Leider kommt sowas nur in Sphären (>2GB) vor die ich nicht wirklich kenne :-)
Kann also irgenwer dieses evtl sogar noch reproduzieren?
sixcooler
 
Beiträge: 494
Registriert: Do Aug 14, 2008 5:22 pm

Re: startup: java.lang.NegativeArraySizeException

Beitragvon Orbiter » Mo Feb 22, 2010 8:26 pm

deine Erklärung erscheint mir auch plausibel zu sein. Ich konnte leider nirgendswo ein Hinweis finden dass array-Größen auf MAXINT begrenzt sind. http://java.sun.com/docs/books/tutorial ... rrays.html sagt da auch nichts drüber.
Ich schätze aber es ist das MAXINT Problem.
Orbiter
 
Beiträge: 5796
Registriert: Di Jun 26, 2007 10:58 pm
Wohnort: Frankfurt am Main

Re: startup: java.lang.NegativeArraySizeException

Beitragvon sixcooler » Mo Feb 22, 2010 9:54 pm

Wissen habe ich da leider auch keines.

Aber wie sollte man ein Array erzeugen das größer MAXINT ist?

Code: Alles auswählen
long maxInt = 1 + Integer.MAX_VALUE;
int castedInt = (int) maxInt;
System.out.println(castedInt); // prints: -2147483648

Ein int das größer MAXINT ist bekommt man nicht. Stattdessen etwas negatives - daher evtl der Fehler.

Aber davon abgesehen: ein solch großes Bytearray? (tut das den not?)
sixcooler
 
Beiträge: 494
Registriert: Do Aug 14, 2008 5:22 pm

Re: startup: java.lang.NegativeArraySizeException

Beitragvon Quix0r » Mo Feb 22, 2010 10:55 pm

Probier es doch aus. Einfach eine Testklasse. Und: long passt niemals in int rein, da macht dann Java was "logisches" wie viele andere Sprachen das auch machen, die soch "Umwandlung" (eher Verwandlung ;) ) beherrschen.
Quix0r
 
Beiträge: 1345
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld

Re: startup: java.lang.NegativeArraySizeException

Beitragvon sixcooler » Di Feb 23, 2010 2:56 pm

fix in svn6693

das ist ja ein herliches Luxus-Problem!
Es war nicht so einfach ein 2G Tablefile ramcopy zu bekommen um dieses mal nachzu stellen :-)
Nach etwas hin und her grübeln bin ich zu dem Schluss gekommen das diese recht einfache Gechichte dem gut begegnet.

@Orbiter: war das überhaupt so gedacht, das auch so Fette Table-files ramcopy bekommen?
sixcooler
 
Beiträge: 494
Registriert: Do Aug 14, 2008 5:22 pm

Re: startup: java.lang.NegativeArraySizeException

Beitragvon Orbiter » Di Feb 23, 2010 3:29 pm

ich bin nicht sicher ob dein Patch funktioniert weil es das

assert allocram > chunkcache.length

relativ sicher verletzt. Deswegen fand ich den Fix auch nicht einfach, man muss sehen wie man das Thema 'Resourcenknappheit' genereller behandelt. In diesem Fall ist es ja leider keine Resourcenknappheit sondern eine Limitierung der Programmiersprache, aber für den User ists das gleiche.

Ich würde da noch ein Check gegen die assert-Bedingung einbauen und im Falle dass diese verletzt ist eine RowSpaceExceededException werfen.
Orbiter
 
Beiträge: 5796
Registriert: Di Jun 26, 2007 10:58 pm
Wohnort: Frankfurt am Main

Re: startup: java.lang.NegativeArraySizeException

Beitragvon sixcooler » Di Feb 23, 2010 4:10 pm

'assert allocram > chunkcache.length' würde verletzt wenn chunkcache.length schon MAXINT ist ist das in diesem Fall nicht evtl sogar gut so?
wird in so einem riesencache etwas hinzugefügt, dann ja eh nur bis zu maximalen Menge von MAXINT - mehr iss ja nich :-(

An eine RowSpaceExceededException habe ich auch gedacht - aber verworfen: Hat man ein 2GB Table und ramcopy hierfür würde ja versucht werden noch 'luft' zum wachsen vorzusehen und damit gescheitert.
Evtl besser: RowSpaceExceededException wenn chunkcache.length schon MAXINT ist
sixcooler
 
Beiträge: 494
Registriert: Do Aug 14, 2008 5:22 pm

Re: startup: java.lang.NegativeArraySizeException

Beitragvon sixcooler » Di Feb 23, 2010 5:06 pm

ist schon richtig - so gut war das nicht
svn6694 sollte es zuverlässiger erledigen.
sixcooler
 
Beiträge: 494
Registriert: Do Aug 14, 2008 5:22 pm

Re: startup: java.lang.NegativeArraySizeException

Beitragvon dulcedo » Mi Feb 24, 2010 6:11 am

Da ich immer von einem ein paar Wochen alten Backup ausgehe ist das schwer reproduzierbar, mehrere Neustarts mit 6694 hat er nun fehlerfrei überstanden.
dulcedo
 
Beiträge: 1006
Registriert: Do Okt 16, 2008 6:36 pm
Wohnort: Bei Karlsruhe

Re: startup: java.lang.NegativeArraySizeException

Beitragvon sixcooler » Mi Feb 24, 2010 5:52 pm

dieses lies sich nachstellen mit table-files von 1463MB-2G die in den ram kopiert werden (genügend speicher ist vorausgesetzt)
Orbiters Sorge bezieht sich auf table-files mit ramcopy in diesem größen- Bereich, die noch 'wachsen' also <2GB sind (und nicht zu alt)
Solche files kommen ja recht häufig vor - nur das mit ramcopy passiert halt nur mit wirklch dickem Speicher :-)
sixcooler
 
Beiträge: 494
Registriert: Do Aug 14, 2008 5:22 pm

Re: startup: java.lang.NegativeArraySizeException

Beitragvon dulcedo » Mi Feb 24, 2010 9:07 pm

Wenn es hilfreich ist wären 12 und 16GB mit entsprechend grossen peers remote zugänglich.
dulcedo
 
Beiträge: 1006
Registriert: Do Okt 16, 2008 6:36 pm
Wohnort: Bei Karlsruhe


Zurück zu Fragen und Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste