[Zope] Re: database conflict errors

Florent Guillaume fg at nuxeo.com
Thu Jun 29 20:46:47 EDT 2006


Jean-Marc Orliaguet wrote:
> Tres Seaver wrote:
>> -----BEGIN PGP SIGNED MESSAGE-----
>> Hash: SHA1
>>
>> Jonathan wrote:
>>  
>>> ----- Original Message ----- From: "Tres Seaver" 
>>> <tseaver-npLdOuuzvjyaMJb+Lgu22Q at public.gmane.org>
>>>    
>>>> Jonathan wrote:
>>>>      
>>>>> During recent load testing of a new application 3.1% to 7.6% of all
>>>>> http requests resulted in conflict errors
>>>>> (3.1% with 10 simultaneous users; 7.6% with 50 simultaneous users).
>>>>>
>>>>> The conflict error occurs when the application attempts to write a
>>>>> small image object into a temporary folder, and each conflict error
>>>>> generates the same traceback:
>>>>>
>>>>> ConflictError: database conflict error (oid 0x07, class
>>>>> Products.TemporaryFolder.TemporaryFolder.SimpleTemporaryContainer)
>>>>>
>>>>>
>>>>>
>>>>> I am running Zope 2.9.2 on CentOS 4.3 (linux).
>>>>>
>>>>> Does anyone have any ideas as to what I could do to reduce/eliminate
>>>>> these conflict errors?
>>>>>         
>>>> First, make sure that your application is not trying to overwrite the
>>>> *same* image in each request.  If it needs to do that, then the
>>>> conflicts are unavoidable.
>>>>
>>>> Next, making simultaneous writes into any naive container is going to
>>>> cause conflicts.  You need to think carefully about how you want those
>>>> writes to work, and plan to minimize conflicts:
>>>>
>>>>  - Use a BTreeFolder, rather than a normal OFS.Folder (or derivative).
>>>>
>>>>  - Arrange for the IDs of your images to be substantially different,
>>>>    typically by mangling in a random number (or, for instance, the
>>>>    microseconds value of the current timestamp).
>>>>       
>>> The ids are assigned sequentially, so they never collide, but should id
>>> be 'substantially different' to improve BTreeFolder2 performance?
>>>     
>>
>> Sequential IDs can be problematic:  they lead to many more bucket splits
>> (and therefore conflicts) in the BTree.  Adding some "entropy" (like a
>> random number or the milliseconds of the time) *earlier* in the key than
>> any sequence number, will help keep splits down to a minimum.
>>
>>   
> 
> that's interesting. I did a test once to see what effect it would have 
> to add objects with a completely random id to a BTree folder (OOBTree in 
> that case) instead of using the object's type nam and add a number at 
> the end - and the result was the opposite in term of read performance. 
> Looking up keys was much faster if the ids followed a pattern like:
> 
> - something-1
> - something-2
> ...

Sure, in single-threaded mode this will decrease performance because the 
keys are spread randomly among all the buckets so many more buckets get 
written.

But in multi-threaded mode, this very spreading leads to better conflict 
resolution behavior.

Florent

-- 
Florent Guillaume, Nuxeo (Paris, France)   Director of R&D
+33 1 40 33 71 59   http://nuxeo.com   fg at nuxeo.com


More information about the Zope mailing list