[BUG] Крах Квика при работе скрипта

Страницы: 1
RSS
[BUG] Крах Квика при работе скрипта, версия 8.5
 
В соседних ветках много сообщений о проблемах с версией 8.5, но системы у всех сложные, грешить не понятно на что..

Вот очень простой скрипт, который рушит Квик во время торгов.
Упасть может и не сразу, поработав недолго, видимо зависит от интенсивности потока тиков.
Ошибок в скрипте нет, он элементарный. Да если бы и были ошибки, то рушиться весь Квик не должен, только скрипт.
Для 100% краха можно перезаказать данные текущей сессии. Тогда упадет сразу.

Код
local ticksIn = 0
 
function OnAllTrade(tick)
   if (math.fmod(ticksIn, 5000)==0) then
      message("OnAllTrade " .. ticksIn .. "  tick: " .. tostring(tick.trade_num))
   end
   ticksIn = ticksIn + 1
end
 
mainRun = false
 
function OnStop(flag) 
   message("OnStop")
   mainRun = false
   return 3000;
end
 
function main()
   mainRun = true
   message("main run...")
   
   local n = 0
   while mainRun do
      local ticksNum = getNumberOf("all_trades")
      if (ticksNum > 0) then
         local tick = getItem("all_trades", ticksNum - 1);
         if (math.fmod(n, 1000) == 0) then
            message("AllTrades  num: " .. ticksNum .. "  tick: " .. tostring(tick.trade_num))
         end
      end
      n = n + 1
      sleep(1)
   end
 
   message("main exit")
end
 
Тут налицо переполнение 2-х переменных: ticksIn и n

Но конечно это не должно рушить QUIK.
 
Цитата
Александр М написал:
Тут налицо переполнение 2-х переменных: ticksIn и n
Ну ежели скрипт будет работать непрерывно несколько веков, то может и переполнятся :)
 
Цитата
Latrop написал:
Ошибок в скрипте нет
Код
      local ticksNum = getNumberOf("all_trades")
      if (ticksNum > 0) then
         local tick = getItem("all_trades", ticksNum - 1);
         if (math.fmod(n, 1000) == 0) then
            message("AllTrades  num: " .. ticksNum .. "  tick: " .. tostring(tick.trade_num))
         end
      end
Не факт, что очистка ТВС не произойдет между getNumberOf и getItem, а результат второй разыменовывается без проверки на nil. Перезаказ = крэш. Не квика (должен быть), но скрипта, хотя как сейчас сделано, и нила не надо, сам грохнется, найдет почему.

Занятное наблюдение: в старом луа через пять строчек было EnterCriticalSection, а в новом их вообще нет (ну только что плюсовый рантайм добавил для своих целей). Вот и возникает вопрос, макросы синхронизации тоже что ли забыли переопределить? Или это новый дизайн такой, лок-фри по последнему слову техники (правда, интерлоков тоже чета не видать).
 
Цитата
Anton написал:
Не факт, что очистка ТВС не произойдет между getNumberOf и getItem, а результат второй разыменовывается без проверки на nil. Перезаказ = крэш. Не квика (должен быть), но скрипта, хотя как сейчас сделано, и нила не надо, сам грохнется, найдет почему.
Имелось ввиду не "Получить заново данные по сделкам", а "Перезаказать данные" - там перезапуск всего Квика происходит. Хотя не суть.
Вообще, этот сахар с сообщениями добавлен для наглядности, какой момент упадет.

Для краха достаточно и такого:
Код
public static void OnAllTrade(Tick tick) {
}
 
static bool mainRun;
public static int? OnStop(int flag) {
   message("OnStop");
   mainRun = false;
   return 3000;
}
 
public static void main() {
   mainRun = true;
   message("main run...");
 
   while (mainRun) {
      var ticksNum = getNumberOf("all_trades");
      Tick tick = getItem("all_trades", ticksNum - 1);
      Thread.Sleep(1);
   }
 
   message("main exit");
}

Упадет может и не сразу, может несколько минут продержаться во время рабочих торгов.
 
Не тот скрипт, вот чистый lua :)
Код
function OnAllTrade(tick)
end
 
mainRun = false
 
function OnStop(flag) 
   message("OnStop")
   mainRun = false
   return 3000;
end
 
function main()
   mainRun = true
   message("main run...")
   
   while mainRun do
      local ticksNum = getNumberOf("all_trades")
      local tick = getItem("all_trades", ticksNum-1)
      sleep(1)
   end
 
   message("main exit")
end
 
Цитата
Latrop написал:
В соседних ветках много сообщений о проблемах с версией 8.5, но системы у всех сложные, грешить не понятно на что..

Вот очень простой скрипт, который рушит Квик во время торгов.  
Упасть может и не сразу, поработав недолго, видимо зависит от интенсивности потока тиков.
Ошибок в скрипте нет, он элементарный. Да если бы и были ошибки, то рушиться весь Квик не должен, только скрипт.
Для 100% краха можно перезаказать данные текущей сессии. Тогда упадет сразу.

Код
   local  ticksIn  =   0 
 
 function   OnAllTrade (tick)
    if  ( math.fmod (ticksIn,  5000 ) =  =  0 )  then 
       message ( "OnAllTrade "   ..  ticksIn  ..   "  tick: "   ..  tostring(tick.trade_num))
    end 
   ticksIn  =  ticksIn  +   1 
 end 
 
mainRun  =   false 
 
 function   OnStop (flag) 
    message ( "OnStop" )
   mainRun  =   false 
    return   3000 ;
 end 
 
 function   main ()
   mainRun  =   true 
    message ( "main run..." )
   
    local  n  =   0 
    while  mainRun  do 
       local  ticksNum  =   getNumberOf ( "all_trades" )
       if  (ticksNum  >   0 )  then 
          local  tick  =   getItem ( "all_trades" , ticksNum  -   1 );
          if  ( math.fmod (n,  1000 )  =  =   0 )  then 
             message ( "AllTrades  num: "   ..  ticksNum  ..   "  tick: "   ..  tostring(tick.trade_num))
          end 
       end 
      n  =  n  +   1 
       sleep ( 1 )
    end 
 
    message ( "main exit" )
 end 
  
1) mainRun  =   false --  оператор лишний, так как если mainRun не определен, то он false
2) значение n может переполниться когда-нибудь , а вычислять остаток - долго
вот вариант без этих проблем:
-------------------------
   local  n  =   0
   while  mainRun  do
      local  ticksNum  =   getNumberOf ( "all_trades" )
      if  ticksNum  >   0   then
         local  tick  =   getItem ( "all_trades" , ticksNum  -   1 );
         if  n==0  then  message ( "AllTrades  num: "   ..  ticksNum  ..   "  tick: "   ..  tostring(tick.trade_num))  end
      end
     n  =  n  +   1  if n>=1000 then n=0   end
sleep ( 1 )
   end
------------------
проверка условия в два раза быстрее.
 
Latrop, я б сейчас вообще не очень заморачивался, как именно падает, бо там адъ внутри. Лонгджампы смешаны с исключениями, гарбидж коллектор не работает местами, стейты битые создаются и т.д. Пока версию без этих адовых косяков не выложат, ловить нечего, а дальше будем новые косяки искать.

Цитата
Николай Камынин написал:
так как если mainRun не определен, то он false
Если он не определен, то он не определен. Имеете в виду, что если он не инициализирован, то он nil, который в сравнении ведет себя аналогично false. Это не есть хорошая практика. Все эти языки придуманы, чтобы человек прочитал и понял, что происходит, не надо манглить код ради мнимой производительности, или тогда уже сразу массивы опкодов в char[] и jmp туда, вот уж летать будет (но недолго).
 
Цитата
Николай Камынин написал:
2) значение n может переполниться когда-нибудь
Это комплимент Квику, что скрипт сможет отработать безостановочно тысячи лет подряд
Мир будет на квантовых компьютерах с инопланетянами торговать, а в России будет... Квик
 
Цитата
Latrop написал:
Не тот скрипт, вот чистый lua :)
Код
   function   OnAllTrade (tick)
 end 
 
mainRun  =   false 
 
 function   OnStop (flag) 
    message ( "OnStop" )
   mainRun  =   false 
    return   3000 ;
 end 
 
 function   main ()
   mainRun  =   true 
    message ( "main run..." )
   
    while  mainRun  do 
       local  ticksNum  =   getNumberOf ( "all_trades" )
       local  tick  =   getItem ( "all_trades" , ticksNum -  1 )
       sleep ( 1 )
    end 
 
    message ( "main exit" )
 end 
  

Проблема изучается. Постараемся в ближайшее время дать ответ.
 

Добрый день,
     
      Действительно, есть синхронизационная ошибка, иногда приводящая к       сбоям. Мы исправим ошибку в ближайшем обновлении ПО. Приносим извинения за доставленные неудобства.

 
Цитата
Maria Romanova написал:
Добрый день,
     
      Действительно, есть синхронизационная ошибка, иногда приводящая к       сбоям. Мы исправим ошибку в ближайшем обновлении ПО. Приносим извинения за доставленные неудобства.
Слово "иногда" тут явно лишнее. Можно более конкретно, когда будет ближайшее обновление и что именно там планируется исправить из той кучи ошибок, что уже набралось?
 
К сожалению, назвать  точные сроки выхода новой версии затруднимся.
Примите искренние извинения за доставленные неудобства.
 
Цитата
Latrop написал:
Не тот скрипт, вот чистый lua :)
Код
   function   OnAllTrade (tick)
 end 
 
mainRun  =   false 
 
 function   OnStop (flag) 
    message ( "OnStop" )
   mainRun  =   false 
    return   3000 ;
 end 
 
 function   main ()
   mainRun  =   true 
    message ( "main run..." )
   
    while  mainRun  do 
       local  ticksNum  =   getNumberOf ( "all_trades" )
       local  tick  =   getItem ( "all_trades" , ticksNum -  1 )
       sleep ( 1 )
    end 
 
    message ( "main exit" )
 end 
  
Добрый день,
     
      Описанная в данном инциденте ошибка была исправлена в версии 8.5.2       терминала QUIK.
      Рекомендуем вам обновить версию программы.
     
      Приносим извинения за причиненные неудобства.
Страницы: 1
Читают тему
Наверх