29.04.2015 19:35, Howard Chu пишет:
Leonid Yuriev wrote:
> this is enough:
> - add assert(a->mv_key_size == sizeof(size_t)) into mdb_cmp_long()
> - make all test
> - see a coredump
OK, fixed in git. For the record, this affected MDB_INTEGERDUP, not
MDB_INTEGERKEY.
>>> 3) lmdb-backend:
>>> AttributeDescription->ad_type->sat_equality->smr_indexer()
>>> could generate a 5-byte sized ks.s. I can just imagine what this can
>>> create a
>>> many problems. For instance, when I adds the control for key size, it
>>> breaks
>>> test017-syncreplication-refresh. But I am not tested more.
>>
>> Not a bug, indexer keys are padded to 8 bytes.
>
> There is just NOT padded, I am sure.
> Also this is reason for unaligned-access in mdb_cmp_int() and
> mdb_cmp_long().
> It is similar to reproduce, just assert + make test.
Ah yes, the padding is currently only done on platforms that don't
allow unaligned access to ints (e.g. Sparc)
git rev e2a7617d17368b5787fc24fbd017623d00fe162b
> Seems that bugs together could break ordering of entries, this is
> detected by loop over all entries with mdb_cursor_get(..., MDB_NEXT) and
> comparing keys from previous step.
> All of this I was found today, during developing a mdb_chk tool.
Yes, I was made same local changes few hours ago.
This fixs miss-call for mdb_cmp_long().
But what about 5-bytes keys from indexer?
- How ones should be compared, as a 4-byte int without MSB, or as a
padded 8-byte long?
- Where is the padding code?
Leonid.