Open volksman opened 8 years ago
Any updates on this?
Is there an option that can be provided to tell the sidebar to refresh at a faster interval?
Still an issue with updates:
macOS 10.12.4 ST3 build 3128 OpenSSH_7.4p1, LibreSSL 2.5.0 OSXFUSE 3.5.6
I've looking for a solution since 2016... Still an issue for me and I have to restart sublime every time to refresh directories.
macOS 10.13.3 ST3 build 3143 OpenSSH_7.6p1, LibreSSL 2.6.2 OSXFUSE 3.7.1
I would pay to have this fixed. :(
same problem here...
come join the pity party... :) https://forum.sublimetext.com/t/file-tree-reload/22649/20
Still experiencing this issue. The directory tree takes a long time to load, and new files created on remote don't show up in sublime.
Same here. It also seems to persist even after I quit and restart sublime, which was not the case for @volksman.
2021... I've been dealing with this issue for 5 years it seems like
@ddarbyson yep...would gladly put a bounty on this if I could.
i've tried many SSHFS mount settings, toying with ST3 settings, nothing.
Today I saw this https://github.com/mutagen-io/mutagen but it's going to take time to get into it and see if it's good.
@volksman try https://mutagen.io ...it's nuts. I can't believe there's finally a real solution for remote development which is as fast as local. Cya SSHFS!
thanks! not the place to ask questions but it seems like mutagen will make local copies of the remote and I don't want any local files unless they are strictly temporary.
I have the same issues as @volksman. I make heavy use of SSHFS's ability to navigate file structures while only transferring the data that needs to be accessed.
Sublime Text is very explicitly designed to scan and cache lots of info, to make things works "instantly".
Goto File is powered by creating an in-memory representation of the entire folder tree(s) opened in the side bar, and allowing the use to filter through those with no lag by fuzzy mapping on the file paths.
The symbol index scans the contents of your entire folder tree(s) and records every location of a symbol (function name, class name, etc) so users can jump to the definition of a symbol without having to know what file it is in, or what line it is on.
The side bar keeps itself up to date, and reflects changes in the folder tree(s) by listening to filesystem events, and updating the in-memory representation of the tree.
In ST4 builds, the crawler also indexes file contents to provide auto complete suggestions based on existing code.
More or less, that major features of Sublime Text are built to heavy cache things in memory so the user can immediately navigate around. This is fundamentally opposed with the desire to "only transferring the data that needs to be accessed".
All that to say, there are likely some edge cases we can fix. However, remote FS issues are probably going to be lower priority because slow filesystems and filesystems that don't reliably send FS notifications aren't things we are every going to be able to solve ourselves.
Something like mutagen that creates a local cache and keeps things in sync seems like it is going to be more successful than trying to work around the edge cases of using a slow remote filesystem.
One other thing you could try is https://www.expandrive.com/desktop/. Mostly just to see if alternative implementations of remote access suffer from the same symptoms. I don't believe it caches an entire tree locally, however I can't imagine it can provide filesystem notifications over an SSH connection.
Comparing different client programs (such as Sublime Text versus Finder) is problematic since they have different problems to solve. Finder needs to keep the current folder refreshed, whereas Sublime Text needs to keep entire trees refreshed. Finder may fall back to polling, whereas we don't want to be constantly polling every folder in a tree.
The long refreshes would need more time to pin down. It could easily be that queued operations on the folder tree are preventing the refresh from executing quickly.
Hi @wbond thanks for the detailed response. I completely understand the issue you are explaining however:
1) As mentioned in the report, if I quit ST3 and reopen it the tree is drawn as I expect (with recent changes etc) and I assume the GotoFile cache is updated as it should be as well. This isn't an issue of the "auto-refresh" not working, that's an issue too but not the issue at hand. The issue at hand is that if I right click or use the menu item to "Refresh" (IE explicitly ask to refresh) the side bar it basically hangs for upwards of 5 minutes as it tries to refresh it. The fastest way to get a fresh tree or reflect changes is to quit ST3 and re-open it immediately and that saves me time but causes disruption to process flow.
2) I have tried using other mounting mechanism apps like ExpanDrive and one other I forget the name of now. Both used the same underlying Fuse plugin to mount the remote system and provides no additional help in this issue.
What I would like to see is that if I select a subfolder of a project and hit "Refresh" only that subfolder is scanned for changes not the entire project as I suspect that is part of the problem on large projects.
I think it would also be of benefit to have a "Rebuild" option that would do the same thing as what happens when I close ST3 and re-open it, under which I'm assuming the cache is destroyed and rebuilt rather than scanned for changes, which again under more assumptions however, is part of the issue.
If this was really just an issue of slow FS then quitting and re-opening ST3 would suffer from the same/similar delay, it does not, so I'm left to believe this is a problem with how the cache is managed.
Thanks again for your attention on this. Would love to help fix this one!
As mentioned in the report, if I quit ST3 and reopen it the tree is drawn as I expect (with recent changes etc) and I assume the GotoFile cache is updated as it should be as well. This isn't an issue of the "auto-refresh" not working, that's an issue too but not the issue at hand. The issue at hand is that if I right click or use the menu item to "Refresh" (IE explicitly ask to refresh) the side bar it basically hangs for upwards of 5 minutes as it tries to refresh it. The fastest way to get a fresh tree or reflect changes is to quit ST3 and re-open it immediately and that saves me time but causes disruption to process flow.
It may be that the queue of remote FS commands is preventing an immediate refresh.
I have tried using other mounting mechanism apps like ExpanDrive and one other I forget the name of now. Both used the same underlying Fuse plugin to mount the remote system and provides no additional help in this issue.
That leads me to believe the nature of using a non-caching remote FS is probably not going to work "well".
What I would like to see is that if I select a subfolder of a project and hit "Refresh" only that subfolder is scanned for changes not the entire project as I suspect that is part of the problem on large projects.
If the reason the subfolder isn't being refreshed is a backlogged queue, I suspect this won't help.
If this was really just an issue of slow FS then quitting and re-opening ST3 would suffer from the same/similar delay, it does not, so I'm left to believe this is a problem with how the cache is managed.
Not if the FS layer is what is backlogged.
If you could look into getting debug info as to what the FS layer is doing at a given time, so see what ST is asking for and what commands the FS layer is sending to the remote system, that would probably help pinpoint if the issue is that we are being given results and mishandling them, or if the FS layer isn't giving us an answer in a timely manner.
Not if the FS layer is what is backlogged.
Definitely know very little if anything at all about FS queues, however, if I have 1 file open for edit and ST3 isn't trying to sync, what traffic/backlogs would be present? I don't have any other apps accessing these trees (other than the OS) and from what you have told me SSHFS doesn't do update notification or things of that nature, so what else would cause a delay in there (and keeping in mind this is a significant delay...into minutes, not just a few seconds)?
If you could look into getting debug info as to what the FS layer is doing at a given time, so see what ST is asking for and what commands the FS layer is sending to the remote system, that would probably help pinpoint if the issue is that we are being given results and mishandling them, or if the FS layer isn't giving us an answer in a timely manner.
Would love to! Any idea how? :)
Have you disabled indexing? That reads the entire contents in your folder tree, which could easily cause a backlog.
I personally don’t know how the fuse SSHFS works, so I would just be using Google like anyone else.
I found the -d flag for SSHFS to provide some output, so I'll try to get some details with that.
Disabled indexing where, ST3?
Disabled indexing where, ST3?
Yes. Open the Preferences and change index_files
to false.
Gotta run for a bit but I've made that change and quick switched to a large project. No real difference. However with SSHFS debug on I see that it's not doing anything other than receiving the odd DELETE/FORGET call. I'm going to let this run its course and see if it starts rendering the tree but so far I only see the top node and the loading animation.
Also just an additional note: As ST3 is having issues rendering the tree, I opened a Finder and started browsing around the same tree. Absolutely no delay or issues, opened a file or two for editing in another app, no problems.
I believe I also tested this in Atom ages ago but Atom made me sad. That said I don't believe it suffered from this issue if memory serves, which, sometimes does not.
At the very least, we are on a path to determining what is going on, so that is good!
Ok one last update....I just noticed that the LOOKUP calls that SSHFS is making is for the project I'm switching AWAY from not the project I'm switching to. So as I sit with Project2 tree not displaying (but showing the loading icon), it seems ST3 is trying to update its cache for Project1 which is no longer in scope.
So I let it run it's course and it took about 25 minutes to show me the tree for Project2. All the while in the SSHFS debug I was seeing things like this:
LOOKUP /realtive/path/to/file
getattr /realtive/path/to/file
NODEID: 67762
unique: 190, success, outsize: 160
unique: 276, opcode: FORGET (2), nodeid: 66633, insize: 48, pid: 0
FORGET 66633/1
DELETE: 66633
unique: 278, opcode: FORGET (2), nodeid: 66634, insize: 48, pid: 0
FORGET 66634/1
DELETE: 66634
unique: 96, opcode: FORGET (2), nodeid: 66635, insize: 48, pid: 0
FORGET 66635/1
DELETE: 66635
unique: 98, opcode: FORGET (2), nodeid: 66636, insize: 48, pid: 0
FORGET 66636/1
DELETE: 66636
unique: 188, opcode: FORGET (2), nodeid: 66637, insize: 48, pid: 0
FORGET 66637/1
DELETE: 66637
Sorry but the path includes my clients name so I've omitted the actual path. It is important and strange to note that the paths were ALL for Project1 not Project2 and at no time did I see anything in the SSHFS logs for Project2, so I think I'm still only seeing half the story here.
I would expect a debug log to mention listing any dirs that exist in the sidebar of Sublime Text, or else the debugging must have been started after Sublime Text, or the debug level isn't high enough.
My bad. I didn't enable SSHFS debug on the mount for Project2. Both projects are on different servers so different SSHFS mounts.
From all the debug output this still seems to me to be an ST3 issue and not a queuing issue. The fact that when switching projects the old project continues to poll the FS for hours after tells me there is something else going on here. I setup debug on both mounts and there are no errors and seemingly no delays. The OS can access all mounts and any changes as soon as they are made on the remote (no blocking).
I had noticed anecdotally in the past that the more I switched between projects the laggier it got, leading to a quit and restart to solve all problems. The reality is however that it's there after the very first switch or "open" of a project after another project was already open.
So are you suggesting that there is a thread limit within ST3 that may create a block? Otherwise I'm not sure where an FS level block or queue would come into play here.
If you can share the debug log after changing files paths, that would be helpful.
The reason I ask for this is that I haven’t run into such issues with Expandrive over SFTP before.
I just left my office for about 45 minutes and on return the old project is still querying and deleting items. The new is still querying and loading items. Again, if I quit and restart the old is gone and not touched, the new loads immediately.
Old output:
unique: 29, opcode: LOOKUP (1), nodeid: 64679, insize: 61, pid: 5342
LOOKUP /src/project/project/templates/admin/association_api/softwarebuildstaging
getattr /src/project/project/templates/admin/association_api/softwarebuildstaging
unique: 10, success, outsize: 120
unique: 23, opcode: READDIR (28), nodeid: 64368, insize: 80, pid: 5342
unique: 23, success, outsize: 16
unique: 32, opcode: RELEASEDIR (29), nodeid: 64368, insize: 64, pid: 5342
releasedir[0] flags: 0x0
unique: 32, success, outsize: 16
unique: 22, opcode: LOOKUP (1), nodeid: 64368, insize: 54, pid: 5342
LOOKUP /src/project/apps/reporting/crons/tps_report.sh
getattr /src/project/apps/reporting/crons/tps_report.sh
NODEID: 64680
unique: 22, success, outsize: 160
unique: 9, opcode: FORGET (2), nodeid: 61831, insize: 48, pid: 0
FORGET 61831/1
DELETE: 61831
unique: 4, opcode: GETATTR (3), nodeid: 509, insize: 56, pid: 5342
getattr /src/project/depricated/deploy/configs
NODEID: 64681
unique: 29, success, outsize: 160
unique: 20, opcode: FORGET (2), nodeid: 61827, insize: 48, pid: 0
FORGET 61827/1
DELETE: 61827
unique: 12, opcode: OPENDIR (27), nodeid: 64681, insize: 48, pid: 5342
opendir flags: 0x0 /src/project/project/templates/admin/association_api/softwarebuildstaging
opendir[0] flags: 0x0 /src/project/project/templates/admin/association_api/softwarebuildstaging
unique: 12, success, outsize: 32
unique: 31, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 5342
statfs /
unique: 4, success, outsize: 136
unique: 25, opcode: OPENDIR (27), nodeid: 509, insize: 48, pid: 5342
opendir flags: 0x0 /src/project/depricated/deploy/configs
opendir[0] flags: 0x0 /src/project/depricated/deploy/configs
unique: 25, success, outsize: 32
unique: 36, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 5342
statfs /
unique: 31, success, outsize: 96
unique: 5, opcode: READDIR (28), nodeid: 64681, insize: 80, pid: 5342
readdir[0] from 0
unique: 36, success, outsize: 96
unique: 27, opcode: READDIR (28), nodeid: 509, insize: 80, pid: 5342
readdir[0] from 0
unique: 5, success, outsize: 120
unique: 8, opcode: READDIR (28), nodeid: 64681, insize: 80, pid: 5342
unique: 8, success, outsize: 16
unique: 14, opcode: RELEASEDIR (29), nodeid: 64681, insize: 64, pid: 5342
releasedir[0] flags: 0x0
unique: 14, success, outsize: 16
unique: 33, opcode: LOOKUP (1), nodeid: 64681, insize: 57, pid: 5342
LOOKUP /src/project/project/templates/admin/association_api/softwarebuildstaging/change_form.html
getattr /src/project/project/templates/admin/association_api/softwarebuildstaging/change_form.html
NODEID: 64682
unique: 33, success, outsize: 160
unique: 28, opcode: FORGET (2), nodeid: 61824, insize: 48, pid: 0
FORGET 61824/1
DELETE: 61824
unique: 30, opcode: GETATTR (3), nodeid: 168, insize: 56, pid: 5342
getattr /src/project/apps/reporting/management
unique: 30, success, outsize: 136
unique: 2, opcode: OPENDIR (27), nodeid: 168, insize: 48, pid: 5342
opendir flags: 0x0 /src/project/apps/reporting/management
opendir[0] flags: 0x0 /src/project/apps/reporting/management
unique: 2, success, outsize: 32
unique: 18, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 5342
statfs /
unique: 27, success, outsize: 152
unique: 16, opcode: READDIR (28), nodeid: 509, insize: 80, pid: 5342
unique: 16, success, outsize: 16
unique: 35, opcode: RELEASEDIR (29), nodeid: 509, insize: 64, pid: 5342
releasedir[0] flags: 0x0
unique: 35, success, outsize: 16
unique: 17, opcode: GETATTR (3), nodeid: 1981, insize: 56, pid: 5342
getattr /src/project/depricated/deploy/configs/etc
unique: 17, success, outsize: 136
unique: 19, opcode: LOOKUP (1), nodeid: 509, insize: 57, pid: 5342
LOOKUP /src/project/depricated/deploy/configs/dd-config.tar.gz
getattr /src/project/depricated/deploy/configs/dd-config.tar.gz
NODEID: 64683
unique: 19, success, outsize: 160
unique: 21, opcode: FORGET (2), nodeid: 61821, insize: 48, pid: 0
FORGET 61821/1
DELETE: 61821
unique: 3, opcode: LOOKUP (1), nodeid: 64657, insize: 55, pid: 5342
LOOKUP /src/project/depricated/deploy/configs/etc/apt/sources.list.d
getattr /src/project/depricated/deploy/configs/etc/apt/sources.list.d
unique: 18, success, outsize: 96
unique: 6, opcode: READDIR (28), nodeid: 168, insize: 80, pid: 5342
readdir[0] from 0
NODEID: 64684
unique: 3, success, outsize: 160
unique: 7, opcode: FORGET (2), nodeid: 61819, insize: 48, pid: 0
FORGET 61819/1
DELETE: 61819
unique: 26, opcode: OPENDIR (27), nodeid: 64684, insize: 48, pid: 5342
opendir flags: 0x0 /src/project/depricated/deploy/configs/etc/apt/sources.list.d
opendir[0] flags: 0x0 /src/project/depricated/deploy/configs/etc/apt/sources.list.d
unique: 26, success, outsize: 32
unique: 34, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 5342
statfs /
unique: 34, success, outsize: 96
unique: 15, opcode: READDIR (28), nodeid: 64684, insize: 80, pid: 5342
readdir[0] from 0
unique: 6, success, outsize: 192
unique: 13, opcode: READDIR (28), nodeid: 168, insize: 80, pid: 5342
unique: 13, success, outsize: 16
unique: 24, opcode: RELEASEDIR (29), nodeid: 168, insize: 64, pid: 5342
releasedir[0] flags: 0x0
unique: 24, success, outsize: 16
unique: 11, opcode: GETATTR (3), nodeid: 794, insize: 56, pid: 5342
getattr /src/project/apps/reporting/management/commands
unique: 11, success, outsize: 136
unique: 10, opcode: LOOKUP (1), nodeid: 168, insize: 52, pid: 5342
LOOKUP /src/project/apps/reporting/management/__pycache__
getattr /src/project/apps/reporting/management/__pycache__
NODEID: 64685
unique: 10, success, outsize: 160
unique: 23, opcode: FORGET (2), nodeid: 61667, insize: 48, pid: 0
FORGET 61667/1
DELETE: 61667
unique: 32, opcode: LOOKUP (1), nodeid: 168, insize: 52, pid: 5342
LOOKUP /src/project/apps/reporting/management/__init__.py
getattr /src/project/apps/reporting/management/__init__.py
NODEID: 64686
unique: 32, success, outsize: 160
unique: 9, opcode: FORGET (2), nodeid: 61663, insize: 48, pid: 0
FORGET 61663/1
DELETE: 61663
unique: 15, success, outsize: 120
unique: 22, opcode: READDIR (28), nodeid: 64684, insize: 80, pid: 5342
unique: 22, success, outsize: 16
unique: 29, opcode: RELEASEDIR (29), nodeid: 64684, insize: 64, pid: 5342
releasedir[0] flags: 0x0
unique: 29, success, outsize: 16
unique: 20, opcode: LOOKUP (1), nodeid: 64684, insize: 54, pid: 5342
LOOKUP /src/project/depricated/deploy/configs/etc/apt/sources.list.d/newrelic.list
getattr /src/project/depricated/deploy/configs/etc/apt/sources.list.d/newrelic.list
NODEID: 64687
unique: 20, success, outsize: 160
unique: 12, opcode: FORGET (2), nodeid: 61646, insize: 48, pid: 0
FORGET 61646/1
DELETE: 61646
unique: 4, opcode: FORGET (2), nodeid: 61573, insize: 48, pid: 0
FORGET 61573/1
DELETE: 61573
unique: 25, opcode: FORGET (2), nodeid: 61564, insize: 48, pid: 0
FORGET 61564/1
DELETE: 61564
unique: 31, opcode: FORGET (2), nodeid: 61375, insize: 48, pid: 0
FORGET 61375/1
DELETE: 61375
unique: 36, opcode: FORGET (2), nodeid: 61129, insize: 48, pid: 0
FORGET 61129/1
DELETE: 61129
unique: 5, opcode: FORGET (2), nodeid: 61104, insize: 48, pid: 0
FORGET 61104/1
DELETE: 61104
unique: 8, opcode: FORGET (2), nodeid: 61074, insize: 48, pid: 0
FORGET 61074/1
DELETE: 61074
unique: 14, opcode: FORGET (2), nodeid: 61058, insize: 48, pid: 0
FORGET 61058/1
DELETE: 61058
unique: 33, opcode: FORGET (2), nodeid: 60863, insize: 48, pid: 0
FORGET 60863/1
DELETE: 60863
unique: 28, opcode: FORGET (2), nodeid: 60752, insize: 48, pid: 0
FORGET 60752/1
DELETE: 60752
unique: 30, opcode: FORGET (2), nodeid: 60749, insize: 48, pid: 0
FORGET 60749/1
DELETE: 60749
unique: 2, opcode: FORGET (2), nodeid: 49567, insize: 48, pid: 0
FORGET 49567/1
DELETE: 49567
unique: 27, opcode: FORGET (2), nodeid: 49561, insize: 48, pid: 0
unique: 16, opcode: FORGET (2), nodeid: 49555, insize: 48, pid: 0
FORGET 49555/1
DELETE: 49555
FORGET 49561/1
DELETE: 49561
unique: 35, opcode: FORGET (2), nodeid: 49513, insize: 48, pid: 0
FORGET 49513/1
DELETE: 49513
unique: 17, opcode: FORGET (2), nodeid: 49500, insize: 48, pid: 0
FORGET 49500/1
DELETE: 49500
unique: 21, opcode: FORGET (2), nodeid: 49437, insize: 48, pid: 0
unique: 19, opcode: FORGET (2), nodeid: 49431, insize: 48, pid: 0
FORGET 49431/1
DELETE: 49431
FORGET 49437/1
DELETE: 49437
New Project output:
LOOKUP /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.po
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.po
LOOKUP /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sl
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sl
unique: 37707, opcode: LOOKUP (1), nodeid: 376460, insize: 50, pid: 6570
LOOKUP /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES
LOOKUP /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.mo
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.mo
NODEID: 376462
NODEID: 376463
unique: 37716, success, outsize: 160
unique: 37704, success, outsize: 160
unique: 37699, opcode: LOOKUP (1), nodeid: 376463, insize: 52, pid: 6568
LOOKUP /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sl/LC_MESSAGES
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sl/LC_MESSAGES
unique: 37715, opcode: GETATTR (3), nodeid: 376452, insize: 56, pid: 77
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES
unique: 37715, success, outsize: 136
unique: 37742, opcode: OPEN (14), nodeid: 376461, insize: 48, pid: 6565
open flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.mo
unique: 1778, opcode: OPEN (14), nodeid: 376462, insize: 48, pid: 6569
open flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.po
unique: 37744, opcode: OPENDIR (27), nodeid: 376443, insize: 48, pid: 5342
opendir flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pl/LC_MESSAGES
opendir[0] flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pl/LC_MESSAGES
unique: 37744, success, outsize: 32
unique: 37720, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 5342
statfs /
NODEID: 376464
unique: 37705, success, outsize: 160
NODEID: 376465
unique: 37707, success, outsize: 160
unique: 37727, opcode: LOOKUP (1), nodeid: 376464, insize: 50, pid: 6567
LOOKUP /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.mo
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.mo
unique: 1779, opcode: LOOKUP (1), nodeid: 376460, insize: 50, pid: 6571
LOOKUP /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.po
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.po
unique: 37749, opcode: OPEN (14), nodeid: 376465, insize: 48, pid: 6570
open flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.mo
NODEID: 376466
unique: 37699, success, outsize: 160
unique: 8203, opcode: LOOKUP (1), nodeid: 376466, insize: 50, pid: 6568
LOOKUP /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.mo
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.mo
open[4425709728] flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.mo
unique: 37742, success, outsize: 32
unique: 37746, opcode: READ (15), nodeid: 376461, insize: 80, pid: 6565
read[4425709728] 1142 bytes from 0 flags: 0x0
open[4602795600] flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.po
unique: 1778, success, outsize: 32
NODEID: 376467
unique: 37727, success, outsize: 160
unique: 37720, success, outsize: 96
NODEID: 376468
unique: 1779, success, outsize: 160
unique: 8215, opcode: LOOKUP (1), nodeid: 376464, insize: 50, pid: 6566
LOOKUP /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.po
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.po
open[4602974768] flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.mo
unique: 37749, success, outsize: 32
unique: 37722, opcode: READ (15), nodeid: 376462, insize: 80, pid: 6569
unique: 37717, opcode: READDIR (28), nodeid: 376443, insize: 80, pid: 5342
readdir[0] from 0
unique: 37717, success, outsize: 160
unique: 1780, opcode: READ (15), nodeid: 376465, insize: 80, pid: 6570
read[4602974768] 1345 bytes from 0 flags: 0x0
read[4602795600] 1407 bytes from 0 flags: 0x0
unique: 37755, opcode: READDIR (28), nodeid: 376443, insize: 80, pid: 5342
unique: 37755, success, outsize: 16
unique: 37741, opcode: OPEN (14), nodeid: 376467, insize: 48, pid: 6567
open flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.mo
unique: 8223, opcode: RELEASEDIR (29), nodeid: 376443, insize: 64, pid: 5342
releasedir[0] flags: 0x0
unique: 8223, success, outsize: 16
unique: 37751, opcode: OPEN (14), nodeid: 376468, insize: 48, pid: 6571
open flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.po
unique: 37762, opcode: GETATTR (3), nodeid: 376446, insize: 56, pid: 5342
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.mo
unique: 37762, success, outsize: 136
unique: 124, opcode: GETATTR (3), nodeid: 376450, insize: 56, pid: 5342
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.po
unique: 124, success, outsize: 136
unique: 37757, opcode: INTERRUPT (36), nodeid: 0, insize: 48, pid: 6568
INTERRUPT: 8203
unique: 37771, opcode: INTERRUPT (36), nodeid: 0, insize: 48, pid: 6570
INTERRUPT: 1780
unique: 37776, opcode: INTERRUPT (36), nodeid: 0, insize: 48, pid: 6571
INTERRUPT: 37751
unique: 37778, opcode: INTERRUPT (36), nodeid: 0, insize: 48, pid: 6569
INTERRUPT: 37722
unique: 8217, opcode: INTERRUPT (36), nodeid: 0, insize: 48, pid: 6566
INTERRUPT: 8215
unique: 1781, opcode: INTERRUPT (36), nodeid: 0, insize: 48, pid: 6567
INTERRUPT: 37741
unique: 1782, opcode: INTERRUPT (36), nodeid: 0, insize: 48, pid: 6565
INTERRUPT: 37746
unique: 37786, opcode: OPENDIR (27), nodeid: 376448, insize: 48, pid: 5342
opendir flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES
opendir[0] flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES
unique: 37786, success, outsize: 32
unique: 37745, opcode: OPENDIR (27), nodeid: 376452, insize: 48, pid: 5342
opendir flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES
opendir[0] flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES
unique: 37745, success, outsize: 32
unique: 37763, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 5342
statfs /
unique: 37760, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 5342
statfs /
NODEID: 376469
unique: 8203, success, outsize: 160
read[4425709728] 1142 bytes from 0
unique: 37746, success, outsize: 1158
unique: 37784, opcode: FLUSH (25), nodeid: 376461, insize: 64, pid: 6565
flush[4425709728]
lock[4425709728] F_SETLK F_UNLCK start: 0 len: 0 pid: 0
unique: 37784, success, outsize: 16
unique: 37801, opcode: RELEASE (18), nodeid: 376461, insize: 64, pid: 6565
release[4425709728] flags: 0x0
unique: 37801, success, outsize: 16
NODEID: 376470
unique: 8215, success, outsize: 160
open[4303149936] flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.mo
read[4602795600] 1407 bytes from 0
unique: 37760, success, outsize: 96
unique: 37763, success, outsize: 96
open[4800572640] flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.po
unique: 37751, success, outsize: 32
read[4602974768] 1345 bytes from 0
unique: 37722, success, outsize: 1423
unique: 37741, success, outsize: 32
unique: 37789, opcode: READDIR (28), nodeid: 376452, insize: 80, pid: 5342
unique: 1780, success, outsize: 1361
unique: 37800, opcode: READDIR (28), nodeid: 376448, insize: 80, pid: 5342
readdir[0] from 0
readdir[0] from 0
unique: 37810, opcode: FLUSH (25), nodeid: 376462, insize: 64, pid: 6569
flush[4602795600]
lock[4602795600] F_SETLK F_UNLCK start: 0 len: 0 pid: 0
unique: 37810, success, outsize: 16
unique: 37765, opcode: FLUSH (25), nodeid: 376467, insize: 64, pid: 6567
flush[4303149936]
lock[4303149936] F_SETLK F_UNLCK start: 0 len: 0 pid: 0
unique: 37765, success, outsize: 16
unique: 8221, opcode: RELEASE (18), nodeid: 376462, insize: 64, pid: 6569
unique: 37779, opcode: RELEASE (18), nodeid: 376467, insize: 64, pid: 6567
release[4602795600] flags: 0x0
release[4303149936] flags: 0x0
unique: 8221, success, outsize: 16
unique: 37779, success, outsize: 16
unique: 8218, opcode: FLUSH (25), nodeid: 376468, insize: 64, pid: 6571
flush[4800572640]
lock[4800572640] F_SETLK F_UNLCK start: 0 len: 0 pid: 0
unique: 8218, success, outsize: 16
unique: 37774, opcode: RELEASE (18), nodeid: 376468, insize: 64, pid: 6571
release[4800572640] flags: 0x0
unique: 37793, opcode: FLUSH (25), nodeid: 376465, insize: 64, pid: 6570
unique: 37774, success, outsize: 16
flush[4602974768]
lock[4602974768] F_SETLK F_UNLCK start: 0 len: 0 pid: 0
unique: 37793, success, outsize: 16
unique: 37775, opcode: RELEASE (18), nodeid: 376465, insize: 64, pid: 6570
release[4602974768] flags: 0x0
unique: 37775, success, outsize: 16
unique: 37800, success, outsize: 160
unique: 37789, success, outsize: 160
unique: 37783, opcode: READDIR (28), nodeid: 376448, insize: 80, pid: 5342
unique: 37783, success, outsize: 16
unique: 37807, opcode: READDIR (28), nodeid: 376452, insize: 80, pid: 5342
unique: 37807, success, outsize: 16
unique: 37797, opcode: RELEASEDIR (29), nodeid: 376448, insize: 64, pid: 5342
unique: 37791, opcode: RELEASEDIR (29), nodeid: 376452, insize: 64, pid: 5342
releasedir[0] flags: 0x0
releasedir[0] flags: 0x0
unique: 37791, success, outsize: 16
unique: 37797, success, outsize: 16
unique: 37826, opcode: GETATTR (3), nodeid: 376451, insize: 56, pid: 5342
unique: 37806, opcode: GETATTR (3), nodeid: 376454, insize: 56, pid: 5342
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.mo
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.mo
unique: 37826, success, outsize: 136
unique: 37806, success, outsize: 136
unique: 37802, opcode: GETATTR (3), nodeid: 376453, insize: 56, pid: 5342
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.po
unique: 37802, success, outsize: 136
unique: 37798, opcode: GETATTR (3), nodeid: 376455, insize: 56, pid: 5342
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.po
unique: 37798, success, outsize: 136
unique: 8229, opcode: OPENDIR (27), nodeid: 376457, insize: 48, pid: 5342
opendir flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES
opendir[0] flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES
unique: 8229, success, outsize: 32
unique: 37819, opcode: OPENDIR (27), nodeid: 376460, insize: 48, pid: 5342
unique: 37795, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 5342
opendir flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES
opendir[0] flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES
unique: 37819, success, outsize: 32
statfs /
unique: 37822, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 5342
statfs /
unique: 37795, success, outsize: 96
unique: 37832, opcode: READDIR (28), nodeid: 376457, insize: 80, pid: 5342
readdir[0] from 0
unique: 37822, success, outsize: 96
unique: 37842, opcode: READDIR (28), nodeid: 376460, insize: 80, pid: 5342
readdir[0] from 0
unique: 37832, success, outsize: 160
unique: 37842, success, outsize: 160
unique: 37814, opcode: READDIR (28), nodeid: 376460, insize: 80, pid: 5342
unique: 37814, success, outsize: 16
unique: 37827, opcode: READDIR (28), nodeid: 376457, insize: 80, pid: 5342
unique: 37827, success, outsize: 16
unique: 319, opcode: RELEASEDIR (29), nodeid: 376460, insize: 64, pid: 5342
releasedir[0] flags: 0x0
unique: 319, success, outsize: 16
unique: 37839, opcode: RELEASEDIR (29), nodeid: 376457, insize: 64, pid: 5342
releasedir[0] flags: 0x0
unique: 37839, success, outsize: 16
unique: 37809, opcode: GETATTR (3), nodeid: 376461, insize: 56, pid: 5342
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.mo
unique: 37844, opcode: GETATTR (3), nodeid: 376465, insize: 56, pid: 5342
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.mo
unique: 37844, success, outsize: 136
unique: 37809, success, outsize: 136
unique: 37761, opcode: GETATTR (3), nodeid: 376468, insize: 56, pid: 5342
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.po
unique: 37831, opcode: GETATTR (3), nodeid: 376462, insize: 56, pid: 5342
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.po
unique: 37831, success, outsize: 136
unique: 37761, success, outsize: 136
unique: 1787, opcode: GETATTR (3), nodeid: 376460, insize: 56, pid: 5342
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES
unique: 1787, success, outsize: 136
unique: 37859, opcode: OPENDIR (27), nodeid: 376464, insize: 48, pid: 5342
opendir flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES
opendir[0] flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES
unique: 37859, success, outsize: 32
unique: 8236, opcode: OPENDIR (27), nodeid: 376460, insize: 48, pid: 5342
opendir flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES
opendir[0] flags: 0x0 /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ru/LC_MESSAGES
unique: 8236, success, outsize: 32
unique: 37880, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 5342
statfs /
unique: 37836, opcode: STATFS (17), nodeid: 1, insize: 40, pid: 5342
statfs /
unique: 37880, success, outsize: 96
unique: 37836, success, outsize: 96
unique: 37848, opcode: READDIR (28), nodeid: 376464, insize: 80, pid: 5342
unique: 37845, opcode: READDIR (28), nodeid: 376460, insize: 80, pid: 5342
readdir[0] from 0
readdir[0] from 0
unique: 37845, success, outsize: 160
unique: 1786, opcode: READDIR (28), nodeid: 376460, insize: 80, pid: 5342
unique: 1786, success, outsize: 16
unique: 8234, opcode: RELEASEDIR (29), nodeid: 376460, insize: 64, pid: 5342
releasedir[0] flags: 0x0
unique: 8234, success, outsize: 16
unique: 37848, success, outsize: 160
unique: 37869, opcode: READDIR (28), nodeid: 376464, insize: 80, pid: 5342
unique: 37869, success, outsize: 16
unique: 37883, opcode: RELEASEDIR (29), nodeid: 376464, insize: 64, pid: 5342
releasedir[0] flags: 0x0
unique: 37883, success, outsize: 16
unique: 8237, opcode: GETATTR (3), nodeid: 376467, insize: 56, pid: 5342
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.mo
unique: 8237, success, outsize: 136
unique: 8240, opcode: GETATTR (3), nodeid: 376448, insize: 56, pid: 77
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES
unique: 8240, success, outsize: 136
unique: 37837, opcode: GETATTR (3), nodeid: 376452, insize: 56, pid: 77
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES
unique: 37837, success, outsize: 136
unique: 37875, opcode: GETATTR (3), nodeid: 376457, insize: 56, pid: 77
getattr /src/project2/project2-env/lib/python3.8/site-packages/django/contrib/contenttypes/locale/ro/LC_MESSAGES
unique: 37875, success, outsize: 136
These are just random samples out of the log. The old project will pause for a few moments but bringing the ST3 window into focus always seems to kick start it into motion again. Behaviour not seen if I quit and restart.
Seems that reloading the sidebar is faster in 4 but now there are no indicators that it's loading anything!
Would still be wiling to pay to have this fixed.
I switched to https://mutagen.io/ and never looked back.
I switched to https://mutagen.io/ and never looked back.
I guess it's time! Thanks for the reminder... :)
EDIT: I remember why I didn't like the idea of Mutagen, it creates a local replica meaning hard drive space is needed.
So I've tried both Mutagen and ExpanDrive. Mutagen just doesn't cut it...I was pretty excited about it until I switched branches. ExpanDrive seems to make things worse as far as any delays are concerned. I would switch editors but damn if Sublime isn't just that good.
Mutagen took some time to understand the best settings. There some basic setup to learn about, for me, but once I had my sessions in sync with the correct symlink and ignores in place, remote development with Mutagen local sync is blazing fast.
I'm able to use everything Sublime Text has to offer bc it's local.
What's your desired environment? Sounds like you need to work on remote files but it's too slow for Sublime to work correctly. ?
Yeah I thought I had it all dialled but changing branches on a large project caused it to re-sync everything which makes sense but takes time and just changes the issues I face with Sublime/SSHFS. It's still faster for me to quit sublime and restart it than it is to wait for all this sync'ing to happen. So annoying cause it seemed like a great alternative but not quite. Not to mention the disk space used by the replica.
My env is pretty simple. I have a bunch of remote servers I dev from. When I am working on them I simply want to SSHFS the code folders to my local and dev them. Finder sees all the changes no issues but Sublime is slow to react. Even Visual Studio sees all the changes without delay.
I have the same workflow. Always remote dev via SSH with many projects.
When you say switch branches, what exactly is changing? Are you trying to sync graphics and large file sizes?
Furthermore. With mutagen, we set Alpha to the remote and ignore image and upload directories. We have hundreds of projects so we use inverted ignore rules to manage.
There is 0 delay when we switch branches.
It’s unbelievable that this has not yet been solved in 2024.
Summary
Very slow refresh of file tree in the sidebar when using SSHFS remote mounts. Using the Project -> Refresh Folders or right click context to refresh the tree can take anywhere from 10 seconds to a couple of minutes. Closing Sublime and re-opening, the tree is updated almost instantly.
Additional details: If making a change on the remote system (via SSH) the changes appear immediately in the Finder (OSX). Making a change locally in OSX the changes are visible immediately on remote. There is no delay in SSHFS replicating changes between remote and local and vice versa. Only Sublime seems to have issues seeing them and really only when using the "refresh" tools.
Even when using the sidebar context menus to create the file or folder the changes appear in the FS immediately, but Sublime takes forever to update the tree view, again even when requested.
Expected behavior
Updates to the tree happen in real time, or even when requested using the refresh tools provided.
Actual behavior
Long delays in updating the tree, anywhere up to a couple of minutes. Quick solution is to close the app and reopen it as that always provides the changes immediately.
Steps to reproduce
Install Sublime (build doesn't seem to matter as I've had this issue since at least V3). Install osxfuse (https://osxfuse.github.io/) Install SidebarEnhancements (pretty sure this doesn't affect anything but provides the context menus).
Create a file/folder either with context in sidebar, via ssh or locally with Finder. Ask Sublime to refresh the tree.
NOTE: Some of my trees are pretty big (full python project including virtualenv files), that said, again, on reopening Sublime the entire tree is refreshed instantly.
Environment
OSX 10.11.6 SublimeText3 build 3125 (dev channel) sshfs -V SSHFS version 2.5 (OSXFUSE SSHFS 2.5.0) OSXFUSE 3.5.2 FUSE library version: 2.9.7