Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Introduction

unimr.memcachedlock implements a distributed “soft” locking mechanism using memcached. It provides factory functions and decorators for a primitive locking, a reentrant locking and a special locking for zeo-clients.

The native locking methods of python’s threading module supports thread safe locking and therefore, provides only full locking support for single zope installations. However, zeo-clients have no locking mechanism beetween each other for concurrent write operations on identical objects (e.g. Catalog) and are unnecessarily stressed to resolve ConflictErrors on heavy load. The reason for this problem is the optimistic concurrency control of the ZODB which primarly prepares the changes of an object (in many cases expensive calculations) and thereafter checks the validity of the object for the write process. The higher the number of writes on the same object the higher the risk that a concurrent zeo-client has already invalidated the object while another zeo-client has still this object in use. The client with the invalidated object is constrained to roll back its changes and to recalculate the changes based on the refreshed object. At worst, this state goes in circles and results in a ConflictError. The optimistic concurrency control therefore perfectly fits only concurrent write operations on distinct objects.

Memcache locking overcomes this problem because it extends the regular concurrency mechanism by a shared locking beetween all involved zeo-clients by serializing the concurrent write operations before a ConflictError is provoked. This mechanism is also known as pessimistic concurrency control.

Risks

There is no risk of loosing data within a zope environment because memcachedlock will always fall back to zope’s transaction control.

Usage

unimr.memcachedlock easily serializes concurrent writes

>>> from unimr.memcachedlock import memcachedlock
...
... # define an invariant unique key of an instance
... def get_key(fun,*args,**kargs):
...    fun, instance = args[0:2]
...    return '/'.join(instance.getPhysicalPath())
>>> # lock decorator
... @memcachedlock.lock(get_key)
... def concurrent_write(self, *args, **kw):
...    """  method which produces many conflict errors (bottle neck)"""
...    # ...

or for recursive function calls

>>> # rlock decorator
... @memcachedlock.rlock(get_key)
... def concurrent_write(self, *args, **kw):
...    """  method which produces many conflict errors (bottle neck)"""
...    # ...

or for function calls of zeo-clients providing a special ConflictError handling to interact properly with the optimistic concurrency control

>>> # zlock decorator
... @memcachedlock.zlock(get_key)
... def concurrent_write(self, *args, **kw):
...    """  method which produces many conflict errors (bottle neck)"""
...    # ...

The decorators @memcachedlock.lock, @memcachedlock.rlock or @memcachedlock.zlock take exactly one argument

get_key

function which returns an invariant unique key of an instance known by all zeo-clients (required)

and two optional keywords:

timeout

livetime in seconds of the lock (default: 30)

interval

retrial interval of the lock check in seconds (default: 0.05)

Catalog Patch

unimr.memcachedlock already includes a patch for zope’s Catalog to enable locking for the catalog_object method. Uncomment corresponding lines in configure.zcml of this package.

Configuring memcached servers

You can configure one ore mor memcached servers by adding the environment variable MEMCACHEDLOCK_SERVERS to the buildout.cfg as follows (default server: 127.0.0.1:11211):

[instance]
...
zope-conf-additional =
  <environment>
     MEMCACHEDLOCK_SERVERS <ip/hostname of host1>:<port>,<ip/hostname of host2>:<port>
  </environment>

Todo

  • Tests …

  • Pessimistic concurrency control implementation by means of native zeo server protocol.

Changelog

2010-09-23: 0.1 - RC2

  • ConflictError handling for zeo clients enhanced

2009-05-08: 0.1 - RC1

  • Initial release

Metadata

Release files for unimr.memcachedlock 0.1rc2-r144828

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for unimr.memcachedlock 0.1rc2-r144828
File Size Uploaded Provenance
unimr.memcachedlock-0.1rc2-r144828.tar.gz 7.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for unimr.memcachedlock 0.1rc2-r144828
File Interpreter ABI Platform
unimr.memcachedlock-0.1rc2_r144828-py2.4.egg Legacy Egg format - - Details

Total release size: 22.4 kB

Release files / unimr.memcachedlock-0.1rc2-r144828.tar.gz

Download URL unimr.memcachedlock-0.1rc2-r144828.tar.gz
Size 7.2 kB
Tags Source
SHA-256 checksum
How to use checksums
088d199bb65aa9759de1c388fd4d52b7739b03297a8745574dfe12147a81877c
BLAKE2b-256 checksum
How to use checksums
1ae6bd712eb9856f8707df70c2e438868dc6988cccdc84a9bca1e99c49721e70
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / unimr.memcachedlock-0.1rc2_r144828-py2.4.egg

Download URL unimr.memcachedlock-0.1rc2_r144828-py2.4.egg
Size 15.2 kB
Tags Egg
SHA-256 checksum
How to use checksums
0d15da4a1dd94df9889ac5eae654c24749f1d447bbd2412904d3258c0c269441
BLAKE2b-256 checksum
How to use checksums
27b427b8217b50544269253da1c5dc434d1ab7a4162f6ccbbeeef405176629fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Security for unimr.memcachedlock 0.1rc2-r144828

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page