|
|
EListError под нагрузкой (1 viewing) 1 Guest
|
|
|
TOPIC: EListError под нагрузкой
|
mka
Fresh Boarder
Posts: 17
Karma: 0
|
|
EListError под нагрузкой 2012/01/19 06:35 (4 Months ago)
|
Oracle 10, AnyDac 5.0.1.1845
Работа многопоточная, но каждая конкретная транзацкия стартует, выполняется и завершается строго в одном потоке.
На простом тестовом приложении не воспроизводится.
На собранном продукте под нагрузкой воспроизводится нечасто, но достаточно регулярно (несколько раз в неделю)
07:01:48.694 T:4608 M:1467/302468/428876 Debug: Возбуждено исключение:
EListError: List index out of bounds (1)
(00032B12){Server110.bpl} [004F3B12] Classes.TList.Delete + $1A
(00032BBD){Server110.bpl} [004F3BBD] Classes.TList.Error + $2D
(00032B12){Server110.bpl} [004F3B12] Classes.TList.Delete + $1A
(000FED35){Server110.bpl} [005BFD35] Db.TCustomConnection.UnRegisterClient + $41
(000E617D){AnyDacOracle.sms} [0149717D] uADCompClient.TADCustomConnection.UnRegisterClient (Line 3616, "uADCompClient.pas" + 4) + $0
(000E6C40){AnyDacOracle.sms} [01497C40] uADCompClient.TADCustomConnection.DetachClient (Line 4187, "uADCompClient.pas" + 1) + $6
(000E85C2){AnyDacOracle.sms} [014995C2] uADCompClient.TADCustomCommand.SetPrepared (Line 5726, "uADCompClient.pas" + 60) + $9
(00042A9B){AnyDacOracle.sms} [013F3A9B] uADDatSManager.TADDatSManager.HandleNotification (Line 15987, "uADDatSManager.pas" + 4) + $4
(00029C8B){AnyDacOracle.sms} [013DAC8B] uADDatSManager.TADDatSObject.Notify (Line 2155, "uADDatSManager.pas" + 6) + $2
(00029C84){AnyDacOracle.sms} [013DAC84] uADDatSManager.TADDatSObject.Notify (Line 2153, "uADDatSManager.pas" + 4) + $4
(0002A10E){AnyDacOracle.sms} [013DB10E] uADDatSManager.TADDatSList.Notify (Line 2345, "uADDatSManager.pas" + 13) + $4
(0002AE8A){AnyDacOracle.sms} [013DBE8A] uADDatSManager.TADDatSNamedList.Notify (Line 2731, "uADDatSManager.pas" + 6) + $6
(00029C62){AnyDacOracle.sms} [013DAC62] uADDatSManager.TADDatSObject.Notify (Line 2144, "uADDatSManager.pas" + 7) + $7
(0002A307){AnyDacOracle.sms} [013DB307] uADDatSManager.TADDatSList.RemoveAt (Line 2406, "uADDatSManager.pas" + 11) + $F
(00002DC4){Server110.bpl} [004C3DC4] System.@FreeMem + $4
(00008B07){Server110.bpl} [004C9B07] System.@DynArrayClear + $33
(00008820){Server110.bpl} [004C9820] System.DynArrayClear + $0
(00008857){Server110.bpl} [004C9857] System.DynArraySetLength + $2F
(0000580A){Server110.bpl} [004C680A] System.TObject.CleanupInstance + $12
(00002DC4){Server110.bpl} [004C3DC4] System.@FreeMem + $4
(00005754){Server110.bpl} [004C6754] System.TObject.FreeInstance + $C
(000089B9){Server110.bpl} [004C99B9] System.@DynArraySetLength + $5
(0002A352){AnyDacOracle.sms} [013DB352] uADDatSManager.TADDatSList.SetCapacity (Line 2419, "uADDatSManager.pas" + 3) + $F
(0002A088){AnyDacOracle.sms} [013DB088] uADDatSManager.TADDatSList.Clear (Line 2314, "uADDatSManager.pas" + 6) + $5
(00032B4D){Server110.bpl} [004F3B4D] Classes.TList.Delete + $55
(000FED35){Server110.bpl} [005BFD35] Db.TCustomConnection.UnRegisterClient + $41
(00005936){Server110.bpl} [004C6936] System.@IsClass + $E
(000E6C4B){AnyDacOracle.sms} [01497C4B] uADCompClient.TADCustomConnection.DetachClient (Line 4188, "uADCompClient.pas" + 2) + $8
(000E888E){AnyDacOracle.sms} [0149988E] uADCompClient.TADCustomCommand.Unprepare (Line 5778, "uADCompClient.pas" + 0) + $2
(000EC2BC){AnyDacOracle.sms} [0149D2BC] uADCompClient.TADAdaptedDataSet.DoUnprepareSource (Line 7886, "uADCompClient.pas" + 13) + $8
(000ED679){AnyDacOracle.sms} [0149E679] uADCompClient.TADRdbmsDataSet.SetPrepared (Line 8838, "uADCompClient.pas" + 11) + $4
(000ED8D2){AnyDacOracle.sms} [0149E8D2] uADCompClient.TADRdbmsDataSet.Disconnect (Line 8934, "uADCompClient.pas" + 2) + $4
(000ED30C){AnyDacOracle.sms} [0149E30C] uADCompClient.TADRdbmsDataSet.Destroy (Line 8704, "uADCompClient.pas" + 2) + $6
(0000579C){Server110.bpl} [004C679C] System.TObject.Free + $8
(000F680D){AnyDacOracle.sms} [014A780D] SmsDbAnyDacU.TSmsCustomAnyDacConnection.DataReaderBeforeDestroy (Line 403, "..\..\SmsDbAnyDacU.pas" + 2) + $1B
(000EFB55){AnyDacOracle.sms} [014A0B55] EventsU.TEventHandlerExWrapper.HandleEvent (Line 400, "..\..\EventsU.pas" + 1) + $D
(000EFA98){AnyDacOracle.sms} [014A0A98] EventsU.TNotifySubscribe.HandleEvent (Line 345, "..\..\EventsU.pas" + 1) + $18
(000EF744){AnyDacOracle.sms} [014A0744] EventsU.TEventSender.SendEvent (Line 272, "..\..\EventsU.pas" + 11) + $18
(000EF3FD){AnyDacOracle.sms} [014A03FD] EventsU.SendEvent (Line 185, "..\..\EventsU.pas" + 4) + $E
(000F2A5D){AnyDacOracle.sms} [014A3A5D] SmsDbDataSetReaderU.TSmsDbDataReader.DoBeforeDestroy (Line 344, "..\..\SmsDbDataSetReaderU.pas" + 1) + $E
(000F2C83){AnyDacOracle.sms} [014A3C83] SmsDbDataSetReaderU.TSmsDbDataReader.MoveNext (Line 400, "..\..\SmsDbDataSetReaderU.pas" + 20) + $5
(00005BA9){Server110.bpl} [004C6BA9] System.@AfterConstruction + $1D
(00002E17){Server110.bpl} [004C3E17] System.@ReallocMem + $3F
(00032EC4){Server110.bpl} [004F3EC4] Classes.TList.SetCapacity + $30
(00009332){Server110.bpl} [004CA332] System.TInterfacedObject._AddRef + $A
(00009348){Server110.bpl} [004CA348] System.TInterfacedObject._Release + $C
(000EE838){AnyDacOracle.sms} [0149F838] CommonClassesU.TUniInterfacedObject.DoRelease (Line 884, "..\..\CommonClassesU.pas" + 1) + $4
(00002E17){Server110.bpl} [004C3E17] System.@ReallocMem + $3F
(00032EC4){Server110.bpl} [004F3EC4] Classes.TList.SetCapacity + $30
(00009332){Server110.bpl} [004CA332] System.TInterfacedObject._AddRef + $A
(000EE838){AnyDacOracle.sms} [0149F838] CommonClassesU.TUniInterfacedObject.DoRelease (Line 884, "..\..\CommonClassesU.pas" + 1) + $4
(000EEA01){AnyDacOracle.sms} [0149FA01] CommonClassesU.TUniInterfacedObject._Release (Line 970, "..\..\CommonClassesU.pas" + 4) + $4
(00009348){Server110.bpl} [004CA348] System.TInterfacedObject._Release + $C
(00009264){Server110.bpl} [004CA264] System.@IntfClear + $10
(00032A2F){DBProvider.sms} [01623A2F] EventsU.Subscribe (Line 129, "..\..\EventsU.pas" + 2) + $20
(0004C5D8){TrendService.sms} [02C5D5D8] CommonClassesU.TUniInterfacedObject.DoRelease (Line 884, "..\..\..\Common\CommonClassesU.pas" + 1) + $4
(000EE800){AnyDacOracle.sms} [0149F800] CommonClassesU.TUniInterfacedObject.DoAddRef (Line 870, "..\..\CommonClassesU.pas" + 0) + $4
(000EE999){AnyDacOracle.sms} [0149F999] CommonClassesU.TUniInterfacedObject._AddRef (Line 962, "..\..\CommonClassesU.pas" + 4) + $4
(000EE9AD){AnyDacOracle.sms} [0149F9AD] CommonClassesU.TUniInterfacedObject._AddRef (Line 963, "..\..\CommonClassesU.pas" + 5) + $10
(00009275){Server110.bpl} [004CA275] System.@IntfCopy + $9
(000F2ADD){AnyDacOracle.sms} [014A3ADD] SmsDbDataSetReaderU.TSmsDbDataReader.GetEnumerator (Line 360, "..\..\SmsDbDataSetReaderU.pas" + 5) + $C
(00053EB3){TrendService.sms} [02C64EB3] SmsStandardTrendReaderServiceU.TSmsStandardTrendReaderSevice.ReadTrendFromTable (Line 713, "SmsStandardTrendReaderServiceU.pas" + 36) + $A
(00054442){TrendService.sms} [02C65442] SmsStandardTrendReaderServiceU.TSmsStandardTrendReaderSevice.TryReadTrendValues (Line 825, "SmsStandardTrendReaderServiceU.pas" + 18) + $27
(00052E2B){TrendService.sms} [02C63E2B] SmsStandardTrendReaderServiceU.TSmsStandardTrendReaderSevice.GetTrends (Line 317, "SmsStandardTrendReaderServiceU.pas" + 8) + $11
(000FB365){InfocontPlugin.sms} [018FC365] SmsTrendServiceArchiveDataProviderU.TTrendServiceArchiveDataProvider.ReadParamValues (Line 294, "Logic\SmsTrendServiceArchiveDataProviderU.pas" + 6) + $61
(000FB265){InfocontPlugin.sms} [018FC265] SmsTrendServiceArchiveDataProviderU.TTrendServiceArchiveDataProvider.ReadParamValues (Line 273, "Logic\SmsTrendServiceArchiveDataProviderU.pas" + 10) + $40
(0012593C){InfocontPlugin.sms} [0192693C] ForwarderBaseU.TFWActualDataProvider.LoadParamValues (Line 1352, "..\Forwarder\ForwarderBaseU.pas" + 3) + $40
(00125A3F){InfocontPlugin.sms} [01926A3F] ForwarderBaseU.TFWActualDataProvider.DoGet (Line 1398, "..\Forwarder\ForwarderBaseU.pas" + 23) + $12
(00008820){Server110.bpl} [004C9820] System.DynArrayClear + $0
(00008857){Server110.bpl} [004C9857] System.DynArraySetLength + $2F
(00008820){Server110.bpl} [004C9820] System.DynArrayClear + $0
(00125567){InfocontPlugin.sms} [01926567] ForwarderBaseU.TFWDataProvider.Get (Line 1255, "..\Forwarder\ForwarderBaseU.pas" + 26) + $F
(0011BA81){InfocontPlugin.sms} [0191CA81] ForwarderU.TDataReader.Read (Line 569, "..\Forwarder\ForwarderU.pas" + 14) + $44
(000CDE56){Server110.bpl} [0058EE56] Dateutils.SecondSpan + $12
(0011B7DC){InfocontPlugin.sms} [0191C7DC] ForwarderU.TDataReader.Iteration (Line 436, "..\Forwarder\ForwarderU.pas" + 14) + $3
(0011B548){InfocontPlugin.sms} [0191C548] ForwarderU.TFWThread.Execute (Line 337, "..\Forwarder\ForwarderU.pas" + 15) + $5
(00040048){Server110.bpl} [00501048] Classes.CheckSynchronize + $20C
(00006948){Server110.bpl} [004C7948] System.@Assert + $48
|
Logged
|
|
The administrator has disabled public write access.
|
|
Support
Moderator
Posts: 4708
Karma: 68
|
|
Re:EListError под нагрузкой 2012/01/19 12:39 (4 Months ago)
|
Приветствую
Пожалуйста, прочтите:
www.da-soft.com/anydac/docu/Multi_Threading.html
Повидимому в момент изменения состояния запроса в одном потоке, происходит изменение состояния запроса в другом потоке. И оба запроса связана с одним соединением.
Сериализация должна быть обеспечена не на уровне транзакции, а на уровне соединения. Вы можете подтвердить:
1) соединение используется строго одним потоком ?
2) на протяжении жизненного цикла ADQuery соединение используется строго одним потоком ?
|
|
With best regards,
DA-SOFT Technologies Support Team
|
Logged
|
|
The administrator has disabled public write access.
|
|
mka
Fresh Boarder
Posts: 17
Karma: 0
|
|
Re:EListError под нагрузкой 2012/01/20 03:39 (4 Months ago)
|
|
Мы постарались обеспечить вот это условие
A connection object and all associated with it objects (like TADQuery, TADTransaction, etc) in each moment of time must be used by a single thread.
Самой архитектурой приложения.
Прикладной код не использует компоненты напрямую - он может только создать транзакцию (передаваемую как ссылку на интерфейс), поработать с ней и завершить ее. При этом одна транзакция исполняется строго в одном потоке и с ней связано строго одно и только одно соединение.
Соединение же в один момент времени связано либо с одной транзакцией, либо просто лежит в пуле и ничего не делает.
Соответсвенно условия 1) и 2) обеспечены.
Разумеется, мы не только пишем вам, но и проверяем свой код. Если найдется косяк на нашей стороне - сразу отпишу сюда.
|
Logged
|
|
The administrator has disabled public write access.
|
|
Support
Moderator
Posts: 4708
Karma: 68
|
|
Re:EListError под нагрузкой 2012/01/20 05:43 (4 Months ago)
|
|
Я верю, что вы приверяете свой код. Просто подобные проблемы сложны в разрешении и хочется отмести излишние гипотезы.
Вы можете обновиться до 5.0.5 и попробовать с этой версией ?
|
|
With best regards,
DA-SOFT Technologies Support Team
|
Logged
|
|
The administrator has disabled public write access.
|
|
mka
Fresh Boarder
Posts: 17
Karma: 0
|
|
Re:EListError под нагрузкой 2012/01/30 04:52 (3 Months, 3 Weeks ago)
|
Обновились до 5.0.5
Здесь симптомы иные
EAccessViolation: Access violation at address 00546906 in module 'AppServerSolid.exe'. Read of address 0000003C
(00145906){AppServerSolid.exe} [00546906] uADCompClient.TADCustomCommand.GetConnection (Line 5477, "uADCompClient.pas" + 1) + $3
Потом
EAccessViolation: Access violation at address 00546906 in module 'AppServerSolid.exe'. Read of address 0000003C
(00145906){AppServerSolid.exe} [00546906] uADCompClient.TADCustomCommand.GetConnection (Line 5477, "uADCompClient.pas" + 1) + $3
(0014CCC3){AppServerSolid.exe} [0054DCC3] uADCompClient.TADRdbmsDataSet.InternalClose (Line 8976, "uADCompClient.pas" + 1) + $A
(0010D9C6){Server110.bpl} [00AEE9C6] Db.TDataSet.CloseCursor + $3A
(00124BDF){AppServerSolid.exe} [00525BDF] uADCompDataSet.TADDataSet.SetActive (Line 1663, "uADCompDataSet.pas" + 17) + $6
(0012880B){AppServerSolid.exe} [0052980B] uADCompDataSet.TADDataSet.Disconnect (Line 3141, "uADCompDataSet.pas" + 2) + $7
(0014AEAA){AppServerSolid.exe} [0054BEAA] uADCompClient.TADAdaptedDataSet.Disconnect (Line 7775, "uADCompClient.pas" + 3) + $6
(0014CD1E){AppServerSolid.exe} [0054DD1E] uADCompClient.TADRdbmsDataSet.Disconnect (Line 8988, "uADCompClient.pas" + 1) + $6
(00144267){AppServerSolid.exe} [00545267] uADCompClient.TADCustomConnection.ReleaseClients (Line 4173, "uADCompClient.pas" + 17) + $F
(00143B58){AppServerSolid.exe} [00544B58] uADCompClient.TADCustomConnection.DoDisconnect (Line 3723, "uADCompClient.pas" + 17) + $8
(000FF07A){Server110.bpl} [00AE007A] Db.TCustomConnection.SetConnected + $72
(000FF004){Server110.bpl} [00AE0004] Db.TCustomConnection.Close + $4
(0000579C){Server110.bpl} [009E679C] System.TObject.Free + $8
(000479B5){AppServerSolid.exe} [004489B5] CommonClassesU.TUniInterfacedObject.DoRelease (Line 886, "..\..\..\Common\CommonClassesU.pas" + 3) + $7
(00047B35){AppServerSolid.exe} [00448B35] CommonClassesU.TUniInterfacedObject.ObjRelease (Line 936, "..\..\..\Common\CommonClassesU.pas" + 1) + $5
(00009264){Server110.bpl} [009EA264] System.@IntfClear + $10
(0018DCA7){AppServerSolid.exe} [0058ECA7] BalancedPoolU.TBalancedPool.Balance (Line 364, "..\..\..\Common\BalancedPoolU.pas" + 5) + $3
Создает и удаляет соединения ровно один поток - выбросивший эти исключения
|
Logged
|
|
The administrator has disabled public write access.
|
|
Support
Moderator
Posts: 4708
Karma: 68
|
|
Re:EListError под нагрузкой 2012/01/30 22:34 (3 Months, 3 Weeks ago)
|
|
Вы могли бы предоставить тестовый проект, воспроизводяющий проблему ? Пусть даже использующий сторонние библиотеки. Как вариант - приложение целиком. Если необходимо подписание NDA, то подпишем.
|
|
With best regards,
DA-SOFT Technologies Support Team
|
Logged
|
|
The administrator has disabled public write access.
|
|
mka
Fresh Boarder
Posts: 17
Karma: 0
|
|
Re:EListError под нагрузкой 2012/02/10 02:52 (3 Months, 1 Week ago)
|
К сожалению, на тестах оно (пока) не воспроизводится, только на достаточно сложной тестовой площадке продукта, предоставить которую не могу.
Мы нашли и удалили ряд собственных ошибок, продукт проработал около пяти суток и снова выдал:
EAccessViolation: Access violation at address 00496A04 in module 'Server110.bpl'. Read of address FFFFFFDC
(00005A04){Server110.bpl} [00496A04] System.TObject.InheritsFrom + $8
(00005936){Server110.bpl} [00496936] System.@IsClass + $E
(000FF0FF){Server110.bpl} [005900FF] Db.TCustomConnection.SendConnectEvent + $63
(00027854){DBProvider.sms} [016D8854] CommonClassesU.TUniInterfacedObject.ObjRelease (Line 936, "..\..\CommonClassesU.pas" + 1) + $2
(000DCF9E){AnyDacOracle.sms} [015CDF9E] uADCompClient.TADCustomConnection.GetConnected (Line 3577, "uADCompClient.pas" + 1) + $B
(000FF071){Server110.bpl} [00590071] Db.TCustomConnection.SetConnected + $69
(000DCFF7){AnyDacOracle.sms} [015CDFF7] uADCompClient.TADCustomConnection.SetConnected (Line 3652, "uADCompClient.pas" + 3) + $3
(000FF004){Server110.bpl} [00590004] Db.TCustomConnection.Close + $4
(000DBC38){AnyDacOracle.sms} [015CCC38] uADCompClient.TADCustomConnection.Destroy (Line 3068, "uADCompClient.pas" + 2) + $2
(0000579C){Server110.bpl} [0049679C] System.TObject.Free + $8
(0001C798){Server110.bpl} [004AD798] Sysutils.FreeAndNil + $8
(000ED676){AnyDacOracle.sms} [015DE676] SmsDbAnyDacU.TSmsCustomAnyDacConnection.Destroy (Line 408, "..\..\SmsDbAnyDacU.pas" + 1) + $3
(000E5625){AnyDacOracle.sms} [015D6625] CommonClassesU.TUniInterfacedObject.DoRelease (Line 886, "..\..\CommonClassesU.pas" + 3) + $6
(000E56B0){AnyDacOracle.sms} [015D66B0] CommonClassesU.TUniInterfacedObject.ObjRelease (Line 936, "..\..\CommonClassesU.pas" + 1) + $2
(00009264){Server110.bpl} [0049A264] System.@IntfClear + $10
(0004011E){DBProvider.sms} [016F111E] BalancedPoolU.TBalancedPool.RemoveAvailableItem (Line 471, "..\..\BalancedPoolU.pas" + 12) + $10
(0003FCDC){DBProvider.sms} [016F0CDC] BalancedPoolU.TBalancedPool.Balance (Line 359, "..\..\BalancedPoolU.pas" + 5) + $2
(00035DCF){DBProvider.sms} [016E6DCF] OtlTaskControl.TOmniTaskExecutor.Asy_Execute (Line 1346, "OtlTaskControl.pas" + 5) + $8
(000356B4){DBProvider.sms} [016E66B4] OtlTaskControl.TOmniTask.Execute (Line 1057, "OtlTaskControl.pas" + 10) + $10
(00009332){Server110.bpl} [0049A332] System.TInterfacedObject._AddRef + $A
(00005894){Server110.bpl} [00496894] System.TObject.GetInterface + $4C
(000058C6){Server110.bpl} [004968C6] System.TObject.GetInterface + $7E
(0000930F){Server110.bpl} [0049A30F] System.TInterfacedObject.QueryInterface + $F
(000092AA){Server110.bpl} [0049A2AA] System.@IntfCast + $12
(00039C84){DBProvider.sms} [016EAC84] OtlTaskControl.TOmniThread.Execute (Line 2628, "OtlTaskControl.pas" + 4) + $15
(000404C4){Server110.bpl} [004D14C4] Classes.CheckSynchronize + $20C
(00006948){Server110.bpl} [00497948] System.@Assert + $48
Впечатление такое, что соединение лежало в пуле (и использовалось по назначению)сутками, а потом внезапно "протухло".
PS: Это завалило наш служебный поток, который выделял новые соединения, сервер относительно успешно продолжил работу на уже имеющихся.
|
Logged
|
|
Last Edit: 2012/02/10 03:25 By mka.
|
|
The administrator has disabled public write access.
|
|
Support
Moderator
Posts: 4708
Karma: 68
|
|
Re:EListError под нагрузкой 2012/02/13 00:45 (3 Months, 1 Week ago)
|
|
К сожалению, ваш стэк вызова мало о чем говорит ... Вопросы:
1) вы используете связывание с TADConnection по ссылке (Connection) или по имени (ConnectionName) ?
2) вы 100% уверены, что каждое соединение используется только одним потоком ?
3) с TADConnection используется ли TADTransaction, TADCommand, TADEventAlerter ? Или только TADQuery ?
4) в ваших наследниках от AnyDAC компонентов, вы везде где нужно вызываете inherited методы ?
|
|
With best regards,
DA-SOFT Technologies Support Team
|
Logged
|
|
The administrator has disabled public write access.
|
|
mka
Fresh Boarder
Posts: 17
Karma: 0
|
|
Re:EListError под нагрузкой 2012/02/13 06:35 (3 Months, 1 Week ago)
|
|
1) По ссылке, ADManager не используем вообще.
2) Каждая транзакция в соединении используется одним и только одним потоком. В каждый момент времени соединение либо стоит "под парами" в пуле, либо находится в транзакции в единственном потоке. BeginTransaction/Commit выполняет этот же поток.
3) Только TADQuery и TADStoredProc
4) Мы не используем наследование от AnyDac-компонентов.
|
Logged
|
|
The administrator has disabled public write access.
|
|
Support
Moderator
Posts: 4708
Karma: 68
|
|
Re:EListError под нагрузкой 2012/02/13 07:05 (3 Months, 1 Week ago)
|
|
1) Хорошо, что обратили внимание на ADManager. Его стоит активировать до первого создания соединения многопоточным приложением.
Собственно я спрашивал про другое. Вы связываете ADQuery с ADConnection как:
a) ADQuery.ConnectionName := 'myconn';
b) ADQuery.Connection := ADConnection;
2) Попробуйте отказаться от пула соединений для тестирования. Задача - отсечь различную функциональность и получить минимальную, приводяющую в проблеме. Или выявить ту функциоанальность, которая ведет к проблеме.
4) Из стэка вызова показалось иначе. Ok.
|
|
With best regards,
DA-SOFT Technologies Support Team
|
Logged
|
|
The administrator has disabled public write access.
|
|
|
|
|
|
|
|