parameters: (self, table_id, key, txid, timeout)
docstring: Clean a mask off of an object.
  
          This method won't necessarily do anything productive every time it's
          called, so it should be called inside a retry loop.
  
          @param table_id: The table containing the masked object.
          @type  table_id: C{int}
  
          @param key: The object ID of the masked object.
          @type  key: C{int}
  
          @param txid: The transaction which is masking the object.
          @type  txid: C{int}
  
          @param timeout: The time at which the mask expires.
          @type  timeout: C{int}
docstring_summary: Clean a mask off of an object.
docstring_tokens: Clean a mask off of an object .
function: def _clean(self, table_id, key, txid, timeout):
          """Clean a mask off of an object.
  
          This method won't necessarily do anything productive every time it's
          called, so it should be called inside a retry loop.
  
          @param table_id: The table containing the masked object.
          @type  table_id: C{int}
  
          @param key: The object ID of the masked object.
          @type  key: C{int}
  
          @param txid: The transaction which is masking the object.
          @type  txid: C{int}
  
          @param timeout: The time at which the mask expires.
          @type  timeout: C{int}
          """
  
          rr = ramcloud.RejectRules(object_doesnt_exist=True)
          try:
              mtdata, mtversion = RAMCloud.read_rr(self, self.tx_table, txid, rr)
          except ramcloud.NoObjectError:
              # txid doesn't exist, so wait or write tombstone
              if time.time() > timeout:
                  # try to write a tombstone
                  if self._write_tombstone(txid) is not None:
                      self._unmask_object(table_id, key, txid)
              # caller will retry if the object still needs cleaning
          else:
              try:
                  mt = unserialize(mtdata)
              except pickle.BadPickleGet:
                  raise self.InconsistencyError("Not a pickled object")
              if type(mt) == Tombstone:
                  self._unmask_object(table_id, key, txid)
              elif type(mt) == MiniTransaction:
                  self._finish_mt(mt, txid, mtversion)
              else:
                  raise self.InconsistencyError("Not a MiniTransaction or " +
                                                "Tombstone")
function_tokens: def _clean ( self , table_id , key , txid , timeout ) : rr = ramcloud . RejectRules ( object_doesnt_exist = True ) try : mtdata , mtversion = RAMCloud . read_rr ( self , self . tx_table , txid , rr ) except ramcloud . NoObjectError : # txid doesn't exist, so wait or write tombstone if time . time ( ) > timeout : # try to write a tombstone if self . _write_tombstone ( txid ) is not None : self . _unmask_object ( table_id , key , txid ) # caller will retry if the object still needs cleaning else : try : mt = unserialize ( mtdata ) except pickle . BadPickleGet : raise self . InconsistencyError ( "Not a pickled object" ) if type ( mt ) == Tombstone : self . _unmask_object ( table_id , key , txid ) elif type ( mt ) == MiniTransaction : self . _finish_mt ( mt , txid , mtversion ) else : raise self . InconsistencyError ( "Not a MiniTransaction or " + "Tombstone" )