View Issue Details

IDProjectCategoryView StatusLast Update
0001043Far ManagerViewerpublic2011-04-15 03:37
ReportertheultramageAssigned Toalexy 
PrioritynormalSeverityminorReproducibilityN/A
Status closedResolutionfixed 
Product Version2.0 
Target VersionFixed in Version3.0 
Summary0001043: viewing a file on network share causes 40kB/s network spam of QUERY_PATH_INFO SMB requests
DescriptionAs $summary$ says. It seems the code, which polls open files for change numerous times per second, and does not distinguish between the local filesystem (says Sysinternals Process Monitor) and remote shares (says Wireshark).
Additional InformationWhile it seems like a neat idea, how cpu/hdd intensive is it to do this sort of polling? And isn't there a more efficient event mechanism to replace this polling loop?
TagsNo tags attached.
Build1934

Activities

zg

2009-09-08 03:51

developer   bugnote:0004032

[ ] Network drives autorefresh

theultramage

2009-09-08 04:36

reporter   bugnote:0004034

Last edited: 2009-09-08 04:37

View 2 revisions

This setting is unchecked (always was). The bug does not refer to refreshing of folder contents, it refers to nonstop polling for file size(?) while inside the FAR viewer/editor.

alexy

2009-09-09 01:35

administrator   bugnote:0004050

Polling for file-size should not occur in the editor, are you sure it happens there as well?

alexy

2009-09-09 01:50

administrator   bugnote:0004051

Regarding the viewer, the problem is probably the code below, what this code does is update the viewer when the file is changed - this is what gives far viewer the "tail -f" like feature.
A simple solution would be to add a check for a network drive, but I don't really like such a solution as I personaly use this "tail -f" feature on network drives.
Another solution can be to set a interval for this polling, I don't know if it is good enough though.

    case KEY_IDLE:
    {
      if(ViewFile)
      {
        string strRoot;
        GetPathRoot(strFullFileName, strRoot);
        int DriveType=FAR_GetDriveType(strRoot);
        if (DriveType!=DRIVE_REMOVABLE && !IsDriveTypeCDROM(DriveType))
        {
          FAR_FIND_DATA_EX NewViewFindData;

          if ( !apiGetFindDataEx (strFullFileName,&NewViewFindData) )
            return TRUE;

          fflush(ViewFile);
          vseek(ViewFile,0,SEEK_END);
          __int64 CurFileSize=vtell(ViewFile);
          if (ViewFindData.ftLastWriteTime.dwLowDateTime!=NewViewFindData.ftLastWriteTime.dwLowDateTime ||
              ViewFindData.ftLastWriteTime.dwHighDateTime!=NewViewFindData.ftLastWriteTime.dwHighDateTime ||
              CurFileSize!=FileSize)
          {
            ViewFindData=NewViewFindData;
            FileSize=CurFileSize;
            if (FilePos>FileSize)
              ProcessKey(KEY_CTRLEND);
            else
            {
              __int64 PrevLastPage=LastPage;
              Show();
              if (PrevLastPage && !LastPage)
              {
                ProcessKey(KEY_CTRLEND);
                LastPage=TRUE;
              }
            }
          }
        }
      }
      if (Opt.ViewerEditorClock && HostFileViewer!=NULL && HostFileViewer->IsFullScreen())
        ShowTime(FALSE);
      return(TRUE);
    }

theultramage

2009-09-10 02:56

reporter   bugnote:0004058

> Polling for file-size should not occur in the editor, are you sure it happens there as well?
Yes, my mistake, only the viewer behaves like this. Some sort of configurable polling period, or an event notification system (if exists) would be preferable.

2useven10

2011-03-26 11:51

developer  

viewer.diff (5,523 bytes)
viewer.diff (5,523 bytes)

2useven10

2011-03-26 11:55

developer   bugnote:0006567

Last edited: 2011-03-26 12:07

View 3 revisions

можно например так...
в аттаче 2 апдэйта (1043, 796).
периоды опроса пока просто зашиты в код - для DRIVE_REMOTE: один раз в секунду
ЗЫ: должны быть табы в индентах (viewer.diff) ...

2useven10

2011-03-27 04:05

developer  

viewer_10.diff (16,011 bytes)
viewer_10.diff (16,011 bytes)

2useven10

2011-03-27 04:09

developer   bugnote:0006569

Last edited: 2011-03-27 04:11

View 4 revisions

viewer_10.diff содержит все мои незакоммиченные изменения для вьювера.
не только для 1043, но также фиксы для hex-view и просмотра спец-файлов
(\\.\C: \\.\PhysicalDrive0 .....)
Просто для этих багов соответствующие мантисы закрыты...
изменения для фар2 как обычно: http://sharapov-16.narod.ru/far/index.html

DrKnS

2011-03-27 11:21

administrator   bugnote:0006570

> int shift = (int)Pointer & 0x7ff; // 2k pointer alignment for \\.\CdRom0

У новых жестких дисков сектора по 4k.

2useven10

2011-03-27 12:17

developer   bugnote:0006572

Last edited: 2011-03-27 12:38

View 2 revisions

не знал... поправлю

viewer_11.diff -- выравнивание позиционирования на 4k

DrKnS

2011-03-27 12:32

administrator   bugnote:0006574

кстати, раз мы читаем по 64к, может быть и прыгать имеет смысл на 64к-границу?
При рандомном листании читаться будут всё время одни и те же куски и (теоретически) ос может это как-то кешировать и оптимизировать.

2useven10

2011-03-27 12:36

developer  

viewer_11.diff (16,055 bytes)
viewer_11.diff (16,055 bytes)

2useven10

2011-03-27 12:41

developer   bugnote:0006575

