Opened 16 years ago
Closed 16 years ago
#4323 closed defect (fixed)
splitting way freezes JOSM completely
| Reported by: | malenki | Owned by: | malenki | 
|---|---|---|---|
| Priority: | blocker | Milestone: | |
| Component: | Core | Version: | latest | 
| Keywords: | Cc: | malenki | 
Description
Doesn't freeze at most ways, here a How To reproduce: Downloading area http://www.openstreetmap.org/?lat=50.85112&lon=13.34062&zoom=16&layers=B000FTF and split "Brand-Erbisdorfer Grenzweg" where "Königstannenweg" branches. 
Results here in 100% CPU-load. I have to kill -s 9 josm. Confirmed by one user who had to try it twice to reproduce.
Happens with josm 2784 and 2773 - 2741 is fine
Attachments (2)
Change History (14)
comment:1 by , 16 years ago
| Cc: | added | 
|---|
comment:3 by , 16 years ago
| Owner: | changed from to | 
|---|---|
| Status: | new → needinfo | 
Sorry, could not reproduce. Please supply an osm-file (as small as possible) and a detailed step-by-step description (try it youself before with a fresh josm start). Sometimes the reason is a very small detail.
comment:4 by , 16 years ago
I also can't reproduce it.
You can use kill -s QUIT instead of kill -s 9 next time. This won't kill JOSM but it will print thread dump which can help us to identify the problem.
comment:5 by , 16 years ago
jttt, thx, didn't now that - but the command doesn't work with josm hanging with this bug.
Reverting [1] would brought back the bug at the mentioned place but I will append a osm-file though. I thought just leaving the way intact would be enough.
comment:6 by , 16 years ago
It seems the attached file created by josm is unreadable by josm. Please try your luck with the description in the OP once more...
by , 16 years ago
| Attachment: | freeze.2.osm added | 
|---|
by , 16 years ago
| Attachment: | freeze.osm added | 
|---|
comment:7 by , 16 years ago
Hm. The locally stored file is fine, but when I d/l the attachements josm can't make sense of it.
comment:8 by , 16 years ago
I could actually reproduce this immediately with a "fresh" josm.
area loaded was http://api.openstreetmap.org/api/0.6/map?bbox=13.335235118865967,50.8522197088937,13.335707187652588,50.85253128233479
josm consumed 100% CPU and kill -QUIT resulted in this dump:
Full thread dump Java HotSpot(TM) Client VM (14.3-b01 mixed mode, sharing):according to 
"OpenStreetBugs download loop" prio=10 tid=0x08ca5000 nid=0x4fd1 waiting on condition [0xb1004000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at org.openstreetmap.josm.plugins.osb.OsbDownloadLoop.run(OsbDownloadLoop.java:94)
"Map Status Collector" daemon prio=10 tid=0x0821b000 nid=0x4fd0 in Object.wait() [0xb1055000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:485)
	at org.openstreetmap.josm.gui.MapStatus$Collector.run(MapStatus.java:148)
	- locked <0x55954b88> (a org.openstreetmap.josm.gui.MapStatus$Collector)
	at java.lang.Thread.run(Thread.java:619)
"pool-1-thread-1" prio=10 tid=0x082c4400 nid=0x4fca waiting on condition [0xb1984000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x54830710> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1925)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:358)
	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
	at java.lang.Thread.run(Thread.java:619)
"Timer-0" daemon prio=10 tid=0x080fa000 nid=0x4f9c in Object.wait() [0xb1a86000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:485)
	at java.util.TimerThread.mainLoop(Timer.java:483)
	- locked <0x55491ce8> (a java.util.TaskQueue)
	at java.util.TimerThread.run(Timer.java:462)
"OSMJobThread 1" daemon prio=10 tid=0x088e5000 nid=0x4f9a waiting on condition [0xb1ad7000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x554739a0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1925)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:358)
	at org.openstreetmap.gui.jmapviewer.JobDispatcher$JobThread.executeJobs(JobDispatcher.java:111)
	at org.openstreetmap.gui.jmapviewer.JobDispatcher$JobThread.run(JobDispatcher.java:98)
