Opened 15 years ago
Closed 15 years ago
#3909 closed defect (fixed)
NPE and broken data during upload attempt. (QuadBuckets)
Reported by: | bilbo | Owned by: | hansendc |
---|---|---|---|
Priority: | major | Milestone: | |
Component: | Core | Version: | latest |
Keywords: | QuadBuckets NPE | Cc: |
Description
I edited some data (using JOSM 2437), then I wanted to use validator and do upload and I got just a messagebox saying "nullpointer exception" and on console I found this stacktrace:
Exception occurred during event dispatching: java.lang.NullPointerException at org.openstreetmap.josm.data.osm.QuadBuckets$QBLevel.nextContentNode QuadBuckets.java:485) at org.openstreetmap.josm.data.osm.QuadBuckets$QuadBucketIterator.next_content_node(QuadBuckets.java:969) at org.openstreetmap.josm.data.osm.QuadBuckets$QuadBucketIterator.peek(QuadBuckets.java:1015) at org.openstreetmap.josm.data.osm.QuadBuckets$QuadBucketIterator.hasNext(QuadBuckets.java:993) at org.openstreetmap.josm.data.osm.QuadBuckets.toArrayList(QuadBuckets.java:943) at org.openstreetmap.josm.data.osm.QuadBuckets.toArray(QuadBuckets.java:953) at java.util.Collections$UnmodifiableCollection.toArray(Collections.java:1001) at java.util.ArrayList.<init>(ArrayList.java:131) at org.openstreetmap.josm.data.osm.visitor.MapPaintVisitor.selectedLast(MapPaintVisitor.java:1429) at org.openstreetmap.josm.data.osm.visitor.MapPaintVisitor.visitAll(MapPaintVisitor.java:1523) at org.openstreetmap.josm.gui.layer.OsmDataLayer.paint(OsmDataLayer.java:247) at org.openstreetmap.josm.gui.MapView.paint(MapView.java:388) at javax.swing.JComponent.paintChildren(JComponent.java:864) at javax.swing.JSplitPane.paintChildren(JSplitPane.java:1030) at javax.swing.JComponent.paint(JComponent.java:1038) at javax.swing.JComponent.paintChildren(JComponent.java:864) at javax.swing.JComponent.paint(JComponent.java:1038) at javax.swing.JComponent.paintChildren(JComponent.java:864) at javax.swing.JComponent.paint(JComponent.java:1038) at javax.swing.JComponent.paintChildren(JComponent.java:864) at javax.swing.JComponent.paint(JComponent.java:1038) at javax.swing.JComponent.paintChildren(JComponent.java:864) at javax.swing.JComponent.paint(JComponent.java:1038) at javax.swing.JLayeredPane.paint(JLayeredPane.java:567) at javax.swing.JComponent.paintChildren(JComponent.java:864) at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131) at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1475) at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1406) at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:294) at javax.swing.RepaintManager.paint(RepaintManager.java:1220) at javax.swing.JComponent.paint(JComponent.java:1015) at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21) at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60) at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97) at java.awt.Container.paint(Container.java:1780) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714) at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694) at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178) at java.awt.Dialog$1.run(Dialog.java:1045) at java.awt.Dialog$3.run(Dialog.java:1097) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Dialog.show(Dialog.java:1095) at java.awt.Component.show(Component.java:1563) at java.awt.Component.setVisible(Component.java:1515) at java.awt.Window.setVisible(Window.java:841) at java.awt.Dialog.setVisible(Dialog.java:985) at org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor$3.run(PleaseWaitProgressMonitor.java:79) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) java.lang.NullPointerException at org.openstreetmap.josm.data.osm.QuadBuckets$QBLevel.split(QuadBuckets.java:289) at org.openstreetmap.josm.data.osm.QuadBuckets$QBLevel.add_to_leaf(QuadBuckets.java:328) at org.openstreetmap.josm.data.osm.QuadBuckets$QBLevel.add(QuadBuckets.java:564) at org.openstreetmap.josm.data.osm.QuadBuckets.add(QuadBuckets.java:819) at org.openstreetmap.josm.data.osm.QuadBuckets.addAll(QuadBuckets.java:873) at org.openstreetmap.josm.data.osm.DataSet.reindexAll(DataSet.java:767) at org.openstreetmap.josm.plugins.validator.tests.UnconnectedWays.startTest(UnconnectedWays.java:77) at org.openstreetmap.josm.plugins.validator.ValidateAction$ValidationTask.realRun(ValidateAction.java:164) at org.openstreetmap.josm.gui.PleaseWaitRunnable.doRealRun(PleaseWaitRunnable.java:63) at org.openstreetmap.josm.gui.PleaseWaitRunnable.run(PleaseWaitRunnable.java:105) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) java.lang.NullPointerException at org.openstreetmap.josm.data.osm.QuadBuckets$QBLevel.split(QuadBuckets.java:289) at org.openstreetmap.josm.data.osm.QuadBuckets$QBLevel.add_to_leaf(QuadBuckets.java:328) at org.openstreetmap.josm.data.osm.QuadBuckets$QBLevel.add(QuadBuckets.java:564) at org.openstreetmap.josm.data.osm.QuadBuckets.add(QuadBuckets.java:819) at org.openstreetmap.josm.data.osm.QuadBuckets.addAll(QuadBuckets.java:873) at org.openstreetmap.josm.data.osm.DataSet.reindexAll(DataSet.java:767) at org.openstreetmap.josm.plugins.validator.tests.UnconnectedWays.startTest(UnconnectedWays.java:77) at org.openstreetmap.josm.plugins.validator.ValidateAction$ValidationTask.realRun(ValidateAction.java:164) at org.openstreetmap.josm.gui.PleaseWaitRunnable.doRealRun(PleaseWaitRunnable.java:63) at org.openstreetmap.josm.gui.PleaseWaitRunnable.run(PleaseWaitRunnable.java:105) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) p1 elapesd: 0 p2 elapesd: 0 p99 elapesd: 0 I then tried to upload data to server to save my work and I found that nodes were uploaded fine, but ways were not uploaded at all (the changeset contained no ways, even though I've modified some of them) Also, all ways disappeared from my view - from the dataset I've seen in JOSM.
Attachments (0)
Change History (8)
comment:1 by , 15 years ago
comment:2 by , 15 years ago
Keywords: | QuadBuckets NPE added |
---|---|
Summary: | NPE and broken data during upload attempt. → NPE and broken data during upload attempt. (QuadBuckets) |
comment:3 by , 15 years ago
Owner: | changed from | to
---|
Urg. I think this is a race.
The add() code is splitting a node. It allocates children[], but not any child QBLevels. The iteration code concurrently comes along and notices the empty children[] array, considers it a dead end, and nulls out children[]. The split() code now goes and tries to access children[].
I need to think about the locking a bit.
comment:4 by , 15 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
I've added some locking to QuadBuckets to hopefully ensure that this won't happen any more.
comment:5 by , 15 years ago
Resolution: | fixed |
---|---|
Status: | closed → reopened |
I've just got similar exception in r2440
java.lang.AssertionError: branch node had no children at org.openstreetmap.josm.data.osm.QuadBuckets.abort(QuadBuckets.java:29) at org.openstreetmap.josm.data.osm.QuadBuckets$QBLevel.nextContentNode(QuadBuckets.java:493) at org.openstreetmap.josm.data.osm.QuadBuckets$QuadBucketIterator.next_content_node(QuadBuckets.java:986) at org.openstreetmap.josm.data.osm.QuadBuckets$QuadBucketIterator.peek(QuadBuckets.java:1033) at org.openstreetmap.josm.data.osm.QuadBuckets$QuadBucketIterator.hasNext(QuadBuckets.java:1011) at java.util.Collections$UnmodifiableCollection$1.hasNext(Collections.java:1009) at org.openstreetmap.josm.gui.layer.OsmDataLayer.undeletedSize(OsmDataLayer.java:491) at org.openstreetmap.josm.gui.layer.OsmDataLayer.getToolTipText(OsmDataLayer.java:254) at org.openstreetmap.josm.gui.io.SaveLayerInfoCellRenderer.prepareLayerNameRenderer(SaveLayerInfoCellRenderer.java:37) at org.openstreetmap.josm.gui.io.SaveLayerInfoCellRenderer.getTableCellRendererComponent(SaveLayerInfoCellRenderer.java:138) ... uninteresting rest of stacktrace ...
comment:6 by , 15 years ago
This happen much more often if MAX_OBJECTS_PER_LEVEL is set to small number. I had it set to 2 when I was debugging QuadBuckets (see r2441) and exception happend for almost any bigger dataset.
comment:7 by , 15 years ago
I've tracked this down to the DataSetMerger:
myWay.getNodes().size(): 0 myNodes.size(): 13
set primitive modified: 5331187
at org.openstreetmap.josm.data.osm.OsmPrimitive.setModified(OsmPrimitive.java:268)
at org.openstreetmap.josm.data.osm.DataSetMerger.mergeNodeList(DataSetMerger.java:199)
at org.openstreetmap.josm.data.osm.DataSetMerger.fixReferences(DataSetMerger.java:166)
at org.openstreetmap.josm.data.osm.DataSetMerger.merge(DataSetMerger.java:368)
It looks like it's having difficulty finding existing ways, so it creates a new empty way. Merging the new data with that empty way sets it modified in mergeNodeList().
I'm trying to figure out why it is having problems finding the existing way during the merge.
comment:8 by , 15 years ago
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
(In [2442]) This should fix #3909
We created empty branches when we attempted to split a QB node
with ways in it and none of the ways could fit into a child.
The children were allocated before we knew that we had something
to put in them, and we ended up with an empty array of children.
That triggered this check.
So, defer child array allocation until we really need it.
Now happened second time - when I pressed "Validate" after making some changes and uploading them to server, then I got the nullpointer exception messagebox (ordinary messagebox, not that one with "Report bug" button, etc ...), when I dismiss it, all ways disappear and only nodes remain visible in the dataset.