This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

Bug 250177 - Rename works too slowly (in Full Remote projects)
Summary: Rename works too slowly (in Full Remote projects)
Status: RESOLVED FIXED
Alias: None
Product: cnd
Classification: Unclassified
Component: Remote (show other bugs)
Version: 8.1
Hardware: PC Solaris
: P2 normal (vote)
Assignee: Vladimir Kvashin
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-02-03 10:26 UTC by soldatov
Modified: 2015-02-26 04:33 UTC (History)
0 users

See Also:
Issue Type: DEFECT
Exception Reporter:


Attachments
I've got a slowness report that is most likely related to this bug. Here it is. (28.71 KB, application/octet-stream)
2015-02-24 08:23 UTC, Vladimir Kvashin
Details

Note You need to log in before you can comment on or make changes to this bug.
Description soldatov 2015-02-03 10:26:59 UTC
Scenario:
- Add remote host
- Create Arguments project in Full Remote mode
- Rename args.c file in Projects tab
==> IDE updates file after big delay
Comment 1 Vladimir Kvashin 2015-02-24 08:23:49 UTC
Created attachment 152170 [details]
I've got a slowness report that is most likely related to this bug. Here it is.
Comment 2 Vladimir Kvashin 2015-02-24 08:28:45 UTC
Unfortunately this is not easy to reproduce. But today I was able to repeat; the delay was about 15-20 seconds (with the host on local network, with 0.5 ms ping).

UI is usually not frozen, just the delay after I press "enter" while renaming and before IDE reflects the change is very long.
Comment 3 Vladimir Kvashin 2015-02-24 10:24:04 UTC
The guilty thread is most likely

"LocalHistoryStore"
	at sun.misc.Unsafe.park(Unsafe.java)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
	at java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock(ReentrantReadWriteLock.java:945)
	at org.netbeans.modules.remote.impl.fs.RemoteDirectory.getDirectoryStorageImpl(RemoteDirectory.java:1115)
	at org.netbeans.modules.remote.impl.fs.RemoteDirectory.refreshDirectoryStorage(RemoteDirectory.java:563)
	at org.netbeans.modules.remote.impl.fs.RemoteDirectory.refreshImpl(RemoteDirectory.java:1665)
	at org.netbeans.modules.remote.impl.fs.RemotePlainFile.refreshImpl(RemotePlainFile.java:450)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObjectBase.refresh(RemoteFileObjectBase.java:561)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObjectBase.refresh(RemoteFileObjectBase.java:576)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObject.refresh(RemoteFileObject.java:254)
	at org.netbeans.modules.remotefs.versioning.spi.FileProxyProviderImpl$FileOperationsImpl.getInputStream(FileProxyProviderImpl.java:263)
	at org.netbeans.modules.versioning.core.api.VCSFileProxy.getInputStream(VCSFileProxy.java:361)
	at org.netbeans.modules.localhistory.utils.FileUtils.createInputStream(FileUtils.java:317)
	at org.netbeans.modules.localhistory.utils.FileUtils.copy(FileUtils.java:144)
	at org.netbeans.modules.localhistory.store.LocalHistoryStoreImpl.storeChangedSync(LocalHistoryStoreImpl.java:213)
	at org.netbeans.modules.localhistory.store.LocalHistoryStoreImpl.access$400(LocalHistoryStoreImpl.java:83)
	at org.netbeans.modules.localhistory.store.LocalHistoryStoreImpl$3.run(LocalHistoryStoreImpl.java:189)
	at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1425)
	at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:59)
	at org.openide.util.lookup.Lookups.executeWith(Lookups.java:294)
	at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2038)
Comment 4 Vladimir Kvashin 2015-02-24 17:53:49 UTC
There is a classical deadlock on 
(A) semaphore in LocalHistoryStoreImpl
(B) RemoteDirectory WriteLock

(The only reason it does not hung forever is that one of locks is aquired with 30s timeout)

