Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / could not open relation x/x/x: Invalid argument / 10 сообщений из 10, страница 1 из 1
20.09.2006, 15:54
    #34000355
SUKER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
could not open relation x/x/x: Invalid argument
Здравствуйте, столкнулся вот с такой проблемой:
Клиент и база на одной машине Win2000 сп4 рус. Постгрес:
PostgreSQL 8.1.4 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.2 (mingw-special)
Есть приложение (несколько нитей, в каждой свой коннект), каждая нитка отсылает одинаковые запросы в базу (libpq через PQprepare/PQexecPrepared и PQexec). Запросы повторяются, всего их 19 штук и крутятся по кругу в каждой нитке. Так вот если количество нитей > 1, то время от времени возникает такая ошибка:
could not open relation x/x/x: Invalid argument (с разными значениями вместо х). Причем может вылезти на любом запросе и не важно на PQexec или PQprepare, в качестве релейшена в ошибке выступает либо таблица из запроса, либо ее индекс, работает, работает а потом хоп - ошибка :( потом опять все ок и т.д. - рандом полный :( Если нитка одна, то все ок. Получив полную информацию об ошибке, оказалось, что это ф-ия mdopen, строка 364, смотрю туда:
Код: plaintext
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.
38.
39.
40.
static MdfdVec * mdopen(SMgrRelation reln, bool allowNotFound)
{
	MdfdVec    *mdfd;
	char	   *path;
	File		fd;

	/* No work if already open */
	if (reln->md_fd)
		return reln->md_fd;

	path = relpath(reln->smgr_rnode);

	fd = PathNameOpenFile(path, O_RDWR | PG_BINARY,  0600 );

	if (fd <  0 )
	{
		/*
		 * During bootstrap, there are cases where a system relation will be
		 * accessed (by internal backend processes) before the bootstrap
		 * script nominally creates it.  Therefore, accept mdopen() as a
		 * substitute for mdcreate() in bootstrap mode only. (See mdcreate)
		 */
		if (IsBootstrapProcessingMode())
			fd = PathNameOpenFile(path, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,  0600 );
		if (fd <  0 )
		{
			pfree(path);
			if (allowNotFound && errno == ENOENT)
				return NULL;
			ereport(ERROR,
					(errcode_for_file_access(),
					 errmsg("could not open relation %u/%u/%u: %m",
							reln->smgr_rnode.spcNode,
							reln->smgr_rnode.dbNode,
							reln->smgr_rnode.relNode)));
		}
	}

	pfree(path);
...........................................................................................
Получается что засада в синхронизации запросов постгресом? У кого-ть есть соображения на это счет? Или надо синхронизировать нити на момент не допускания посылки одновременных запросов (если так, то как он вообще работает тогда :))????
...
Рейтинг: 0 / 0
20.09.2006, 16:33
    #34000519
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
could not open relation x/x/x: Invalid argument
SUKER...Получается что засада в синхронизации запросов постгресом? У кого-ть есть соображения на это счет? Или надо синхронизировать нити на момент не допускания посылки одновременных запросов (если так, то как он вообще работает тогда :))????

на каждый коннект к постгрессу создаёться отдельный процесс(форточки) где и обрабатываються Ваши запросы. Думаю, что Вы юзаете ОДИН коннекшен к базе - отсюда и траблы... Либо в каждом потоке открывайте по коннекшенну...Либо обеспечьте ОДИН коннект в ОДНОЙ нитке и гоните всё через неё последовательно...


с уважением
(круглый)
...
Рейтинг: 0 / 0
20.09.2006, 16:56
    #34000642
SUKER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
could not open relation x/x/x: Invalid argument
kolobok0на каждый коннект к постгрессу создаёться отдельный процесс(форточки) где и обрабатываються Ваши запросы. Думаю, что Вы юзаете ОДИН коннекшен к базе - отсюда и траблы... Либо в каждом потоке открывайте по коннекшенну...Либо обеспечьте ОДИН коннект в ОДНОЙ нитке и гоните всё через неё последовательно...
Спасибо, но я же написал: SUKER(несколько нитей, в каждой свой коннект и это 100%. Дальнейшие изыскания проблемы привели к следующим результатам:
1) Если конектиться к удаленному серверу: линух + постгрес 7.4, то все работает на ура - без ошибок.
2) Если коннектится к удаленному серверу: виндовсХП сп2 + постгрес 8.1.4, то тоже самое что и у меня локально - периодически возникают вышеописанные ошибки :(

Есть еще мнения?
...
Рейтинг: 0 / 0
20.09.2006, 17:19
    #34000751
Andrew Sagulin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
could not open relation x/x/x: Invalid argument
SUKERЕсть еще мнения?

По идее постгресу должно быть всё равно, из потоков к нему обращаются или из отдельных приложений. Можно попробовать запустить все эти потоки как отдельные приложения, чтобы отделить потенциально возможное влияние многопоточности.
...
Рейтинг: 0 / 0
20.09.2006, 17:37
    #34000821
SUKER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
could not open relation x/x/x: Invalid argument
Andrew SagulinПо идее постгресу должно быть всё равно, из потоков к нему обращаются или из отдельных приложений. Можно попробовать запустить все эти потоки как отдельные приложения, чтобы отделить потенциально возможное влияние многопоточности.

Я думаю ему и есть все равно - ошибка будет и в том и в том случае, вот только времени рыть в этом направлении у меня нет :( Боюсь, что осталось выяснить: это глюк восьмерки как таковой (сильно сомневаюсь), или же это глюк 8-ки под виндой....
...
Рейтинг: 0 / 0
21.09.2006, 08:36
    #34001773
Andrew Sagulin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
could not open relation x/x/x: Invalid argument
Если это бага PG 8 под Windows, связанная с race conditions, то она должна была бы выплывать при любой многопользовательской работе, а здесь этого не слышно (мало юзают 8-ку под Windows?).
Нет, а всё-таки, сложно скомпилировать Ваше приложение для работы с одним потоком и запустить пару десятков экземпляров приложения?
А то, если это стопроцентно баг PG, можно отослать багрепорт разработчкам...
...
Рейтинг: 0 / 0
21.09.2006, 09:37
    #34001896
SUKER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
could not open relation x/x/x: Invalid argument
Andrew SagulinЕсли это бага PG 8 под Windows, связанная с race conditions, то она должна была бы выплывать при любой многопользовательской работе, а здесь этого не слышно (мало юзают 8-ку под Windows?).
Нет, а всё-таки, сложно скомпилировать Ваше приложение для работы с одним потоком и запустить пару десятков экземпляров приложения?
А то, если это стопроцентно баг PG, можно отослать багрепорт разработчкам...

Скопилял - достаточно двух приложений :) В нете подобные сообщения встечаются, но на них либо не отвечают, либо у одного, например, решилось исключением папки постгреса из сканируемых антивирусом (у меня не помогло)... Видимо действительно мало у кого сервер на винде + чтобы одинаковые запросы часто одновременно приходили :)
Ставлю федору на виртул машину, пихну туда восьмерку и проверю... НО судя по сорсам данная область не сильно изминилась по сравнению с 7.4 так что думаю дело именно в винде :(
...
Рейтинг: 0 / 0
21.09.2006, 13:31
    #34002929
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
could not open relation x/x/x: Invalid argument
SUKER...Скопилял - достаточно двух приложений :) В нете подобные сообщения встечаются, но на них либо не отвечают, либо у одного, например, решилось исключением папки постгреса из сканируемых антивирусом (у меня не помогло)... Видимо действительно мало у кого сервер на винде + чтобы одинаковые запросы часто одновременно приходили :)
Ставлю федору на виртул машину, пихну туда восьмерку и проверю... НО судя по сорсам данная область не сильно изминилась по сравнению с 7.4 так что думаю дело именно в винде :(

8 сервак на форточках...
клиенты коннектяться...гоняли более двух... монстроподобный функционал в виде хранимок на си плас плас (рекурсии, маленькая кучка таблиц, различные типы, мэнеджэт-анмэнеджэт)..описанных проблем не обнаружено...


(круглый)
...
Рейтинг: 0 / 0
21.09.2006, 13:40
    #34002971
SUKER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
could not open relation x/x/x: Invalid argument
kolobok08 сервак на форточках...
клиенты коннектяться...гоняли более двух... монстроподобный функционал в виде хранимок на си плас плас (рекурсии, маленькая кучка таблиц, различные типы, мэнеджэт-анмэнеджэт)..описанных проблем не обнаружено...
(круглый)

Хм, ну если бы я для тестов в нитках запросы в цикл не загнал, то тоже может и не заметил бы (кстати вспомнил что подомная ошика уже один раз проскакивала на другом приложении стороннего разработчика, но тогда я на нее не обратил внимания). Ща уже фидора поставилась - протестю :) А так впринципе можно будет написать тестовую программульку чтобы запускала две нитки и крутила там запрос в цикле...
...
Рейтинг: 0 / 0
22.09.2006, 13:54
    #34006182
SUKER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
could not open relation x/x/x: Invalid argument
Протестил на федоре:
с PostgreSQL 8.1.3 on i386-redhat-linux-gnu, compiled by GCC i386-redhat-linux-gcc (GCC) 4.1.0 20060210 (Red Hat 4.1.0-0.24)

опять же никаких проблем....

Если будет время, накатаю быденький тест...
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / could not open relation x/x/x: Invalid argument / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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