Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Мистика / 25 сообщений из 26, страница 1 из 2
23.09.2016, 11:24
    #39314051
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Редко такое бывает. И каждый раз когда разбираешься - понимаешь что сам виноват. Но вот сегодян опять.

Итак есть небольшой проект Spring, Hibernate, HSQL.
Вроде работает на нескольких машинах. Win 7, Win 10.
Сегодня запускаю на новой девелоперской машине Win 10 и выгребаю совершенно дикую проблему в HSQL. Падает валидация Lock файла.

Суть в том что HSQL пишет в .lck файл 16 байт. 8 байт префикс + 8 байт System.currentTimeMillis(). Как результат на выходе файл в 22 байта!!!
Вот код записи. Объявление и обработку исключений опустил.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
            
    protected static final byte[] MAGIC = {
        0x48, 0x53, 0x51, 0x4c, 0x4c, 0x4f, 0x43, 0x4b
    };

    protected volatile RandomAccessFile raf;


writeMagic();
writeHeartbeat();

    private final void writeMagic()
            raf.seek(0);
            raf.write(MAGIC);
    }

    private final void writeHeartbeat()
            raf.seek(MAGIC.length);
            raf.writeLong(System.currentTimeMillis());
    }



Даже если вдруг там какая-то конкуренция, то каким образом оно за 16 байт вылазит??

Код: java
1.
2.
0000000000: 48 53 51 4C 4C 4F 43 4B | 00 00 01 55 EF BF BD EF  HSQLLOCK  ☺U�››�
0000000010: BF BD 00 EF BF BD       |                          ›› �››
...
Рейтинг: 0 / 0
23.09.2016, 11:27
    #39314056
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Все. Блин. Я тупой. Там же по одному байту пишется. Вот и при конкуренции больше байт попадает. Осталось понять с какого перепугу спринг два раза HSQL запускает.
...
Рейтинг: 0 / 0
23.09.2016, 11:44
    #39314083
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Вот только никаких двух потоков и впомине нет.
...
Рейтинг: 0 / 0
23.09.2016, 11:48
    #39314089
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Падает из IntelliJ IDEA CE. Из батника работает без проблем. Мнения? Рекомендации?
...
Рейтинг: 0 / 0
23.09.2016, 11:59
    #39314104
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
BlazkowiczПадает из IntelliJ IDEA CE. Из батника работает без проблем. Мнения? Рекомендации?

Запретить создание этого файла и посмотреть кто упадёт.
...
Рейтинг: 0 / 0
23.09.2016, 12:12
    #39314126
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Alexey Tomin,

Тогда просто падает инициализация HSQL. Пробовал дебаг. Вижу только 1 main поток.
...
Рейтинг: 0 / 0
23.09.2016, 12:19
    #39314136
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Blazkowicz,

Тесты памяти на машине гонял? Вдруг там что-то битое?
...
Рейтинг: 0 / 0
23.09.2016, 12:40
    #39314174
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Сергей Арсеньев,

- При чем тут память? Пишет байты по одному через RandomAccessFile
- Если запускать без IntelliJ IDEA CE, то проблема не повторяется
- Если запустить пошаговую отладку, то отрабатывает без ошибки, что наводит на мысль о конкуренции

Может что-то и идее запускать метод 2 раза (версия 14.1.3)?
...
Рейтинг: 0 / 0
23.09.2016, 14:47
    #39314353
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
в тестовом коде при параллельном запуске в двух потоках метода writeHeartbeat
проблема с размером файла повторяется.

я-бы залогировал стектрейс запуска этого метода
...
Рейтинг: 0 / 0
23.09.2016, 14:48
    #39314357
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
BlazkowiczAlexey Tomin,

Тогда просто падает инициализация HSQL. Пробовал дебаг. Вижу только 1 main поток.

Хм. Поставить в строке, где падает точку останова.
Разрешить запись.
Прости строку.
Запретить запись.
Найти сделующую строку (где упадёт).
...
Рейтинг: 0 / 0
23.09.2016, 15:03
    #39314376