1) (A) is acquired here (for old args.c file)
"ViewItemNode"
	at org.netbeans.modules.localhistory.store.LocalHistoryStoreImpl.lock(LocalHistoryStoreImpl.java:1276)
	at org.netbeans.modules.localhistory.store.LocalHistoryStoreImpl.fileChange(LocalHistoryStoreImpl.java:177)
	at org.netbeans.modules.localhistory.LocalHistoryVCSInterceptor.beforeEdit(LocalHistoryVCSInterceptor.java:280)
	at org.netbeans.modules.versioning.core.filesystems.VCSFilesystemInterceptor$DelegatingInterceptor.beforeEdit(VCSFilesystemInterceptor.java:697)
	at org.netbeans.modules.versioning.core.filesystems.VCSFilesystemInterceptor.fileLocked(VCSFilesystemInterceptor.java:381)
	at org.netbeans.modules.remotefs.versioning.spi.FilesystemInterceptorProviderImpl$FilesystemInterceptorImpl.fileLocked(FilesystemInterceptorProviderImpl.java:251)
	at org.netbeans.modules.remote.impl.fs.RemotePlainFile.lockImpl(RemotePlainFile.java:394)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObjectBase.lock(RemoteFileObjectBase.java:619)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObject.lock(RemoteFileObject.java:299)
	at org.openide.loaders.MultiDataObject$Entry.takeLock(MultiDataObject.java:1397)
	at org.openide.loaders.FileEntry.rename(FileEntry.java:95)
	at org.openide.loaders.MultiDataObject.handleRename(MultiDataObject.java:636)
	at org.openide.loaders.DataObject$1Op.run(DataObject.java:821)
	at org.openide.loaders.DataObject$1WrapRun.run(DataObject.java:1031)
	at org.openide.loaders.DataObjectPool$1WrapAtomicAction.run(DataObjectPool.java:261)
	at org.openide.filesystems.EventControl.runAtomicAction(EventControl.java:127)
	at org.openide.filesystems.FileSystem.runAtomicAction(FileSystem.java:499)
	at org.openide.loaders.DataObjectPool.runAtomicAction(DataObjectPool.java:286)
	at org.openide.loaders.DataObject.invokeAtomicAction(DataObject.java:1051)
	at org.openide.loaders.DataObject.rename(DataObject.java:836)
	at org.netbeans.modules.cnd.refactoring.support.RenameHandlerImpl.handleRename(RenameHandlerImpl.java:89)
	at org.netbeans.modules.cnd.source.SourceDataNode.setName(SourceDataNode.java:106)
	at org.openide.nodes.FilterNode.setName(FilterNode.java:494)
	at org.netbeans.modules.cnd.makeproject.ui.ViewItemNode.access$401(ViewItemNode.java:99)
	at org.netbeans.modules.cnd.makeproject.ui.ViewItemNode$2.run(ViewItemNode.java:155)
	at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1425)
	at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:59)
	at org.openide.util.lookup.Lookups.executeWith(Lookups.java:294)
	at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2038)

2) Then we two threads come simultaneously:
"ViewItemNode"
	at org.netbeans.modules.remote.impl.fs.RemoteDirectory.renameChild(RemoteDirectory.java:773)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObjectBase.renameImpl(RemoteFileObjectBase.java:692)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObjectBase.rename(RemoteFileObjectBase.java:655)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObject.rename(RemoteFileObject.java:239)
	at org.openide.loaders.FileEntry.rename(FileEntry.java:97)
	at org.openide.loaders.MultiDataObject.handleRename(MultiDataObject.java:636)
	at org.openide.loaders.DataObject$1Op.run(DataObject.java:821)
	at org.openide.loaders.DataObject$1WrapRun.run(DataObject.java:1031)
	at org.openide.loaders.DataObjectPool$1WrapAtomicAction.run(DataObjectPool.java:261)
	at org.openide.filesystems.EventControl.runAtomicAction(EventControl.java:127)
	at org.openide.filesystems.FileSystem.runAtomicAction(FileSystem.java:499)
	at org.openide.loaders.DataObjectPool.runAtomicAction(DataObjectPool.java:286)
	at org.openide.loaders.DataObject.invokeAtomicAction(DataObject.java:1051)
	at org.openide.loaders.DataObject.rename(DataObject.java:836)
	at org.netbeans.modules.cnd.refactoring.support.RenameHandlerImpl.handleRename(RenameHandlerImpl.java:89)
	at org.netbeans.modules.cnd.source.SourceDataNode.setName(SourceDataNode.java:106)
	at org.openide.nodes.FilterNode.setName(FilterNode.java:494)
	at org.netbeans.modules.cnd.makeproject.ui.ViewItemNode.access$401(ViewItemNode.java:99)
	at org.netbeans.modules.cnd.makeproject.ui.ViewItemNode$2.run(ViewItemNode.java:155)
	at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1425)
	at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:59)
	at org.openide.util.lookup.Lookups.executeWith(Lookups.java:294)
	at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2038)
and
"LocalHistoryStore"
	at org.netbeans.modules.localhistory.store.LocalHistoryStoreImpl.storeChangedSync(LocalHistoryStoreImpl.java:213)
	at org.netbeans.modules.localhistory.store.LocalHistoryStoreImpl.access$400(LocalHistoryStoreImpl.java:83)
	at org.netbeans.modules.localhistory.store.LocalHistoryStoreImpl$3.run(LocalHistoryStoreImpl.java:189)
	at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1425)
	at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:59)
	at org.openide.util.lookup.Lookups.executeWith(Lookups.java:294)
	at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2038)


Resuming 1-st one ("ViewItemNode" - RemoteDirectory.renameChild(RemoteDirectory.java:773)), then 2-nd one ("LocalHistoryStore")

3) So we get the following situation

