[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#7789) Unreliable mdb_env_set_mapsize()



On 25/07/14 12:54, Howard Chu wrote:
> h.b.furuseth@usit.uio.no wrote:
>> Another problem:
>>
>> With an MDB_RDONLY environment on Windows, env->me_mapsize
>> does not seem to affect the actual map size or vice versa.
>> mdb_env_map() does
>>         /* Don't set explicit map size, use whatever exists */
>>
>> If the user sets a mapsize bigger than the current file,
>
> That is impossible on Windows. The OS will not allow a mapsize bigger
> than the filesize.

Clarification: If the Windows user sets MDB_env.me_mapsize
bigger than the file size, then as far as I can tell the read-
only MDB_env will think the map is bigger than it is.  Then:

>> and another process resizes the map and grows the DB into
>> the new size, then the RDONLY process will not discover
>> in mdb_txn_renew0() that its map is too small. (...)
>
> That change was made to accomodate opening of an mdb_copy'd DB file in
> read-only mode. Since mdb_copy only copies the used pages, the resulting
> file will be smaller than the configured mapsize. If you attempt to map
> this file as-is with the configured mapsize, it will fail. You would
> have to resize the file, but since the env is opened read-only, you
> should not make any such change to the file.
>
> We could alternatively change mdb_copy to explicitly set the filesize to
> match the mapsize at the end of the copy, and then this particular hack
> wouldn't be needed.

With the several ways to play games with mapsize, the hack will
be needed anyway.  So I expect lmdb should implement and document:

   On Windows, read-only environments ignore the configured mapsize
   and instead use the file size as of the last mdb_env_set_mapsize()
   or mdb_env_open().  MDB_envinfo.me_mapsize will show that size.
   [So does MDB_env.me_mapsize.]
   For a bigger map, grow the file first - e.g. by opening the
   environment with write access and a bigger mapsize.

Setting filesize=mapsize: MDB_env.me_mapsize or MDB_meta.mm_mapsize?
(I don't really care though, since the "set mapsize=filesize"
suggestion addresses my original concern.)

OTOH mdb_copy seems the natural place for a "shrink mm_mapsize"
option, since it can only grow in an existing file.  E.g. set it
to the minimum possible or to MDB_env.me_mapsize and let the user
grow it to a bigger size later if needed.