vsl
vsl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Dmitry.в тестовом коде при параллельном запуске в двух потоках метода writeHeartbeat
проблема с размером файла повторяется.
А проблема повторяется точно так же, как у Blazkowicz — размер файла 22 байта, и внутри несколько EF BF BD, подозрительно напоминающих BOM?
Потому что у меня при двух потоках размер файла стабильно равен 23 байта (8 + 8 + 8 - 1, где -1 — перезаписанный первый байт heartbeet из-за повторного seek(8)), а внутри — куски двух timestamp'ов.
...
Рейтинг: 0 / 0
23.09.2016, 15:24
    #39314411
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Alexey TominХм. Поставить в строке, где падает точку останова.
Разрешить запись.
Прости строку.
Запретить запись.
Найти сделующую строку (где упадёт).
Этим и пытаюсь занятся. Только, блин, HSQL из мавена без отладочной инфы. Ну, и в дебаге не повторяется. Нормально приходит 1 writeHeartbeat(). Потом через время еще один, вроде так и должо быть. Падает уже в валидации, она к записи отношения не имеет.
Дампил стэктрейс, вроде, только один приходит одновременно. Дамп имен потока почему-то не отработал.
...
Рейтинг: 0 / 0
23.09.2016, 15:25
    #39314414
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
vslА проблема повторяется точно так же, как у Blazkowicz — размер файла 22 байта, и внутри несколько EF BF BD, подозрительно напоминающих BOM?
Потому что у меня при двух потоках размер файла стабильно равен 23 байта (8 + 8 + 8 - 1, где -1 — перезаписанный первый байт heartbeet из-за повторного seek(8)), а внутри — куски двух timestamp'ов.

О, а вот это интересная мысль! Я user.language менял. Не помогло. Но у них были какие-то проблемы с кодировками раньше.
...
Рейтинг: 0 / 0
23.09.2016, 16:19
    #39314485
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Как вариант двойная инициализация контекста спринга ... что влечет порождение второго треда ?!


примерно так :

Если у вас указан protected Class<?>[] getRootConfigClasses() {

то второй должен быть null - protected Class<?>[] getServletConfigClasses() {

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



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SecurityConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};

    }




Все мной описанное верно и для других участков кода...

:( Печально
...
Рейтинг: 0 / 0
23.09.2016, 16:22
    #39314488
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Atum1,

А метод оберните аспектом и посмотрите кто его и откуда вызывает в логе .

главное чтобы аспект первым привязался :)
...
Рейтинг: 0 / 0
24.09.2016, 10:16
    #39314803
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Похоже, что это таймер конкурирует с инициализацией. Странно.

Main поток инитит спринг.
Код: java
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.
java.lang.Exception: Stack trace
	at java.lang.Thread.dumpStack(Thread.java:1329)
	at org.hsqldb.persist.LockFile.writeHeartbeat(Unknown Source)
	at org.hsqldb.persist.LockFile.tryLock(Unknown Source)
	at org.hsqldb.persist.LockFile.newLockFileLock(Unknown Source)
	at org.hsqldb.persist.Logger.acquireLock(Unknown Source)
	at org.hsqldb.persist.Logger.open(Unknown Source)
	at org.hsqldb.Database.reopen(Unknown Source)
	at org.hsqldb.Database.open(Unknown Source)
	at org.hsqldb.DatabaseManager.getDatabase(Unknown Source)
	at org.hsqldb.DatabaseManager.newSession(Unknown Source)
	at org.hsqldb.jdbc.JDBCConnection.<init>(Unknown Source)
	at org.hsqldb.jdbc.JDBCDriver.getConnection(Unknown Source)
	at org.hsqldb.jdbc.JDBCDriver.connect(Unknown Source)
	at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
	at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
	at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556)
	at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545)
	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388)
	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
	at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:388)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
	at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84)



И, примерно в это же время, отрабатывает HSQLDB Timer

Код: java
1.
2.
3.
4.
5.
6.
java.lang.Exception: Stack trace
	at java.lang.Thread.dumpStack(Thread.java:1329)
	at org.hsqldb.persist.LockFile.writeHeartbeat(Unknown Source)
	at org.hsqldb.persist.LockFile.access$100(Unknown Source)
	at org.hsqldb.persist.LockFile$HeartbeatRunner.run(Unknown Source)
	at org.hsqldb.lib.HsqlTimer$TaskRunner.run(Unknown Source)



И, что самое обидное, с утра уже ничего не падает.
...
Рейтинг: 0 / 0
24.09.2016, 10:20
    #39314806
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Хотя, мне кажется, что вряд ли дело в конкуренции. Уж очень BOM выглядит подозрительно. Может и правда глюк на уровне железа прилетел?
...
Рейтинг: 0 / 0
24.09.2016, 10:22
    #39314809
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Atum1,

