sublimehq / sublime_text

Issue tracker for Sublime Text
https://www.sublimetext.com
814 stars 40 forks source link

SSHFS long refresh waits #1409

Open volksman opened 8 years ago

volksman commented 8 years ago

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

jgornick commented 7 years ago

Any updates on this?

Is there an option that can be provided to tell the sidebar to refresh at a faster interval?

volksman commented 7 years ago

Still an issue with updates:

macOS 10.12.4 ST3 build 3128 OpenSSH_7.4p1, LibreSSL 2.5.0 OSXFUSE 3.5.6

chaonan99 commented 6 years ago

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

volksman commented 6 years ago

I would pay to have this fixed. :(

fpug commented 6 years ago

same problem here...

volksman commented 6 years ago

come join the pity party... :) https://forum.sublimetext.com/t/file-tree-reload/22649/20

benhannel commented 4 years ago

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.

thomasarvanitidis commented 4 years ago

Same here. It also seems to persist even after I quit and restart sublime, which was not the case for @volksman.

ddarbyson commented 3 years ago

2021... I've been dealing with this issue for 5 years it seems like

volksman commented 3 years ago

@ddarbyson yep...would gladly put a bounty on this if I could.

ddarbyson commented 3 years ago

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.

ddarbyson commented 3 years ago

@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!

volksman commented 3 years ago

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.

daeh commented 3 years ago

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.

wbond commented 3 years ago

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.

wbond commented 3 years ago

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.

volksman commented 3 years ago

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!

wbond commented 3 years ago

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.

volksman commented 3 years ago

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? :)

wbond commented 3 years ago

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.

volksman commented 3 years ago

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?

wbond commented 3 years ago

Disabled indexing where, ST3?

Yes. Open the Preferences and change index_files to false.

volksman commented 3 years ago

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.

volksman commented 3 years ago

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.

wbond commented 3 years ago

At the very least, we are on a path to determining what is going on, so that is good!

volksman commented 3 years ago

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.

volksman commented 3 years ago

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.

wbond commented 3 years ago

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.

volksman commented 3 years ago

My bad. I didn't enable SSHFS debug on the mount for Project2. Both projects are on different servers so different SSHFS mounts.

volksman commented 3 years ago

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.

wbond commented 3 years ago

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.

volksman commented 3 years ago

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.

volksman commented 3 years ago

Seems that reloading the sidebar is faster in 4 but now there are no indicators that it's loading anything!

volksman commented 3 years ago

Would still be wiling to pay to have this fixed.

ddarbyson commented 3 years ago

I switched to https://mutagen.io/ and never looked back.

volksman commented 3 years ago

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.

volksman commented 3 years ago

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.

ddarbyson commented 3 years ago

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. ?

volksman commented 3 years ago

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.

ddarbyson commented 3 years ago

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.

bounlu commented 2 months ago

It’s unbelievable that this has not yet been solved in 2024.