Вчера осуществил задуманное и накатал простенький тест памяти, который запускается прямо из под Windows.
В качестве подопытного кролика была планка на 16GB, с которой возникла заминка (см. мой комментарий за 2017-10-20).
Как положено, сначала была простейшая однопоточная реализация, которая гоняла в цикле код вида:
void MemTest_001(void* const pvBeg,void* const pvEnd)
{
//последовательное заполнение одним и тем же значением
typedef unsigned char value_type;
const size_t nValues=(((const char*)pvEnd)-((const char*)pvBeg))/sizeof(value_type);
value_type* const beg=reinterpret_cast<value_type*>(pvBeg);
value_type* const end=beg+nValues;
value_type v=0;
for(;;++v)
{
std::fill(beg,end,v);
for(const value_type* p=beg;p!=end;++p)
{
const value_type m=*p;
if(m==v)
continue;
structure::str_formatter
fmsg("bad value [%1]. expected value [%2]. position [%3].");
fmsg<<m<<v<<size_t(p-beg);
throw std::runtime_error(fmsg.str());
}//for
if(v==std::numeric_limits<value_type>::max())
break;
}//for v
}//MemTest_001
Запустил на 16GB и не дождался пока этот тест отработает до конца.
Распределил работу этого теста между десятью потоками (процессор 6950X). Отработало приблизительно минут за двенадцать — обвязка тестов убогая, поэтому время измерялось на глаз.
Если честно, я не ожидал, что все будет так медленно.
Потом я накатал несколько других тестов, которые последовательно заполняют память. Отрабатывают, но, чувствую — что-то все не то.
(далее…)
На сайт загружена новая сборка IBProvider (3.47.0.27110), в которую внесены два изменения.
1. Изничтожено использование std::locale. Один из пользователей заслал стек падения внутри этой конструкции. Судя по всему, проблема связана с параллельным вызовом setlocale.
Этот std::locale уже один раз был причиной проблем в прошлом. Вот опять напомнил о себе.
2. Переписано последнее «наследство» от второй версии IBProvider — «сравнитель» значений OLEDB типов. 10 лет собирался это сделать. Я рад, что это наконец-то произошло.
Привет всем.
Завершен процесс релиза 46-обновления третьей версии IBProvider — опубликованы новости.
С моей точки зрения, в этом выпуске самое главное — внутренние изменения, связанные с реорганизацией исходного кода. Хотя конечным пользователя абсолютно безразлично.
Пока перестраивал код, в голову пришли следующие мысли:
1. Сначала программист на C++ больно и мучительно приходит к использованию счетчиков ссылок для управления временем жизни объектов размещаемых в куче.
2. Потом до него доходит, что счетчиков может быть несколько.
3. И наконец, реализации интерфейсов со счетчиками ссылок необязательно размещать в куче. Они могут быть статическими, а их add_ref/release ничего не делают.
К моменту, когда я дошел до третьего пункта в IBProvider v3 была написана куча кода, который попадал под эту оптимизацию. Вот как раз часть этого прошлого и была откорректирована в новом выпуске.
Следуя настоятельным рекомендациям (по поводу CORE-5632), занялся очень мутной работой — тестированием оперативной памяти. Каждой планки (8x16GB) по отдельности.
В качестве тестов — сначала (для проформы) MemTest86+ 5.01.
Потом, уже под Windows 10 Pro (1703), группа тестов провайдера, которая использовалась (успешно) для выявления битой памяти ноутбука. FB3 был сконфигурирован как SuperClassic — ну, чтобы памяти побольше ел.
Тесты запускались в 20 потоков. Каждый запуск начинался с чистой базы.
(далее…)
На почту пришло уведомление об выпуске первого обновления InterBase 2017.
Я прям заинтересовался — неужели починили багу с savepoint, которая уже надоела и я решил сообщить им о ней.
Нет, не осилили.
Зато обнаружил в списке исправленных ошибок такую интересную запись:
INTB-3287 Transaction Inventory Page cleanup could cause database corruption in extreme case.
Если я все правильно догоняю, то это CORE-5415 🙂
Dmitry Kovalenko on 6 октября, 2017 | 1 Comment
Привет всем.
На сайт загружен новый триал IBProvider, сборку которого (3.45.0.26658) планируется довести до релиза.
В новой сборке откорректирована поддержка UTF8. Ранее, UTF8 символ отображался на два UTF16 (WCHAR) символа. Это обеспечивало поддержку всех допустимых символов UTF8, но создавало определенные трудности с определение максимального количества символов в колонке/параметре. Эти трудности начали приносить невыносимые страдания одному из наших последних клиентов, поэтому я решил вернуть отношение один UTF16 символ на один UTF8 символ и добавить свойство инициализации wchars_in_utf8_symbol, которое позволяет вернуться к двум UTF16 символам на один UTF8 символ.
Все остальные изменения в провайдере связанны с реорганизацией и ревизией кода.
Первое. Я изничтожил свои велосипеды (изобретенные в 2000-ом году) вокруг std::vector. И начал использовать этот класс как есть. Бинарники немного увеличились в размерах (максимум на 0.5%), производительность вроде не просела.
Второе. Некоторые внутренние объекты преобразованы из динамических в статические. Для такой махины как IBProvider, такая оптимизация мало на что повлияет. Но тем не менее.
И третье. Я тут начал читать (догреб до середины) «Эффективный и современный C++» Скотта Мейерса. Пришел к выводу, что в настоящий момент просто глупо беспокоиться за совместимость со старыми компиляторами (которые по факту я уже и не использую) и пора уже двигаться вперед. Move-трюки я уже давно начал использовать, хотя и прятал эти конструкции от старых компиляторов. Теперь начал использовать новые штуки (типа emplace_back) из STL. Без всяких условностей. Я рад что это произошло.
Привет всем.
В экстренном порядке пришлось выпустить версию IBProvider v3.44.
Вчера, разгребая результаты выполнения тестов для InterBase 2017, обнаружил ошибку с NULL-значениями в IN-параметрах с типом BLOB.
Я даже посмотрел в истории — когда конкретно эта бага была внесена в код.
11 ноября 2016 года 14:54:35.
Судя по бортовому журналу, в этот день к этому моменту у меня уже был «отходняк» — был выпущен провайдер с собственным клиентом к FB3 и осилена покупка Windows 10 на новую рабочую лошадку.
Dmitry Kovalenko on 18 сентября, 2017 | 1 Comment
Сегодня стукнуло семь лет с момента релиза третьей версии IBProvider.
Семь лет разрабатывался и уже столько же доводится до ума.
У всех причастных к этому процессу, однозначно, есть повод улыбнуться.
Как известно, в Firebird 2.1, для работы с кодовыми страницами, была добавлена поддержка библиотеки ICU. Изначально — версия 3.0 (FB2.1, FB2.5). FB3 работает с ICU 5.2.
Компоненты доступа, если они претендуют на «нативе» поддержку Firebird, тоже должны уметь работать с ICU. Так что приходится с этим возиться.
На текущий момент, IBProvider поддерживает ICU3.
При тестировании провайдера с FB3 и изучении хедеров ICU 5.2, обнаружилась пара новых забавных вещей.
(далее…)
Dmitry Kovalenko on 17 июля, 2017 | 1 Comment
Всем привет.
Из личных кабинетов уже можно прямо сейчас загрузить инсталляторы «LCPI OLE DB Services» и обновленных IBProvider, ADO.NET Provider. Подробное описание будет, как обычно, немного позднее.
Вкратце про последние две вещи
В IBProvider исправлена ошибка в 64-битной сборке.
В ADO.NET провайдере появилась новая компонента «OleDbServices» для явного определения COM-объекта с сервисами OLE DB.