|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Павел ИшенинЕсли вдаваться в логику, то statement при смерти должен удалять буферы Не должен. Блобы могут читаться отдельно без всякого статемента. Их кэш может быть привязан к транзакции или коннекту. В твоём коде не освобождается ни то ни другое. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 12:21 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, поскольку PDO не умеет читать идентификаторы BLOB, а всегда читает сразу его содержимое (хотя по уму могли бы и поток для этого организовать), то в самом драйвере они должны освобождать внутренние структуры блоба сразу после фетча. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 12:53 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
а не вру, есть возможность читать BLOB как поток, но через опу http://php.net/manual/ru/pdo.lobs.php ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 12:58 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Павел ИшенинДегтярев Евгенийа что с ibase_? извиняюсь, в пред сообщении написал ibx Может ли это помочь проблеме ? И если да, то как? как вариант, да, там может не быть этой проблемы когда сталкивался со связкой php+fb использовал функции ibase_xxx, pdo_firebird обходил стороной, т.к. с ним периодически всплывали какие то траблы за ответом как, сюда - http://php.net/manual/ru/book.ibase.php ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 14:08 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Павел ИшенинПри анализе кода pdo_firebird вот первое за что цепляется глаз: Код: plaintext 1.
Зачем там erealloc? Разве где-то память выделяется ранее? И если нет, то всегда ли там null? Под все остальные типы используется следующая конструкция: Код: plaintext 1.
дело в том что у остальных типов длина фиксирована, поэтому достаточно выделить память один раз. А для BLOB который сразу преобразуется в текст приходится переаллокировать буфер при каждом фетче. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 14:29 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovПавел ИшенинЕсли вдаваться в логику, то statement при смерти должен удалять буферы Не должен. Блобы могут читаться отдельно без всякого статемента. Их кэш может быть привязан к транзакции или коннекту. В твоём коде не освобождается ни то ни другое. Имелся ввиду вот этот код pdo_firebird : Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 16:54 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Дегтярев Евгенийкак вариант, да, там может не быть этой проблемы когда сталкивался со связкой php+fb использовал функции ibase_xxx, pdo_firebird обходил стороной, т.к. с ним периодически всплывали какие то траблы Если прочитать моё начальное сообщение, то видно что я пишу про работу с Firebird в библиотеке Yii. Там используется PDO. Какой смысл проверять не PDO, если мне надо разобраться с проблемой именно в нём? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 16:57 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Симонов Денисдело в том что у остальных типов длина фиксирована, поэтому достаточно выделить память один раз. А для BLOB который сразу преобразуется в текст приходится переаллокировать буфер при каждом фетче. Спасибо, мне что-то в голову это не пришло. Тогда всё вроде верно написано. Ну может вместо realloc было бы выгодней сделать free + malloc если realloc ведет к фрагментации памяти. Тем не менее, это не должно порождать утечку. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 17:03 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Павел ИшенинДегтярев Евгенийкак вариант, да, там может не быть этой проблемы когда сталкивался со связкой php+fb использовал функции ibase_xxx, pdo_firebird обходил стороной, т.к. с ним периодически всплывали какие то траблы Если прочитать моё начальное сообщение, то видно что я пишу про работу с Firebird в библиотеке Yii. Там используется PDO. Какой смысл проверять не PDO, если мне надо разобраться с проблемой именно в нём? в том чтобы проверить, локализовать и зарепортить все возможные проблемы ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 17:04 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Можете протестить тот же код на таблицы/полей без блобов и проверить память или скажем на Postgres блобах? Глянул еще раз на firebird_fetch_blob( вроди ничего криминального не нашел. К выходу идет ptr и len который потом освобождается в базовой PDO классе. Обычно пхп девы тестят все изминения Valgrind-ом и другими тулами, чтобы минимизировать утечки. Если все же уверен что утечка есть, то создай баг репорт с юнит тест кэйсом наподобие: https://github.com/php/php-src/tree/8582e53430f12ce36f621d034a40d10ea01061fc/ext/pdo_firebird/tests ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2018, 13:06 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin Marcoci, оно легко воспроизводится Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
авторFirst used: 2097152 0 itteration used: 4194304 1 itteration used: 4194304 2 itteration used: 6291456 3 itteration used: 6291456 4 itteration used: 8388608 5 itteration used: 8388608 6 itteration used: 8388608 7 itteration used: 10485760 8 itteration used: 12582912 9 itteration used: 12582912 10 itteration used: 12582912 11 itteration used: 14680064 12 itteration used: 16777216 13 itteration used: 16777216 14 itteration used: 16777216 15 itteration used: 18874368 16 itteration used: 18874368 17 itteration used: 20971520 18 itteration used: 23068672 19 itteration used: 23068672 Last used: 23068672 в базе данных ~200 процедур. При замене BLOB на строку утечек нет. Интересно что при повторном запуске скрипта память постепенно стабилизируется. Наверное менеджер памяти там такой хитрый. И ещё вот здесь Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
нет проверки на допустимость номера столбца. В результате при вызове PDOStatement::fetchColumn с номером большим чем количество столбцов имеем segfault с падением web сервера. Надо бы ошибку бросать ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2018, 13:51 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin MarcociГлянул еще раз на firebird_fetch_blob( вроди ничего криминального не нашел. К выходу идет ptr и len который потом освобождается в базовой PDO классе.А сам блоб - закрывается ? Симонов Денисоно легко воспроизводитсяТут автокоммит вкл ? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2018, 13:57 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
hvlad, я пробовал его отключать (по умолчанию включен). Разницы никакой. Кстати разве после закрытия блоб всё ещё будет потреблять ресурсы на клиенте, даже если транзакция не завершена? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2018, 14:02 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Симонов ДенисКстати разве после закрытия блоб всё ещё будет потреблять ресурсы на клиенте, даже если транзакция не завершена?После закрытия - конечно не будет. Вопрос в том - закрыты ли они. Однако, коммит (роллбек) должен освобождать клиентские ресурсы, связанные с блобами. Отсюда был вопрос об автокоммите. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2018, 14:13 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin Marcoci, Если есть возможность поотлаживать код pdo-firebird, то в какой момент вызывается firebird_stmt_dtor? И что если добавить вывод потребления памяти до и после erealloc? Я не знаю как работает этот erealloc, но традиционно перевыделение вызывает фрагментацию и медленнее освобождения с повторным выделением поскольку менеджер должен, помимо прочего, скопировать содержимое старого блока памяти в новый (чего, как я понимаю, в данном случае не требуется). ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2018, 18:21 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Павел Ишенин, там КМК это можно оптимизировать. Например выделять для начала 32K памяти, если блоб больше увеличивать, т.е. перевыделять память только если для БЛОБа её требуется больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2018, 19:51 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Павел Ишенин, ура!!! Нашёл утечку. Не зря тебе подозрительным вот этот кусок показался Павел ИшенинПри анализе кода pdo_firebird вот первое за что цепляется глаз: Код: plaintext 1.
только дело не в erealloc, а в том память перевыделяют для для ptr, в котором вообще чужой буфер может быть из столбца к которому обращались до BLOBa (в моём тесте из NAME). Вот правильный код Код: plaintext 1.
тест Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
теперь надо бы патч оформить. Буду разбираться как им написать ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2018, 16:39 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
в трекер написал https://bugs.php.net/bug.php?id=76488 патч приложил ждём реакции ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2018, 16:19 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Денис, спасибо за фикс! Нужно сделать тест-кэйс и пулл реквест на гитхабе, о то будешь ждать бесконечно долго. Попробую, может сделаю я, но дико не хватает время. Последние месяцы занят повседневными проэктами. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2018, 11:46 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Денис, там тест кэйс должен падать при нынешнем коде, и пройти успешно с твоим кодом. Например, типа утечка ноль, а с текущим кодом > 0. Но думаю смерджят. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2018, 16:36 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin Marcoci, оно падает только при segfault, а если утечка идёт, то оно скорее всего просто упрётся в ограничения на потребляемую память процессом php, который зависит от настроек. То же надеюсь что смержат. Мне комменты присылаются на почту. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2018, 16:43 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
не то что прямо падал процес :) мой рускиш не родной.. имел ввиду чтоб не прошел тест, тоесть другой результат, не тот что в еxpected ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2018, 17:54 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin Marcoci, а.. так ты про это. Мне дали вот такой коммент nikic It shouldn't be necessary to test memory usage explicitly (because a leak message will be printed in debug builds), just have a code that was previously leaking. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2018, 17:58 |
|
|
start [/forum/topic.php?fid=40&msg=39651204&tid=1559821]: |
0ms |
get settings: |
12ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 252ms |
total: | 389ms |
0 / 0 |