Нет у меня двух контекстов и сервлетов. Только JAXWS Endpoint. Двойной инит конктеста был одним из первых моих предположений. Но отладкой подтвердить не удалось.
...
Рейтинг: 0 / 0
25.09.2016, 03:31
    #39315035
Sergunka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
BlazkowiczAtum1,

Нет у меня двух контекстов и сервлетов. Только JAXWS Endpoint. Двойной инит конктеста был одним из первых моих предположений. Но отладкой подтвердить не удалось.

Я вообще плохо соображаю зачем нужно использовать сервлет в контексте HQL, но как варинат дебажанья сервлетов можно попробовать использовать филтер.
...
Рейтинг: 0 / 0
25.09.2016, 08:40
    #39315048
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
SergunkaЯ вообще плохо соображаю зачем нужно использовать сервлет в контексте HQL, но как варинат дебажанья сервлетов можно попробовать использовать филтер.
Нет у меня сервлетов. Не нужны мне фильты. Нет у меня двойной инициализации контекста тоже. Продукт коробочный и пилотный, поэтому пока что идет с HQL внутри.
...
Рейтинг: 0 / 0
26.09.2016, 10:16
    #39315379
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
BlazkowiczSergunkaЯ вообще плохо соображаю зачем нужно использовать сервлет в контексте HQL, но как варинат дебажанья сервлетов можно попробовать использовать филтер.
Нет у меня сервлетов. Не нужны мне фильты. Нет у меня двойной инициализации контекста тоже. Продукт коробочный и пилотный, поэтому пока что идет с HQL внутри.

Тогда нужен тест - замокайте все что можно и запустите тест на инициализацию контекста и старт вашего приложения.

+ все таки добавьте логирование через аспекты оберните все что можно и смотрите какой поток и откуда лезет и хочет повторно инициализировать .
...
Рейтинг: 0 / 0
26.09.2016, 10:32
    #39315396
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Atum1,

Блин. Еще раз:
1) Два потока, которые, возможно , конкурируют я уже привел выше. Один из них это сама инициализация, второй - таймер HSQL
2) Результаты записи в файл не похожи на конкурентную запись совершенно. Целый день результат был всегда 22 байта, которые я привел. С конкуренцией были бы вариации.
3) Проблема самоустранилась на следующее утро точно таким же мистическим утром и больше не появлялась. Комп был в режиме сна. Но весь день до этого она проявлялась совершенно стабильно при запуске в IntelliJ, кроме случаев остановки в брейкпоинтах и пошаговой отладки.
...
Рейтинг: 0 / 0
26.09.2016, 11:03
    #39315428
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
BlazkowiczПроблема самоустранилась на следующее утро точно таким же мистическим утром и больше не появлялась. Комп был в режиме сна. Но весь день до этого она проявлялась совершенно стабильно при запуске в IntelliJ, кроме случаев остановки в брейкпоинтах и пошаговой отладки.

По сути, проблема изчезла после перезапуска IDEA? Может был глюк именно в ней и полечился после первого перезапуска?
...
Рейтинг: 0 / 0
26.09.2016, 11:32
    #39315456
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
Alexey TominПо сути, проблема изчезла после перезапуска IDEA?

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

Alexey TominМожет был глюк именно в ней и полечился после первого перезапуска?
Да. Скорее всего. Или в мавене. Проект запускается там же где и финальная сборка. Может какой-то процесс в фоне начинал фильтровать этот файл. Фиг его знает. Пробовал повторить - не получилось.

Еще один довод против конкуренции, в том что я ставил Method Breakpoint. В результате чего проект запускался на много дольше. Соотвественно и конкуренция должна быть совершенно другая.

Сейчас я подозреваю что база валялась в ресурсах, и мавен копировал ее поверх. Надо попробовать lck файл прогнать через фильтр мавена и посмотреть что получится.
...
Рейтинг: 0 / 0
26.09.2016, 11:45
    #39315463
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мистика
В общем, спасибо всем. Похоже дело было в Maven и звезды так сложились.
Сегодняшний таймштамп в байтах попадает в ASCII. Перемотал на пятницу, скопировал lock файл в ресурсы и там появился BOM после фильтрации. Стабильных 22 байта с тремя BOM не выходит. Но это лучшая теория на данный момент.

Хотя, мне кажется, что базу из ресурсов я грохнул почти сразу, чтобы она никак не влияла. Но, похоже, я ошибаюсь и дошел до этого только к вечеру.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Мистика / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]