On-line: гостей 2. Всего: 2 [подробнее..]
АвторСообщение
moderator


Пост N: 1023
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 27.09.16 15:28. Заголовок: Вопрос по реализации сервера


Павел, не могли бы вы дать некоторые пояснения по текущей реализации сервера, чтобы мне не выкапывать все подряд из исходников?
На каждого пользователя теперь открывается свой поток, так ? А что с таблицами: они, как и прежде, открываются в exclusive mode и используются всеми, или теперь у каждого пользователя свои открытые таблицы ?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 15 [только новые]


Администратор




Пост N: 3490
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 27.09.16 15:39. Заголовок: Да, для каждого поль..


Да, для каждого пользователя создается отдельный поток.
Что касается таблиц - то все осталось по-прежнему: они открываются в exclusive-режиме, один раз для всех потоков, при обработке запроса в потоке выполняется request area, затем detach area. Режим Share_Tables также поддерживается.

Спасибо: 0 
ПрофильЦитата Ответить
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.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3491
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 27.09.16 16:31. Заголовок: Мне тоже про это пис..


Мне тоже про это писали, наверное, тот же товарищ. Но я специально для такого случая делал режим буферизации этих команд, который задается настройкой с клиента:

RddInfo( RDDI_BUFKEYCOUNT, <lSet>,, [nConnection] )

и
RddInfo( RDDI_BUFKEYNO, <lSet>,, [nConnection] )

При этом запросы на сервер не передаются вообще, а значение берется из предыдущей команды. Для всяческих бровсов это должно резко уменьшить число запросов к серверу, и, по факту, если анализировать лог, действительно уменьшает. Но он ответил, что не помогло.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3492
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 27.09.16 16:45. Заголовок: Режим No_Save_WA исп..


Режим No_Save_WA используется только при открытии файла, и при выполнении блокировок. Можно, конечно, еще для него в функциях leto_SetAreaEnv() и leto_ClearAreaEnv() сделать проверку, и, если он используется, вообще ничего не делать. Но я никогда не тестировал этот режим.

Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 1025
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 27.09.16 19:05. Заголовок: Pasha пишет: Можно,..


Pasha пишет:

 цитата:
Можно, конечно, еще для него в функциях leto_SetAreaEnv() и leto_ClearAreaEnv() сделать проверку,


Там еще кое-что сделать надо - начальную установку фильтра и scope для этого режима. Я сделаю, посмотрим что выйдет.

Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 1026
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 28.09.16 13:21. Заголовок: Сделал несколько оче..


Сделал несколько очевидных поправок, но этот режим (No_Save_WA) пока не работает нормально: при закрытии файла время от времени сервер вылетает напрочь, даже без единого слова. Надо еще смотреть.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3493
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 28.09.16 14:58. Заголовок: В функции leto_SetAr..


В функции leto_SetAreaEnv надо вызывать hb_setSetDeleted( bDeleted ) и для режима No_Save_WA.
В функции leto_CloseArea надо в любом случае закрывать рабочую область.
Но мне кажется, что от этого режима будет мало толку. Узкое место здесь не небольшая разница в скорости обработки запросов на сервере, а сами эти запросы. Да и к тому же в этом режиме приходится открывать файлы в режиме shared, что само по себе плохо влияет на скорость.

Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 1027
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 28.09.16 16:00. Заголовок: Pasha пишет: Но мне..


Pasha пишет:

 цитата:
Но мне кажется, что от этого режима будет мало толку.


Может быть. Но будет интересно попробовать. Помню, что еще Przemek возмущался тем, как жестко мы обращаемся с workarea - имеется ввиду постоянный сброс ее текущего состояния при передаче в пользование очередному соединению.

Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 1028
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 30.09.16 09:16. Заголовок: Сделал еще несколько..


Сделал еще несколько правок, в первом приближении на простых тестах работает нормально. Хорошо было бы теперь протестировать. Есть у нас готовые тесты ?
Возможная польза от этого режима может ощущаться на больших файлах. APPEND BLANK, REPLACE, думаю, в любом случае будут медленнее.

Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 1030
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 03.10.16 13:54. Заголовок: Тот товарищ, что жал..


Тот товарищ, что жаловался на замедление ordkeyno() и, соответственно, отображения browse, пишет что с No_Save_WA = 1 все стало нормально. Так что подействовало!
Там у него обнаружился еще странный эффект. Он пишет, что когда в browse начальные записи выбранного диапазона, все работает быстро, а к концу - заметное замедление. Он убрал кэширование записей - поставил Cache_Records = 1 - и замедление пропало. Наверное, какие-то особенности реализации browse.

Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 1044
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 28.10.16 11:49. Заголовок: И еще по поводу No_S..


И еще по поводу No_Save_WA.
В основном режиме при любой операции с таблицей осуществляется временный ее захват соответствующим потоком, что эквивалентно блокировке таблицы - т.е., фактически, таблица блокируется при каждой операции с ней, чтения, записи или перемещения ( я ведь правильно понимаю, Павел ? ). При No_Save_WA = 1 этого не происходит, это еще один источник прироста производительности в этом режиме работы в высококонкурентных применениях (т.е. когда много пользователей активно используют одни и те же таблицы).

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

Почему такая разница ?


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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" )
т.е что бы записать и получить для соединения ограничения исполнения серверных функций.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1354
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.02.17 12:20. Заголовок: PS Использование в U..


PS
Использование в UDF функций letoUseArea(...), letoOrdCreate(...), ..., и ситуация RECOVER oError (oError недоступен) в них, не позволяет понять, что происходит в реале. Т.е., получив, nAreaID := letoUseArea(...) равным 0, не ясна причина

Спасибо: 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.


Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 10
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет