ЗАО «ЗЭО»

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск  

Новости:

Автор Тема: Теон-Про v2, Переполнение кэша  (Прочитано 4531 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Shkiper

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 5
Теон-Про v2, Переполнение кэша
« : 29 Сентября, 2011, 13:35:47 »

Добрый день.

Теон-Про v2. На линуксе работает программа, соберающая данные и пишущая их в файлы. Запись ведется постоянно. Со временем кэш забивается и программа виснет.
Использовал очистку кэша после закрытия очередного файла и перед созданием следующего, но тогда через небольшой промежуток веремени прекращают создаваться новые файлы. При проверке програмно свободного места (fstatvfs()) линукс утверждает, что нет свободного места. А оно есть.
Влияет ил очистка кэша на определение свободного пространства и, вообще, может ли очистка кэша повлиять на создание нового файла?
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: Теон-Про v2, Переполнение кэша
« Ответ #1 : 29 Сентября, 2011, 15:22:17 »

> линукс утверждает, что нет свободного места. А оно есть.

Как вы это определяете?
Нужен пример программы, на котором можно будет повторить/наблюдать эту проблему.
Записан

Shkiper

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 5
Re: Теон-Про v2, Переполнение кэша
« Ответ #2 : 30 Сентября, 2011, 14:41:43 »

Все программу прислать не смогу.

Вот выдержки из модуля сохранения:
....
void saveModule::createNewADCFile(quint16 _depthRecursion) // Создание нового файла
{
   
   if(_depthRecursion > 100)
   {
      fdADC = -1;
      emit RegistrationChange();
   }
   char* filePath = ((tr("%1/%2/%3.csv").arg(mountPoint).arg(ReportName).arg(fADCcounter))).toLocal8Bit().data();   //адрес файла
   bool fileExists = QFile::exists(QString(filePath));
   fdADC = -1;                                    //Файловый дескриптор для порта

   //открыть порт
   fdADC = open(filePath, O_WRONLY | O_CREAT | O_APPEND , S_IRWXU);

   // дальше идет НЕ говнокод. нужно просто призадуматься...
      // хотя нет, все-таки говнокод
   if ((fdADC == -1))
   {   
      
      if(externalDev)
      {

         mountPoint = SYSREPORTPATH;
         externalDev = false;
      }
      if (createDirTree(mountPoint, ReportName))
      {   
         fADCcounter++;
         saveADCCounter();
         createNewADCFile(_depthRecursion+1);
      }
      else
         {

         emit RegistrationChange();
         }
   }
   else
   {
      if (!fileExists)
      {
         printfADCHead();
         fdatasync(fdADC);
      }
      emit RegistrationChange();
   }
   ChannelCount = 0;
   OneLine = tr("");
}

void saveModule::closeADCFile(void) // Закрытие файла
{
   fdatasync(fdADC);
   close(fdADC);
   sync();//<<
   system(QString("echo \"1\" > /proc/sys/vm/drop_caches").toLocal8Bit().data()); //<<
   fdADC = -1;
}
.....
int  saveModule::getFreeSpacePrc(void) // Проверка и очистка места на диске
{
   
   if (fdADC == -1)
   {

      return -1;
   }
   struct statvfs diskFree; //<<

   fstatvfs (fdADC, &diskFree);


   int free = int(diskFree.f_bavail); //<<
   
   int total = int(diskFree.f_blocks);
   int Prc = (free * 100) / total;

   ///Удаляем старые файлы и отчеты, при заполнении внутренней памяти
   if ((Prc < 5) && (!externalDev))
   {   
      
      QDir reportPath(SYSREPORTPATH);
      QStringList allRepots = reportPath.entryList(QDir::Dirs|QDir::NoDotAndDotDot,QDir::Time|QDir::Reversed);
      QStringList allFilesInReport;
      if (allRepots.count() > 0)
      do {
         
         reportPath.cd("./" + allRepots.at(0));
         
         allFilesInReport = reportPath.entryList(QDir::Files|QDir::NoDotAndDotDot,QDir::Time|QDir::Reversed);
         if(allFilesInReport.count() > 0)
         {
            
            QFile(reportPath.path() + "/" + allFilesInReport.at(0)).remove();
            allFilesInReport.removeFirst();
            
         }

         reportPath.cdUp();

         if(allFilesInReport.count() == 0)
         {
            reportPath.rmdir(allRepots.at(0));
            allRepots.removeFirst();
            
         }
fstatvfs(fdADC, &diskFree); //<<

         free = int(diskFree.f_bavail); //<<

         total = int(diskFree.f_blocks);
         Prc = (free*100)/total;
         
      } while ((Prc < 5) && (allRepots.count() > 0)); //Пока пямять занята и еще есть, что удалять
   }
   if (Prc > 100) return -1;
   return Prc;
}
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: Теон-Про v2, Переполнение кэша
« Ответ #3 : 30 Сентября, 2011, 14:44:45 »

> говнокод

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