[cpif] Parch para que el backend BerkeleyDB funcione en Windows

Sergio Álvarez listas at xergio.net
Thu May 10 16:42:25 CEST 2007


Buenas a todos.

Jesús, aquí tienes un pequeño patch para que tu backend rule en
windows. Era cosa tan solo del lock. Es todo tuyo ;) aunque fijo que
quieres retocarlo más a tu estilo de programación. Eres libre,
toquetea lo que sea. Mando además los tests del CPIF:

Grabar esto en un archivo llamado __berkeleydb_storage.py:

--- __berkeleydb_storage.py	2007-05-10 16:25:22.328125000 +0200
+++ berkeleydb_storage.py	2007-05-10 16:33:44.734375000 +0200
@@ -467,19 +467,39 @@
       else :
         garbage_collection_method=garbage_collection_inline_prefetch

+
     import os
-    import fcntl
     assert directoryname
-    self._lock=os.open(directoryname+os.sep+"storage.lock",os.O_RDWR
| os.O_CREAT,0600)
+    storagelock = directoryname+os.sep+"storage.lock"
     try :
-      flags=fcntl.LOCK_EX
-      if read_only :
-        flags=fcntl.LOCK_SH
-      fcntl.flock(self._lock,flags | fcntl.LOCK_NB)
+      if os.name == 'nt':
+        if os.path.exists(storagelock):
+          if read_only:
+            fomode = 'rb'
+          else:
+            fomode = 'r+b'
+        else:
+          fomode = 'w+b'
+        self._lock = open(storagelock, fomode)
+        # this part of code is inspired in durus/file.py
+        import win32con, win32file, pywintypes
+        win32file.LockFileEx(
+          win32file._get_osfhandle(self._lock.fileno()),
+          (win32con.LOCKFILE_EXCLUSIVE_LOCK |
+          win32con.LOCKFILE_FAIL_IMMEDIATELY),
+          0, -65536, pywintypes.OVERLAPPED())
+      else:
+        self._lock=os.open(storagelock,os.O_RDWR | os.O_CREAT,0600)
+        import fcntl
+        flags=fcntl.LOCK_EX
+        if read_only :
+          flags=fcntl.LOCK_SH
+        fcntl.flock(self._lock,flags | fcntl.LOCK_NB)
     except :
        os.close(self._lock)
        raise RuntimeError("'%s' storage already locked" %directoryname)

+
     def config_dbenv() :
       dbenv=bsddb.db.DBEnv()
       dbenv.set_cachesize(0,cachesize)



Tests:


C:\_xergio\_p\_py\cpif\tests>python ejemplo2.py
Commit inicial...
Realizamos 89.887640 inserciones por segundo
En un caso muy pesimista, tenemos 44.290903 actualizaciones de hilos
no leidos por segundo

C:\_xergio\_p\_py\cpif\tests>python ejemplo1.py
Commit inicial...
Realizamos 170.648467 inserciones por segundo
En un caso muy pesimista, tenemos 71.194646 actualizaciones de hilos
no leidos por segundo


Saludos.

-- 
Sergio Álvarez Muñoz (xergio)
León-Madrid - Spain

email: mail at xergio.net
xmpp: xergio at jabberland.com
web: http://xergio.net



More information about the cpif mailing list