рандомное чтение для просмотра скорее исключение, чем правило.
а при последовательном чтении поведение не изменится.
я думаю овчинка не стоит выделки (если конечно 'совсем новые' диски
не появятся с секторами по 64к :)

zg

2011-03-27 13:46

developer   bugnote:0006577

вообще-то кроме жёстких дисков существует куча всякой экзотики. закладыватся на то, что сектор будет всегда не более чем 4k мне кажется неправильным.

2useven10

2011-03-27 17:28

developer   bugnote:0006578

Last edited: 2011-03-27 17:35

View 2 revisions

Можно и конфигурить... (причем сначала размер буфера, а потом выравнивание)
Но вообще 4к - это уже размер страницы памяти (в типичном случае).
В msdn было еще упоминание и о выравнивании буфера, на размер сектора.
Но почему-то работает и без этого (возможно я просто читал старую статью).
Пока страница 4к - можно не заморачиваться (IMHO).
И кстати у флэш-драйвов 'сектор' больше чем 4к, но работать будет...
Я надеюсь (кстати кто-нибудь проверял?)

alexy

2011-03-27 17:41

administrator   bugnote:0006579

Можно же через GetDiskFreeSpace получить размер кластера.
Типа как в FTP:

static unsigned get_cluster_size(const char *fname)
{
    char root[MAX_PATH];

    if(GetFullPathName(fname, ARRAYSIZE(root), root, NULL)
            && root[1] == ':' && root[2] == '\\')
    {
        DWORD t1, t2, bps = 0, spc = 0;
        root[3] = '\0';
        spc = bps = 0;

        if(GetDiskFreeSpace(root, &spc, &bps, &t1, &t2)) return(spc*bps);
    }

    return(0);
}

2useven10

2011-03-27 17:51

developer   bugnote:0006580

Не уверен, что прокатит. Но что-нибудь вроде DeviceIoControl(GET_DRIVE_GEOMETRY...) работать будет (имя приблизительное).

zg

2011-03-27 22:26

developer   bugnote:0006581

> Пока страница 4к
вообще-то существовали windows со страницей 8k.

alexy

2011-03-28 00:56

administrator   bugnote:0006582

1934

alexy

2011-03-28 00:56

administrator   bugnote:0006583

1934

2useven10

2011-03-28 01:36

developer   bugnote:0006585

я же написал (в типичном случае). nix-ы c 8k страницами и сейчас не редкость...
но это так треп, я согласен - закладываться на 4к не стоит. код который проверяет размер сектора я уже написал - работает, но попутно я правлю вьювер - пока не закончил (надоело разбирать код, решил переписать up/down). хотел закончить с этим сегодня... не успел

2useven10

2011-03-30 12:17

developer   bugnote:0006640

общий патч: http://bugs.farmanager.com/view.php?id=1031#bugnotes

Issue History

Date Modified Username Field Change
2009-09-08 01:36 theultramage New Issue
2009-09-08 03:51 zg Note Added: 0004032
2009-09-08 04:36 theultramage Note Added: 0004034
2009-09-08 04:37 theultramage Note Edited: 0004034 View Revisions
2009-09-09 01:35 alexy Note Added: 0004050
2009-09-09 01:50 alexy Note Added: 0004051
2009-09-10 02:56 theultramage Note Added: 0004058
2010-02-15 20:09 alexy Category File System => Viewer
2010-02-15 20:09 alexy Summary opening file on network share causes 40kB/s network spam of QUERY_PATH_INFO SMB requests => viewing a file on network share causes 40kB/s network spam of QUERY_PATH_INFO SMB requests
2010-02-16 10:59 alexy Status new => assigned
2010-02-16 10:59 alexy Assigned To => alexy
2011-03-26 11:51 2useven10 File Added: viewer.diff
2011-03-26 11:55 2useven10 Note Added: 0006567
2011-03-26 11:57 2useven10 Note Edited: 0006567 View Revisions
2011-03-26 12:07 2useven10 Note Edited: 0006567 View Revisions
2011-03-27 04:05 2useven10 File Added: viewer_10.diff
2011-03-27 04:09 2useven10 Note Added: 0006569
2011-03-27 04:10 2useven10 Note Edited: 0006569 View Revisions
2011-03-27 04:10 2useven10 Note Edited: 0006569 View Revisions
2011-03-27 04:11 2useven10 Note Edited: 0006569 View Revisions
2011-03-27 11:21 DrKnS Note Added: 0006570
2011-03-27 12:17 2useven10 Note Added: 0006572
2011-03-27 12:32 DrKnS Note Added: 0006574
2011-03-27 12:36 2useven10 File Added: viewer_11.diff
2011-03-27 12:38 2useven10 Note Edited: 0006572 View Revisions
2011-03-27 12:41 2useven10 Note Added: 0006575
2011-03-27 13:46 zg Note Added: 0006577
2011-03-27 17:28 2useven10 Note Added: 0006578
2011-03-27 17:35 2useven10 Note Edited: 0006578 View Revisions
2011-03-27 17:41 alexy Note Added: 0006579
2011-03-27 17:51 2useven10 Note Added: 0006580
2011-03-27 22:26 zg Note Added: 0006581
2011-03-28 00:56 alexy Note Added: 0006582
2011-03-28 00:56 alexy Status assigned => feedback
2011-03-28 00:56 alexy Note Added: 0006583
2011-03-28 01:36 2useven10 Note Added: 0006585
2011-03-30 12:17 2useven10 Note Added: 0006640
2011-04-15 03:37 alexy Build => 1934
2011-04-15 03:37 alexy Status feedback => closed
2011-04-15 03:37 alexy Resolution open => fixed
2011-04-15 03:37 alexy Fixed in Version => 3.0