"DestroyJavaVM" prio=10 tid=0x08059c00 nid=0x4f42 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE
"RemoteControl HTTP Server" daemon prio=10 tid=0x084c6800 nid=0x4f6e runnable [0xb1b79000]
   java.lang.Thread.State: RUNNABLE
	at java.net.PlainSocketImpl.socketAccept(Native Method)
	at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390)
	- locked <0x55376288> (a java.net.SocksSocketImpl)
	at java.net.ServerSocket.implAccept(ServerSocket.java:453)
	at java.net.ServerSocket.accept(ServerSocket.java:421)
	at org.openstreetmap.josm.plugins.remotecontrol.HttpServer.run(HttpServer.java:51)
"AWT-EventQueue-0" prio=10 tid=0x08112c00 nid=0x4f6d runnable [0xb19d5000]
   java.lang.Thread.State: RUNNABLE
	at org.openstreetmap.josm.actions.SplitWayAction.splitWay(SplitWayAction.java:415)
	at org.openstreetmap.josm.actions.SplitWayAction.splitWay(SplitWayAction.java:288)
	at org.openstreetmap.josm.actions.SplitWayAction.actionPerformed(SplitWayAction.java:197)
	at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1633)
	at javax.swing.JComponent.processKeyBinding(JComponent.java:2839)
	at javax.swing.KeyboardManager.fireBinding(KeyboardManager.java:267)
	at javax.swing.KeyboardManager.fireKeyboardAction(KeyboardManager.java:216)
	at javax.swing.JComponent.processKeyBindingsForAllComponents(JComponent.java:2916)
	at javax.swing.JComponent.processKeyBindings(JComponent.java:2908)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2802)
	at java.awt.Component.processEvent(Component.java:6040)
	at java.awt.Container.processEvent(Container.java:2041)
	at java.awt.Component.dispatchEventImpl(Component.java:4630)
	at java.awt.Container.dispatchEventImpl(Container.java:2099)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
	at java.awt.Component.dispatchEventImpl(Component.java:4502)
	at java.awt.Container.dispatchEventImpl(Container.java:2099)
	at java.awt.Window.dispatchEventImpl(Window.java:2475)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	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)
"AWT-Shutdown" prio=10 tid=0x082ae400 nid=0x4f6c in Object.wait() [0xb1b28000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:485)
	at sun.awt.AWTAutoShutdown.run(AWTAutoShutdown.java:259)
	- locked <0x54845300> (a java.lang.Object)
	at java.lang.Thread.run(Thread.java:619)
