@@ -176,6 +176,8 @@ def __init__(self, sharedarea_id=SHAREDAREA_ID, namespace="", stats=False, label
176176 self ._stats = stats
177177 self ._labels = tuple (sorted (labels .items (), key = lambda x : x [0 ]))
178178
179+ self ._syncs = 0
180+
179181 self ._m = uwsgi .sharedarea_memoryview (self ._sharedarea_id )
180182
181183 self .init_memory ()
@@ -197,17 +199,33 @@ def metric_name(self, name):
197199 """
198200 return ":" .join ([self ._namespace , name ])
199201
202+
203+ @staticmethod
204+ def get_unique_id ():
205+ try :
206+ return uwsgi .worker_id ()
207+ except Exception :
208+ try :
209+ return uwsgi .mule_id ()
210+ except Exception :
211+ return os .getpid ()
212+ return "unknown"
213+
200214 def declare_metrics (self ):
201215 return {
202- "memory_sync" : Counter (self .metric_name ("memory_read" ), "UWSGI shared memory syncs" , ("sharedarea" , ) + self ._labels ),
216+ "memory_sync" : Counter (self .metric_name ("memory_read" ), "UWSGI shared memory syncs" , ("sharedarea" , "id" ) + self ._labels ),
203217 "memory_size" : Gauge (self .metric_name ("memory_size" ), "UWSGI shared memory size" , ("sharedarea" , ) + self ._labels ),
204218 "num_keys" : Gauge (self .metric_name ("num_keys" ), "UWSGI num_keys" , ("sharedarea" , ) + self ._labels )
205219 }
206220
207221 def collect (self ):
222+ labels = self ._labels + (("sharedarea" , self ._sharedarea_id ), ("id" , self .get_unique_id ()))
223+ metric = self ._collectors ["memory_sync" ]
224+ metric .add_sample (labels , metric .build_sample (labels , ( (TYPES .GAUGE , metric .name , "" , labels , self ._syncs ), )))
225+
226+ yield metric
227+
208228 labels = self ._labels + (("sharedarea" , self ._sharedarea_id ), )
209- # metric = self._collectors["memory_sync"]
210- # metric.add_sample(labels, metric.build_sample(labels, ( (TYPES.GAUGE, metric.name, "", labels, ) ))
211229
212230 # yield metric
213231 metric = self ._collectors ["memory_size" ]
@@ -252,6 +270,8 @@ def serialize_key(self, key):
252270 return val
253271
254272 def unserialize_key (self , serialized_key ):
273+ if not serialized_key :
274+ raise RuntimeError ("Invalid serialized key" )
255275 return marshal .loads (serialized_key )
256276
257277 def get_area_size_with_lock (self ):
@@ -319,7 +339,7 @@ def read_memory(self):
319339 def load_exists_positions (self ):
320340 """Load all keys from memory
321341 """
322-
342+ self . _syncs += 1
323343 self ._used = self .get_area_size ()
324344 self ._sign = self .get_area_sign ()
325345
@@ -376,6 +396,7 @@ def read_key_string(self, position, size):
376396 key_string_bytes = self .m [self .get_slice (position , size )]
377397 return struct .unpack (b"{0}s" .format (size ), key_string_bytes )[0 ]
378398
399+
379400 def read_key_value (self , position ):
380401 """Read float value of position
381402
@@ -444,6 +465,9 @@ def inc_value(self, key, value):
444465 except InvalidUWSGISharedareaPagesize as e :
445466 logger .error ("Invalid sharedarea pagesize {0} bytes" .format (len (self ._m )))
446467 return 0
468+ except Exception as e :
469+ logger .error (e , exc_info = True )
470+ return 0
447471
448472 def write_value (self , key , value ):
449473 """Write value to shared memory
@@ -461,6 +485,9 @@ def write_value(self, key, value):
461485 except InvalidUWSGISharedareaPagesize as e :
462486 logger .error ("Invalid sharedarea pagesize {0} bytes" .format (len (self ._m )))
463487 return None
488+ except Exception as e :
489+ logger .error (e , exc_info = True )
490+ return 0
464491
465492 def get_value (self , key ):
466493 """Read value from shared memory
@@ -474,6 +501,9 @@ def get_value(self, key):
474501 except InvalidUWSGISharedareaPagesize :
475502 logger .error ("Invalid sharedarea pagesize {0} bytes" .format (len (self ._m )))
476503 return 0
504+ except Exception as e :
505+ logger .error (e , exc_info = True )
506+ return 0
477507
478508 @property
479509 def is_actual (self ):
@@ -495,7 +525,10 @@ def lock(self):
495525 if not self .wlocked and not self .rlocked :
496526 self .wlocked , self .rlocked = lock_id , lock_id
497527 uwsgi .sharedarea_wlock (self ._sharedarea_id )
498- yield
528+ try :
529+ yield
530+ except Exception as e :
531+ logger .error (e , exc_info = True )
499532 uwsgi .sharedarea_unlock (self ._sharedarea_id )
500533 self .wlocked , self .rlocked = False , False
501534 else :
@@ -507,7 +540,10 @@ def rlock(self):
507540 if not self .rlocked :
508541 self .rlocked = lock_id
509542 uwsgi .sharedarea_rlock (self ._sharedarea_id )
510- yield
543+ try :
544+ yield
545+ except Exception as e :
546+ logger .error (e , exc_info = True )
511547 uwsgi .sharedarea_unlock (self ._sharedarea_id )
512548 self .rlocked = False
513549 else :
@@ -527,14 +563,17 @@ def clear(self):
527563 self ._positions .clear ()
528564
529565 def get_items (self ):
530- self .validate_actuality ()
566+ with self .rlock ():
567+ self .validate_actuality ()
531568
532569 for key , position in self ._positions .items ():
533570 yield self .unserialize_key (key ), self .read_key_value (position [2 ])
534571
535572 def inc_items (self , items ):
536- self . validate_actuality ()
573+
537574 with self .lock ():
575+ self .validate_actuality ()
576+
538577 for key , value in items :
539578 try :
540579 positions , created = self .get_key_position (self .serialize_key (key ), value )
@@ -543,10 +582,15 @@ def inc_items(self, items):
543582 self .write_key_value (positions [2 ], self .read_key_value (positions [2 ]) + value )
544583 except InvalidUWSGISharedareaPagesize :
545584 logger .error ("Invalid sharedarea pagesize {0} bytes" .format (len (self ._m )))
585+ except Exception as e :
586+ logger .error (e , exc_info = True )
587+ return 0
546588
547589 def write_items (self , items ):
548- self . validate_actuality ()
590+
549591 with self .lock ():
592+ self .validate_actuality ()
593+
550594 for key , value in items :
551595 try :
552596 positions , created = self .get_key_position (self .serialize_key (key ), value )
@@ -555,6 +599,9 @@ def write_items(self, items):
555599 self .write_key_value (positions [2 ], value )
556600 except InvalidUWSGISharedareaPagesize :
557601 logger .error ("Invalid sharedarea pagesize {0} bytes" .format (len (self ._m )))
602+ except Exception as e :
603+ logger .error (e , exc_info = True )
604+ return 0
558605
559606
560607class UWSGIFlushStorage (LocalMemoryStorage ):
0 commit comments