Explorar el Código

Lazy transactions

Jonas Borgström hace 13 años
padre
commit
f56b6bf4cc
Se han modificado 1 ficheros con 15 adiciones y 5 borrados
  1. 15 5
      darc/store.py

+ 15 - 5
darc/store.py

@@ -93,15 +93,18 @@ class Store(object):
         names.sort(reverse=reverse)
         names.sort(reverse=reverse)
         return names
         return names
 
 
-    def open_index(self, head):
+    def open_index(self, head, read_only=False):
         if head is None:
         if head is None:
             self.index = NSIndex.create(os.path.join(self.path, 'index.tmp'))
             self.index = NSIndex.create(os.path.join(self.path, 'index.tmp'))
             self.segments = {}
             self.segments = {}
             self.compact = set()
             self.compact = set()
         else:
         else:
-            shutil.copy(os.path.join(self.path, 'index.%d' % head),
-                        os.path.join(self.path, 'index.tmp'))
-            self.index = NSIndex(os.path.join(self.path, 'index.tmp'))
+            if read_only:
+                self.index = NSIndex(os.path.join(self.path, 'index.%d') % head)
+            else:
+                shutil.copy(os.path.join(self.path, 'index.%d' % head),
+                            os.path.join(self.path, 'index.tmp'))
+                self.index = NSIndex(os.path.join(self.path, 'index.tmp'))
             hints = read_msgpack(os.path.join(self.path, 'hints.%d' % head))
             hints = read_msgpack(os.path.join(self.path, 'hints.%d' % head))
             if hints['version'] != 1:
             if hints['version'] != 1:
                 raise ValueError('Unknown hints file version: %d' % hints['version'])
                 raise ValueError('Unknown hints file version: %d' % hints['version'])
@@ -185,10 +188,11 @@ class Store(object):
     def rollback(self):
     def rollback(self):
         """
         """
         """
         """
+        self._active_txn = False
         self.io = LoggedIO(self.path, self.max_segment_size, self.segments_per_dir)
         self.io = LoggedIO(self.path, self.max_segment_size, self.segments_per_dir)
         if self.io.head is not None and not os.path.exists(os.path.join(self.path, 'index.%d' % self.io.head)):
         if self.io.head is not None and not os.path.exists(os.path.join(self.path, 'index.%d' % self.io.head)):
             self.recover(self.path)
             self.recover(self.path)
-        self.open_index(self.io.head)
+        self.open_index(self.io.head, read_only=True)
 
 
     @deferrable
     @deferrable
     def get(self, id):
     def get(self, id):
@@ -200,6 +204,9 @@ class Store(object):
 
 
     @deferrable
     @deferrable
     def put(self, id, data):
     def put(self, id, data):
+        if not self._active_txn:
+            self._active_txn = True
+            self.open_index(self.io.head)
         try:
         try:
             segment, _ = self.index[id]
             segment, _ = self.index[id]
             self.segments[segment] -= 1
             self.segments[segment] -= 1
@@ -214,6 +221,9 @@ class Store(object):
 
 
     @deferrable
     @deferrable
     def delete(self, id):
     def delete(self, id):
+        if not self._active_txn:
+            self._active_txn = True
+            self.open_index(self.io.head)
         try:
         try:
             segment, offset = self.index.pop(id)
             segment, offset = self.index.pop(id)
             self.segments[segment] -= 1
             self.segments[segment] -= 1