"TimerQueue" daemon prio=10 tid=0x08462400 nid=0x4f56 in Object.wait() [0xb1a2c000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at javax.swing.TimerQueue.run(TimerQueue.java:232)
	- locked <0x54ba9e28> (a javax.swing.TimerQueue)
	at java.lang.Thread.run(Thread.java:619)
"AWT-XAWT" daemon prio=10 tid=0x0822bc00 nid=0x4f4c runnable [0xb1bca000]
   java.lang.Thread.State: RUNNABLE
	at sun.awt.X11.XToolkit.waitForEvents(Native Method)
	at sun.awt.X11.XToolkit.run(XToolkit.java:548)
	at sun.awt.X11.XToolkit.run(XToolkit.java:523)
	at java.lang.Thread.run(Thread.java:619)
"Java2D Queue Flusher" daemon prio=10 tid=0x08225400 nid=0x4f4b in Object.wait() [0xb1cbb000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at sun.java2d.opengl.OGLRenderQueue$QueueFlusher.run(OGLRenderQueue.java:176)
	- locked <0x548bce98> (a sun.java2d.opengl.OGLRenderQueue$QueueFlusher)
"Java2D Disposer" daemon prio=10 tid=0x081a6000 nid=0x4f4a in Object.wait() [0xb1d25000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
	- locked <0x5483c748> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
	at sun.java2d.Disposer.run(Disposer.java:125)
	at java.lang.Thread.run(Thread.java:619)
"Low Memory Detector" daemon prio=10 tid=0x080ca400 nid=0x4f48 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE
"CompilerThread0" daemon prio=10 tid=0x080c7000 nid=0x4f47 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=10 tid=0x080c5800 nid=0x4f46 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=10 tid=0x08081400 nid=0x4f45 in Object.wait() [0xb4dae000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
	- locked <0x546ab1c0> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
"Reference Handler" daemon prio=10 tid=0x0807fc00 nid=0x4f44 in Object.wait() [0xb4dff000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:485)
	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
	- locked <0x546ab248> (a java.lang.ref.Reference$Lock)
"VM Thread" prio=10 tid=0x0807e000 nid=0x4f43 runnable 
"VM Periodic Task Thread" prio=10 tid=0x080de000 nid=0x4f49 waiting on condition 
JNI global references: 5128
Heap
 def new generation   total 1728K, used 1395K [0x4f760000, 0x4f930000, 0x54620000)
  eden space 1600K,  84% used [0x4f760000, 0x4f8b0058, 0x4f8f0000)
  from space 128K,  40% used [0x4f8f0000, 0x4f8fcd20, 0x4f910000)
  to   space 128K,   0% used [0x4f910000, 0x4f910000, 0x4f930000)
 tenured generation   total 21676K, used 21438K [0x54620000, 0x55b4b000, 0x8f760000)
   the space 21676K,  98% used [0x54620000, 0x55b0fa00, 0x55b0fa00, 0x55b4b000)
 compacting perm gen  total 12288K, used 7164K [0x8f760000, 0x90360000, 0x93760000)
   the space 12288K,  58% used [0x8f760000, 0x8fe5f1e8, 0x8fe5f200, 0x90360000)
    ro space 8192K,  74% used [0x93760000, 0x93d593f0, 0x93d59400, 0x93f60000)
    rw space 12288K,  59% used [0x93f60000, 0x946776e0, 0x94677800, 0x94b60000)
comment:9 by , 16 years ago
at least now I have a trace:
(though QUIT doesn't work everytime)
$ kill -s QUIT 29908
$ 2010-01-09 17:31:38
Full thread dump Java HotSpot(TM) Server VM (14.3-b01 mixed mode):
"OpenStreetBugs Lade-Warteschleife" prio=10 tid=0x09ddbc00 nid=0x74ee waiting on condition [0x2dafe000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at org.openstreetmap.josm.plugins.osb.OsbDownloadLoop.run(OsbDownloadLoop.java:94)
"Map Status Collector" daemon prio=10 tid=0x0a11cc00 nid=0x74ed in Object.wait() [0x2dc68000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0xa60962f8> (a org.openstreetmap.josm.gui.MapStatus$Collector) at java.lang.Object.wait(Object.java:485) at org.openstreetmap.josm.gui.MapStatus$Collector.run(MapStatus.java:148)
- locked <0xa60962f8> (a org.openstreetmap.josm.gui.MapStatus$Collector) at java.lang.Thread.run(Thread.java:619)
"DestroyJavaVM" prio=10 tid=0x2ee1f800 nid=0x74d5 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"RemoteControl HTTP Server" daemon prio=10 tid=0x2d35e800 nid=0x74ec runnable [0x2df5c000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390)
- locked <0x34a50068> (a java.net.SocksSocketImpl) at java.net.ServerSocket.implAccept(ServerSocket.java:453) at java.net.ServerSocket.accept(ServerSocket.java:421) at org.openstreetmap.josm.plugins.remotecontrol.HttpServer.run(HttpServer.java:51)
"TimerQueue" daemon prio=10 tid=0x0982a000 nid=0x74e6 in Object.wait() [0x2d6fe000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x3419bfe0> (a javax.swing.TimerQueue) at javax.swing.TimerQueue.run(TimerQueue.java:232)
- locked <0x3419bfe0> (a javax.swing.TimerQueue) at java.lang.Thread.run(Thread.java:619)
"AWT-EventQueue-0" prio=10 tid=0x2e06a400 nid=0x74e3 runnable [0x2dffe000]
java.lang.Thread.State: RUNNABLE
at org.openstreetmap.josm.actions.SplitWayAction.splitWay(SplitWayAction.java:415)
at org.openstreetmap.josm.actions.SplitWayAction.splitWay(SplitWayAction.java:288)
at org.openstreetmap.josm.actions.SplitWayAction.actionPerformed(SplitWayAction.java:197)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1633)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2839)
at javax.swing.KeyboardManager.fireBinding(KeyboardManager.java:267)
at javax.swing.KeyboardManager.fireKeyboardAction(KeyboardManager.java:216)
at javax.swing.JComponent.processKeyBindingsForAllComponents(JComponent.java:2916)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2908)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2802)
at java.awt.Component.processEvent(Component.java:6040)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
at java.awt.Component.dispatchEventImpl(Component.java:4502)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
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)
"AWT-Shutdown" prio=10 tid=0x2de0f400 nid=0x74e2 in Object.wait() [0x2e19b000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x33d57150> (a java.lang.Object) at java.lang.Object.wait(Object.java:485) at sun.awt.AWTAutoShutdown.run(AWTAutoShutdown.java:259)
- locked <0x33d57150> (a java.lang.Object) at java.lang.Thread.run(Thread.java:619)
"AWT-XAWT" daemon prio=10 tid=0x0983c000 nid=0x74e1 runnable [0x2e1ec000]
java.lang.Thread.State: RUNNABLE
at sun.awt.X11.XToolkit.waitForEvents(Native Method)
at sun.awt.X11.XToolkit.run(XToolkit.java:548)
at sun.awt.X11.XToolkit.run(XToolkit.java:523)
at java.lang.Thread.run(Thread.java:619)
"Java2D Disposer" daemon prio=10 tid=0x097b4000 nid=0x74e0 in Object.wait() [0x2e370000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x33d605c0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- locked <0x33d605c0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134) at sun.java2d.Disposer.run(Disposer.java:125) at java.lang.Thread.run(Thread.java:619)
"Low Memory Detector" daemon prio=10 tid=0x2eec0800 nid=0x74de runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
"CompilerThread1" daemon prio=10 tid=0x2eebdc00 nid=0x74dd waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"CompilerThread0" daemon prio=10 tid=0x2eebc400 nid=0x74dc waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=10 tid=0x2eebac00 nid=0x74db waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=10 tid=0x2eeab400 nid=0x74da in Object.wait() [0x2eb96000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x339762a0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- locked <0x339762a0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
"Reference Handler" daemon prio=10 tid=0x2eeaa000 nid=0x74d9 in Object.wait() [0x2ebe7000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x33976328> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:485) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x33976328> (a java.lang.ref.Reference$Lock)
"VM Thread" prio=10 tid=0x2eea6000 nid=0x74d8 runnable 
"GC task thread#0 (ParallelGC)" prio=10 tid=0x09758400 nid=0x74d6 runnable 
"GC task thread#1 (ParallelGC)" prio=10 tid=0x09759800 nid=0x74d7 runnable 
"VM Periodic Task Thread" prio=10 tid=0x2eec2800 nid=0x74df waiting on condition 
JNI global references: 3243
Heap
PSYoungGen total 35520K, used 28485K [0xa54c0000, 0xa85b0000, 0xb3840000)
eden space 30080K, 94% used [0xa54c0000,0xa7091548,0xa7220000)
from space 5440K, 0% used [0xa7220000,0xa7220000,0xa7770000)
to space 6080K, 0% used [0xa7fc0000,0xa7fc0000,0xa85b0000)
PSOldGen total 39680K, used 23299K [0x33840000, 0x35f00000, 0xa54c0000)
object space 39680K, 58% used [0x33840000,0x34f00d40,0x35f00000)
PSPermGen total 23808K, used 16695K [0x2f840000, 0x30f80000, 0x33840000)
object space 23808K, 70% used [0x2f840000,0x3088dd90,0x30f80000)
comment:11 by , 16 years ago
I think we're getting there. Code around SplitWayAction:410 looks like good candite for infinitive loop and it was added in r2764




PS: Happens also with #2785