"ViewItemNode" tries to acquire (A), while acquired (B)
	at org.netbeans.modules.localhistory.store.LocalHistoryStoreImpl.waitForProcessedStoring(LocalHistoryStoreImpl.java:1246)
	at org.netbeans.modules.localhistory.LocalHistoryVCSInterceptor.beforeMove(LocalHistoryVCSInterceptor.java:158)
	at org.netbeans.modules.versioning.core.filesystems.VCSFilesystemInterceptor$DelegatingInterceptor.beforeMove(VCSFilesystemInterceptor.java:642)
	at org.netbeans.modules.versioning.core.filesystems.VCSFilesystemInterceptor.getMoveHandlerIntern(VCSFilesystemInterceptor.java:341)
	at org.netbeans.modules.versioning.core.filesystems.VCSFilesystemInterceptor.getRenameHandler(VCSFilesystemInterceptor.java:336)
	at org.netbeans.modules.remotefs.versioning.spi.FilesystemInterceptorProviderImpl$FilesystemInterceptorImpl.getRenameHandler(FilesystemInterceptorProviderImpl.java:193)
	at org.netbeans.modules.remote.impl.fs.RemoteDirectory.renameChild(RemoteDirectory.java:793)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObjectBase.renameImpl(RemoteFileObjectBase.java:692)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObjectBase.rename(RemoteFileObjectBase.java:655)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObject.rename(RemoteFileObject.java:239)
	at org.openide.loaders.FileEntry.rename(FileEntry.java:97)
	at org.openide.loaders.MultiDataObject.handleRename(MultiDataObject.java:636)
	at org.openide.loaders.DataObject$1Op.run(DataObject.java:821)
	at org.openide.loaders.DataObject$1WrapRun.run(DataObject.java:1031)
	at org.openide.loaders.DataObjectPool$1WrapAtomicAction.run(DataObjectPool.java:261)
	at org.openide.filesystems.EventControl.runAtomicAction(EventControl.java:127)
	at org.openide.filesystems.FileSystem.runAtomicAction(FileSystem.java:499)
	at org.openide.loaders.DataObjectPool.runAtomicAction(DataObjectPool.java:286)
	at org.openide.loaders.DataObject.invokeAtomicAction(DataObject.java:1051)
	at org.openide.loaders.DataObject.rename(DataObject.java:836)
	at org.netbeans.modules.cnd.refactoring.support.RenameHandlerImpl.handleRename(RenameHandlerImpl.java:89)
	at org.netbeans.modules.cnd.source.SourceDataNode.setName(SourceDataNode.java:106)
	at org.openide.nodes.FilterNode.setName(FilterNode.java:494)
	at org.netbeans.modules.cnd.makeproject.ui.ViewItemNode.access$401(ViewItemNode.java:99)
	at org.netbeans.modules.cnd.makeproject.ui.ViewItemNode$2.run(ViewItemNode.java:155)
	at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1425)
	at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:59)
	at org.openide.util.lookup.Lookups.executeWith(Lookups.java:294)
	at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2038)

"LocalHistoryStore" tries to acquire (B), while acquired (A)
	at sun.misc.Unsafe.park(Unsafe.java)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
	at java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock(ReentrantReadWriteLock.java:945)
	at org.netbeans.modules.remote.impl.fs.RemoteDirectory.getDirectoryStorageImpl(RemoteDirectory.java:1115)
	at org.netbeans.modules.remote.impl.fs.RemoteDirectory.refreshDirectoryStorage(RemoteDirectory.java:563)
	at org.netbeans.modules.remote.impl.fs.RemoteDirectory.refreshImpl(RemoteDirectory.java:1665)
	at org.netbeans.modules.remote.impl.fs.RemotePlainFile.refreshImpl(RemotePlainFile.java:450)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObjectBase.refresh(RemoteFileObjectBase.java:561)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObjectBase.refresh(RemoteFileObjectBase.java:576)
	at org.netbeans.modules.remote.impl.fs.RemoteFileObject.refresh(RemoteFileObject.java:254)
	at org.netbeans.modules.remotefs.versioning.spi.FileProxyProviderImpl$FileOperationsImpl.getInputStream(FileProxyProviderImpl.java:263)
	at org.netbeans.modules.versioning.core.api.VCSFileProxy.getInputStream(VCSFileProxy.java:361)
	at org.netbeans.modules.localhistory.utils.FileUtils.createInputStream(FileUtils.java:317)
	at org.netbeans.modules.localhistory.utils.FileUtils.copy(FileUtils.java:144)
	at org.netbeans.modules.localhistory.store.LocalHistoryStoreImpl.storeChangedSync(LocalHistoryStoreImpl.java:213)
	at org.netbeans.modules.localhistory.store.LocalHistoryStoreImpl.access$400(LocalHistoryStoreImpl.java:83)
	at org.netbeans.modules.localhistory.store.LocalHistoryStoreImpl$3.run(LocalHistoryStoreImpl.java:189)
	at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1425)
	at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:59)
	at org.openide.util.lookup.Lookups.executeWith(Lookups.java:294)
	at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2038)
Comment 6 Quality Engineering 2015-02-26 04:33:55 UTC
Integrated into 'main-silver', will be available in build *201502260001* on http://bits.netbeans.org/dev/nightly/ (upload may still be in progress)

Changeset: http://hg.netbeans.org/main-silver/rev/c35ed7880985
User: Vladimir Kvashin <vkvashin@netbeans.org>
Log: fixed #250177 - Rename works too slowly (in Full Remote projects)