Вести с полей

Всех с последним днем осени.

Пошла восьмая неделя как откопал стюардесу DataProvider для EntityFrameworkCore.

Восстановил ранее написанный функционал и понял, что нужно все переделать.

Слабое утешение — ну хоть понял.

Вести с полей

Сегодня закончилось расширенное тестирование ранее выпущенного IBProvider v5.21 — за неделю проехало 10 проходов стандартного набора тестов.

Если не считать того, что 5 раз отвалилось подключение к FB3, вроде все нормально.

[28.10.2020 11:17:18] [summary] ------------------------------------------- [SUMMARY INFORMATION]
[28.10.2020 11:17:18] [summary] [TESTS]
[28.10.2020 11:17:18] [summary] EXECUTED      : 7028738
[28.10.2020 11:17:18] [summary] SUCCEEDED     : 7028243
[28.10.2020 11:17:18] [summary] FAILED        : 5 [ 5 error(s) ]
[28.10.2020 11:17:18] [summary] WITH WARNINGS : 490 [ 691 warning(s) ]
[28.10.2020 11:17:18] [summary] 
[28.10.2020 11:17:18] [summary] - - - - - - - - - - - - - - - - - - - - - -
[28.10.2020 11:17:18] [summary] [TEST TIMES]
[28.10.2020 11:17:18] [summary] REAL          : 48583296148547 [56 day(s)05:32:09.6148547]
[28.10.2020 11:17:18] [summary] USER          : 9518832187500 [11 day(s)00:24:43.2187500]
[28.10.2020 11:17:18] [summary] KERNEL        : 3961859062500 [4 day(s)14:03:05.9062500]
[28.10.2020 11:17:18] [summary] TOTAL         : 13480691250000 [15 day(s)14:27:49.1250000]
[28.10.2020 11:17:19] 
[28.10.2020 11:17:19] [TEST HEAP] Test heap is empty
[28.10.2020 11:17:19] [TEST HEAP] Validate ... OK
[28.10.2020 11:17:19] [TEST HEAP] Destroy ... OK
[28.10.2020 11:17:19] 
[28.10.2020 11:17:19] [summary] ------------------------------------------- [PROCESS INFORMATION]
[28.10.2020 11:17:19] [summary] [VIRTUAL MEMORY]
[28.10.2020 11:17:19] [summary] 
[28.10.2020 11:17:19] [summary] PRIVATE BYTES      : 41088 KB       [40MB 128KB]
[28.10.2020 11:17:19] [summary] PEAK PRIVATE BYTES : 13167704 KB    [12GB 571MB 88KB]
[28.10.2020 11:17:19] [summary] VIRTUAL SIZE       : 4749840 KB     [4GB 542MB 528KB]
[28.10.2020 11:17:19] [summary] PAGE FAULT COUNT   : 1244261117
[28.10.2020 11:17:19] [summary] 
[28.10.2020 11:17:19] [summary] - - - - - - - - - - - - - - - - - - - - - -
[28.10.2020 11:17:19] [summary] [HANDLES]
[28.10.2020 11:17:19] [summary] 
[28.10.2020 11:17:19] [summary] HANDLES            : 176
[28.10.2020 11:17:19] [summary] 
[28.10.2020 11:17:19] [summary] - - - - - - - - - - - - - - - - - - - - - -
[28.10.2020 11:17:19] [summary] TOTAL ERRORS  : 5
[28.10.2020 11:17:19] [summary] TOTAL WARNINGS: 691
[28.10.2020 11:17:19] [summary] FULL PASSES   : 10
[28.10.2020 11:17:19] [summary] GEN TESTS     : 82927510

В тестах использовался «глобальный» кэш SQL-запросов (sql_cache__scope=db).

Вести с полей

Привет всем.

Давным-давно, в октябре 98-го, я утром проснулся и подумал — «реляционная база данных должна быть организована по-другому». Время и несколько практических экспериментов показали, что да, идея рабочая. Более чем.

Вчера в процессе завершения новой подсистемы IBProvider, которая будет жить своей жизнью, пришлось доработать «подвал» модуля. А сегодня утром подумал — «чего я все хожу вокруг да около. По-хорошему, сервер объектов должен быть организован по-другому …».

Советы дня. Работа с Firebird 2.5 через связанный сервер.

Привет всем.

Вчера консультировал клиента, по поводу ряда проблем при работе с базой под FB2.5 через связанный сервер MSSQL. Используется встроенный клиент для Firebird (dbclient_type=fb.direct).

Проблема #1
Первый запрос к базе выполняется около 30 секунд.

Причина заключается в том, что MSSQL читает метаданные конструкций, используемых в запросе. По умолчанию IBProvider грузит и кэширует все данные для каждой схемы. То есть, MSSQL хочет получить данные по колонкам для одной таблицы. А провайдер, чтобы два раза не вставать, загружает данные о колонках всех таблиц и представлений (VIEW).

Это поведение можно изменить, указав в строке подключения «schema_cache=0».
(далее…)

Большое тестирование IBProvider [release]

Всем привет.

Вчера закончилось большое тестирование IBProvider v5.19 (vc16, x64, релизная сборка).

Потребовалось 32 дня.

Все тип-топ.
(далее…)

Большое тестирование IBProvider [debug]

Привет всем.

Сегодня доехало до конца большое тестирование IBProvider v5.19. Главное отличие от предыдущих забегов — прогонялись отладочные сборки провайдера и пула подключений.

7 миллионов тестов за 42.5 дня на 10-ядерном процессоре.

Все тип-топ.

Конфигурация

  • Intel 6950x [10C/20T], RAM 128GB
  • База и TEMP на RAM диске (SoftPerfect)
  • IBProvider v5.19.0.35449
  • LCPI OLE DB Services v1.16.0.924
  • LCPI Thread Pool v2.1.1.310
  • Firebird v3.0.6.33294 (SS, x64, Win)
  • Win10 x64 Pro 1909

Подключение к базе через собственного клиента для FB (dbclient_type=fb.direct) и TCP/IP (INET4). Без сжатия данных — не стал рисковать.

Каждый час запускалась принудительная сборка мусора.

(далее…)

SSIS в картинках. Динамическая строка подключения

Два пользователя напрягли вопросом указания динамических значений некоторых параметров строки подключения в SSIS пакете.

Пришлось вникать в эту тему.

Оказалось все достаточно просто — нужно целиком формировать строку подключения. Причем её можно собирать из нескольких частей.

Думаю, следующая картинка все доходчиво объясняет:

У нас тут три переменных.

В переменных Variable_LOC и Variable_CN_STR1 заданы явные значения.

В переменной Variable_CN_STR значение формируется динамически через выражение:

location="+ @[User::Variable_LOC] +";"+@[User::Variable_CN_STR1]

В объекте подключения RAM.GAMER (в моем случае это OLE DB подключение) добавляем Expression определяющее свойство ConnectionString и указываем его значение как @[User::Variable_CN_STR].

Вести с полей

Всех с бодрым началом лета.

В IBProvider проведена очередная серия обновлений исходного кода. Устранил вещи, об которые начал спотыкаться мозг.

Основная суть — зачистка и переработка интерфейсов принимающих строковые значения. Если совсем просто, то вместо «const char*» и «const std::string&» теперь используется structure::t_const_str_box (аналог std::string_view).

В процессе переработки чуть было не наступил на грабли. Так что, в некоторых случаях, методы, принимающие указатели вида «const char*», пришлось сохранить.

После всех этих изменений, бинарник провайдера (x64) потяжелел приблизительно на 40KB. Это было ожидаемо, но все равно неприятно. Назад откатывать не стал — оптимизировал другие конструкции (-10KB).

Судя по результатам тестирования, функциональность не поломалась. Общая производительность тоже не просела. Даже стало немного быстрее:

Было

[16.05.2020 15:51:13] [summary] [TESTS]
[16.05.2020 15:51:13] [summary] EXECUTED      : 703686
[16.05.2020 15:51:13] [summary] SUCCEEDED     : 703630
[16.05.2020 15:51:13] [summary] FAILED        : 0
[16.05.2020 15:51:13] [summary] WITH WARNINGS : 56 [ 82 warning(s) ]
[16.05.2020 15:51:13] [summary] 
[16.05.2020 15:51:13] [summary] - - - - - - - - - - - - - - - - - - - - - -
[16.05.2020 15:51:13] [summary] [TEST TIMES]
[16.05.2020 15:51:13] [summary] REAL          : 4191257823522 [4 day(s)20:25:25.7823522]
[16.05.2020 15:51:13] [summary] USER          : 822947500000  [22:51:34.7500000]
[16.05.2020 15:51:13] [summary] KERNEL        : 337996562500  [09:23:19.6562500]
[16.05.2020 15:51:13] [summary] TOTAL         : 1160944062500 [1 day(s)08:14:54.4062500]

Стало

[02.06.2020 06:05:50] [summary] [TESTS]
[02.06.2020 06:05:50] [summary] EXECUTED      : 703686
[02.06.2020 06:05:50] [summary] SUCCEEDED     : 703628
[02.06.2020 06:05:50] [summary] FAILED        : 1 [ 2 error(s) ] <--- привет от FB.
[02.06.2020 06:05:50] [summary] WITH WARNINGS : 57 [ 75 warning(s) ]
[02.06.2020 06:05:50] [summary] 
[02.06.2020 06:05:50] [summary] - - - - - - - - - - - - - - - - - - - - - -
[02.06.2020 06:05:50] [summary] [TEST TIMES]
[02.06.2020 06:05:50] [summary] REAL          : 3935194767393 [4 day(s)13:18:39.4767393]
[02.06.2020 06:05:50] [summary] USER          : 800231406250  [22:13:43.1406250]
[02.06.2020 06:05:50] [summary] KERNEL        : 325012343750  [09:01:41.2343750]
[02.06.2020 06:05:50] [summary] TOTAL         : 1125243750000 [1 day(s)07:15:24.3750000]

Все это ускорение, конечно, условно. Но все равно приятно.

Если все сложится благоприятно (основное тестирование закончится только завтра), то новое обновление провайдера (v5.18) будет выложено на этой неделе.

Немного статистики

На днях провел небольшую экскурсию в свое прошлое и подвел итоги.

Вкратце.

1. Общий объем исходных кодов рабочих проектов, с которыми приходится регулярно иметь дело, составляет около 80MB.

2. Половину составляют тесты.

А я еще чертыхаюсь — что так все стало сложно и тяжко? 🙂

Регулярные выражения

Вчера весь день доводил до ума одну конструкцию IBProvider, которая была сделана одной из первых в его третьей версии. И краем глаза увидел код вида:

 :inherited(NULL)
 ,m_ProviderClassID(ProviderClassID)
 ,m_spData(pData)
 ,m_spUnkOwner(pUnkOwner)
{
 assert(m_spData);
 assert(m_spUnkOwner);

Непорядок, подумал я. Надо бы задействовать structure::not_null_ptr для подсказки смарт-указателям:

 ,m_spData(structure::not_null_ptr(pData))
 ,m_spUnkOwner(structure::not_null_ptr(pUnkOwner))

Но решил не отвлекаться.

К вечеру, а тем более сегодня с утра, уже не мог вспомнить — ГДЕ ЭТО Я ВИДЕЛ???

Чертыхаясь, пришлось осваивать регулярные выражения.

С использованием справок, онлайн-тестеров и такой-то матери, осилил выражение — (,m_sp)[\w]*[(][p].

Нашлось даже больше чем ожидал:

I am an engineer a regular expression expert! 🙂