Автор | Сообщение |
|
| moderator
|
Пост N: 1023
Зарегистрирован: 06.07.06
|
|
Отправлено: 27.09.16 15:28. Заголовок: Вопрос по реализации сервера
Павел, не могли бы вы дать некоторые пояснения по текущей реализации сервера, чтобы мне не выкапывать все подряд из исходников? На каждого пользователя теперь открывается свой поток, так ? А что с таблицами: они, как и прежде, открываются в exclusive mode и используются всеми, или теперь у каждого пользователя свои открытые таблицы ?
|
|
|
Новых ответов нет
[см. все]
|
|
|
| Администратор
|
Пост N: 3490
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.09.16 15:39. Заголовок: Да, для каждого поль..
Да, для каждого пользователя создается отдельный поток. Что касается таблиц - то все осталось по-прежнему: они открываются в exclusive-режиме, один раз для всех потоков, при обработке запроса в потоке выполняется request area, затем detach area. Режим Share_Tables также поддерживается.
|
|
|
|
| moderator
|
Пост N: 1024
Зарегистрирован: 06.07.06
|
|
Отправлено: 27.09.16 16:13. Заголовок: Pasha пишет: Режим ..
Pasha пишет: цитата: | Режим Share_Tables также поддерживается |
| Насколько я помню, этот режим отличается от основного только тем, что таблицы открываются в том режиме (shared или exclusive), который запрошен пользователем. А вот No_Save_WA вы не пробовали ? Я его всерьез так и не тестировал. Спрашиваю вот почему. Мне на днях написали, что на большой таблице с большим числом записей в scope очень медленно работает OrdKeyNo() - по сравнению с обычным DBFCDX с файлом, открытым по сети. Думаю, тут дело в том, что нам каждый раз приходится вызывать leto_SetAreaEnv() с последующим leto_ClearAreaEnv() - при этом все внутренние буферы теряются, scope ставятся по новой и по новой пересчитывается положение текущей записи в этом scope. Теоретически мог бы помочь как раз режим No_Save_WA, но для этого, по идее, надо прописать в leto_SetAreaEnv() и leto_ClearAreaEnv() условие, чтобы они выполнялись только при !bNoSaveWA.
|
|
|
|
| Администратор
|
Пост N: 3491
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.09.16 16:31. Заголовок: Мне тоже про это пис..
Мне тоже про это писали, наверное, тот же товарищ. Но я специально для такого случая делал режим буферизации этих команд, который задается настройкой с клиента: RddInfo( RDDI_BUFKEYCOUNT, <lSet>,, [nConnection] ) и RddInfo( RDDI_BUFKEYNO, <lSet>,, [nConnection] ) При этом запросы на сервер не передаются вообще, а значение берется из предыдущей команды. Для всяческих бровсов это должно резко уменьшить число запросов к серверу, и, по факту, если анализировать лог, действительно уменьшает. Но он ответил, что не помогло.
|
|
|
|
| Администратор
|
Пост N: 3492
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.09.16 16:45. Заголовок: Режим No_Save_WA исп..
Режим No_Save_WA используется только при открытии файла, и при выполнении блокировок. Можно, конечно, еще для него в функциях leto_SetAreaEnv() и leto_ClearAreaEnv() сделать проверку, и, если он используется, вообще ничего не делать. Но я никогда не тестировал этот режим.
|
|
|
|
| moderator
|
Пост N: 1025
Зарегистрирован: 06.07.06
|
|
Отправлено: 27.09.16 19:05. Заголовок: Pasha пишет: Можно,..
Pasha пишет: цитата: | Можно, конечно, еще для него в функциях leto_SetAreaEnv() и leto_ClearAreaEnv() сделать проверку, |
| Там еще кое-что сделать надо - начальную установку фильтра и scope для этого режима. Я сделаю, посмотрим что выйдет.
|
|
|
|
| moderator
|
Пост N: 1026
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.09.16 13:21. Заголовок: Сделал несколько оче..
Сделал несколько очевидных поправок, но этот режим (No_Save_WA) пока не работает нормально: при закрытии файла время от времени сервер вылетает напрочь, даже без единого слова. Надо еще смотреть.
|
|
|
|
| Администратор
|
Пост N: 3493
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.09.16 14:58. Заголовок: В функции leto_SetAr..
В функции leto_SetAreaEnv надо вызывать hb_setSetDeleted( bDeleted ) и для режима No_Save_WA. В функции leto_CloseArea надо в любом случае закрывать рабочую область. Но мне кажется, что от этого режима будет мало толку. Узкое место здесь не небольшая разница в скорости обработки запросов на сервере, а сами эти запросы. Да и к тому же в этом режиме приходится открывать файлы в режиме shared, что само по себе плохо влияет на скорость.
|
|
|
|
| moderator
|
Пост N: 1027
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.09.16 16:00. Заголовок: Pasha пишет: Но мне..
Pasha пишет: цитата: | Но мне кажется, что от этого режима будет мало толку. |
| Может быть. Но будет интересно попробовать. Помню, что еще Przemek возмущался тем, как жестко мы обращаемся с workarea - имеется ввиду постоянный сброс ее текущего состояния при передаче в пользование очередному соединению.
|
|
|
|
| moderator
|
Пост N: 1028
Зарегистрирован: 06.07.06
|
|
Отправлено: 30.09.16 09:16. Заголовок: Сделал еще несколько..
Сделал еще несколько правок, в первом приближении на простых тестах работает нормально. Хорошо было бы теперь протестировать. Есть у нас готовые тесты ? Возможная польза от этого режима может ощущаться на больших файлах. APPEND BLANK, REPLACE, думаю, в любом случае будут медленнее.
|
|
|
|
| moderator
|
Пост N: 1030
Зарегистрирован: 06.07.06
|
|
Отправлено: 03.10.16 13:54. Заголовок: Тот товарищ, что жал..
Тот товарищ, что жаловался на замедление ordkeyno() и, соответственно, отображения browse, пишет что с No_Save_WA = 1 все стало нормально. Так что подействовало! Там у него обнаружился еще странный эффект. Он пишет, что когда в browse начальные записи выбранного диапазона, все работает быстро, а к концу - заметное замедление. Он убрал кэширование записей - поставил Cache_Records = 1 - и замедление пропало. Наверное, какие-то особенности реализации browse.
|
|
|
|
| moderator
|
Пост N: 1044
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.10.16 11:49. Заголовок: И еще по поводу No_S..
И еще по поводу No_Save_WA. В основном режиме при любой операции с таблицей осуществляется временный ее захват соответствующим потоком, что эквивалентно блокировке таблицы - т.е., фактически, таблица блокируется при каждой операции с ней, чтения, записи или перемещения ( я ведь правильно понимаю, Павел ? ). При No_Save_WA = 1 этого не происходит, это еще один источник прироста производительности в этом режиме работы в высококонкурентных применениях (т.е. когда много пользователей активно используют одни и те же таблицы).
|
|
|
|
|
| постоянный участник
|
Пост N: 1352
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.02.17 10:52. Заголовок: Нет файлов (обработк..
Нет файлов (обработка ошибок): DBFCDX 1. нет файла BEGIN SEQUENCE WITH { |e|break( e ) } USE ( "test_new" ) VIA "DBFCDX" New RECOVER USING oError ? oError:genCode,oError:osCode,oError:subCode // 21, 2, 1001 END SEQUENCE 2. в подкаталоге (каталога нет) BEGIN SEQUENCE WITH { |e|break( e ) } USE ( ".\dir\test_new" ) New RECOVER USING oError ? oError:genCode,oError:osCode,oError:subCode // 21, 3, 1001 END SEQUENCE LETO 1. нет файла BEGIN SEQUENCE WITH { |e|break( e ) } USE ( cPath + "test_new" ) New RECOVER USING oError ? oError:genCode,oError:osCode,oError:subCode // 33, 0, 1021 END SEQUENCE 2. в подкаталоге (каталога нет) BEGIN SEQUENCE WITH { |e|break( e ) } USE ( cPath + "dir/test_new" ) New RECOVER USING oError ? oError:genCode,oError:osCode,oError:subCode // 33, 0, 1021 END SEQUENCE Почему такая разница ?
|
|
|
|
| постоянный участник
|
Пост N: 1353
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.02.17 06:06. Заголовок: alkresin, Pasha Se..
alkresin, Pasha SergKis пишет Костыль, на предыдущий пост, в сервере я сделал: FUNCTION UDF_TableError ( nUserStru ) AAdd(oAppObj:aError, nUserStru) RETURN oAppObj:aError STATIC FUNCTION oErr2oApp( oErr, cFile, cTag ) LOCAL cDataPath := leto_GetAppOptions(1) If !Empty(oErr) cFile := subs(cFile, len(cDataPath)+1) If ! empty(cTag); cFile += "("+cTag+")" EndIf oAppObj:aError := { oErr:genCode, ; oErr:osCode, ; oErr:subCode, ; iif(Empty(oErr:subSystem ), "", oErr:subSystem ), ; iif(Empty(oErr:description), "", oErr:description), ; cFile, ; ProcName(1) ; } EndIf RETURN Nil сделав вызовы oErr2oApp() в ситуациях If ! lres ... функций hs_opentable, hs_ ... Можно ли получить версию сервера. что бы убрать костыль ? readme_rus.txt цитата: | LETO_USERADD( "admin", "secret:)", "YYY" ) где "YYY" это строка, которая дает права администрирования, управления и права на запись. Вы можете также использовать программу utils/manager/console.prg, чтобы установить или изменить данные авторизации. Для соединения с сервером с данными авторизации ( именем пользователя и паролем) необходимо вызвать функцию LETO_CONNECT(). |
| Можно ли добавить к YYY значения EnableFileFunc, EnableUDF для соединения ? LETO_USERADD( "admin", "secret:)", "YYY12" ) LETO_USERADD( "direktor", "12345", "YYY00" ) LETO_USERADD( "other", "55555", "YYY01" ) т.е что бы записать и получить для соединения ограничения исполнения серверных функций.
|
|
|
|
| постоянный участник
|
Пост N: 1354
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.02.17 12:20. Заголовок: PS Использование в U..
PS Использование в UDF функций letoUseArea(...), letoOrdCreate(...), ..., и ситуация RECOVER oError (oError недоступен) в них, не позволяет понять, что происходит в реале. Т.е., получив, nAreaID := letoUseArea(...) равным 0, не ясна причина
|
|
|
|
| постоянный участник
|
Пост N: 1355
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.02.17 13:28. Заголовок: PS Если сделать возм..
PS Если сделать возможность обработывать ошибки открытия, то можно добавить: STATIC FUNCTION ErrorStr(cSign, oError, cFileName) LOCAL nFlags := 0 IF oError:canDefault nFlags += EF_CANDEFAULT ENDIF IF oError:canRetry nFlags += EF_CANRETRY ENDIF IF oError:canSubstitute nFlags += EF_CANSUBSTITUTE ENDIF If ! ( oError:genCode==EG_OPEN .and. ( oError:osCode==32 .or. ; oError:osCode==3 .or. ; oError:osCode==2 ) ) WrLog( Leto_ErrorMessage( oError ) ) EndIf RETURN cSign ; ... что бы не получать лишних сообщений в log.
|
|
|
|