win32 _dosmaperr()

Поиск
Список
Период
Сортировка
От Qingqing Zhou
Тема win32 _dosmaperr()
Дата
Msg-id db4hlo$sm4$1@news.hub.org
обсуждение исходный текст
Список pgsql-hackers
There were several reports of "unable to read/write" on Pg8.0.x win32 port:

http://archives.postgresql.org/pgsql-bugs/2005-02/msg00181.php

I encounter this several times and finally I catch the GetLastError()
number. It is
   32, ERROR_SHARING_VIOLATION   The process cannot access the file because it is being used by another
process.

But PG server error message is "invalid parameter" which makes this error
difficult to understand and track. After examing win32 CRT's _dosmaperr()
implementation, I found they failed to transalte ERROR_SHARING_VIOLATION, so
the default errno is set to EINVAL. To solve it, we can do our own
_dosmaperr(GetLastError()) again if read/write failed. Unfortunately our
_dosmaperr() failed to do so either, so here is a patch of error.c. Also, I
raised the error level to NOTICE for better bug report. If this is
acceptable, I will patch FileRead()/FileWrite() etc.

However, I am very sure why this could happen. That is, who uses the data
file in a non-sharing mode? There are many possibilities, a common concensus
is [Anti-]virus software. Yes, I do have one installed. If we can confirm
this, then we could at least print a hint message.


Regards,
Qingqing


Index: error.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/port/win32/error.c,v
retrieving revision 1.4
diff -c -r1.4 error.c
*** error.c 31 Dec 2004 22:00:37 -0000 1.4
--- error.c 13 Jul 2005 09:04:57 -0000
***************
*** 72,77 ****
--- 72,80 ----   ERROR_NO_MORE_FILES, ENOENT  },  {
+   ERROR_SHARING_VIOLATION, EACCES
+  },
+  {   ERROR_LOCK_VIOLATION, EACCES  },  {
***************
*** 180,188 ****   }  }

!  ereport(DEBUG4,
!    (errmsg_internal("Unknown win32 error code: %i",
!         (int) e)));  errno = EINVAL;  return; }
--- 183,192 ----   }  }

!  ereport(NOTICE,
!     (errmsg_internal("Unknown win32 error code: %i. "
!          "Please report to <pgsql-bugs@postgresql.org>.",
!           (int) e)));  errno = EINVAL;  return; }




В списке pgsql-hackers по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: windows regression failure - prepared xacts
Следующее
От: David Fetter
Дата:
Сообщение: Toward pg_upgrade