- # Monitor only the specified slices
- if names and name not in names:
- continue
- #slices is populated from the pickle file
- #xid is populated from bwlimit (read from /etc/passwd)
- if slices.has_key(xid):
- slice = slices[xid]
- if time.time() >= (slice.time + period) or \
- usedbytes < slice.bytes or usedi2bytes < slice.i2bytes:
- # Reset to defaults every 24 hours or if it appears
- # that the byte counters have overflowed (or, more
- # likely, the node was restarted or the HTB buckets
- # were re-initialized).
- slice.reset(maxrate, maxexemptrate, usedbytes, usedi2bytes, data)
- else:
- # Update byte counts
- slice.update(maxrate, maxexemptrate, usedbytes, usedi2bytes, data)
+ # Get actual running values from tc.
+ # Update slice totals and bandwidth. {xid: {values}}
+ kernelhtbs = gethtbs(root_xid, default_xid)
+ logger.log("bwmon: Found %s running HTBs" % kernelhtbs.keys().__len__())
+
+ # The dat file has HTBs for slices, but the HTBs aren't running
+ nohtbslices = Set(slices.keys()) - Set(kernelhtbs.keys())
+ logger.log( "bwmon: Found %s slices in dat but not running." % nohtbslices.__len__() )
+ # Reset tc counts.
+ for nohtbslice in nohtbslices:
+ if live.has_key(nohtbslice):
+ slices[nohtbslice].reset( 0, 0, 0, 0, live[nohtbslice]['_rspec'] )
+
+ # The dat file doesnt have HTB for the slice, but slice is running and
+ # HTB exists
+ slicesnodat = Set(kernelhtbs.keys()) - Set(slices.keys())
+ logger.log( "bwmon: Found %s slices with HTBs but not in dat" % slicesnodat.__len__() )
+ for slicenodat in slicesnodat:
+ slices[slicenodat] = Slice(slicenodat,
+ live[slicenodat]['name'],
+ live[slicenodat]['_rspec'])
+
+ # Get new slices.
+ # Slices in GetSlivers but not running HTBs
+ newslicesxids = Set(live.keys()) - Set(kernelhtbs.keys())
+ logger.log("bwmon: Found %s new slices" % newslicesxids.__len__())
+
+ # Setup new slices
+ for newslice in newslicesxids:
+ # Delegated slices dont have xids (which are uids) since they haven't been
+ # instantiated yet.
+ if newslice != None and live[newslice].has_key('_rspec') == True:
+ if live[newslice]['name'] not in deaddb.keys():
+ logger.log( "bwmon: New Slice %s" % live[newslice]['name'] )
+ # _rspec is the computed rspec: NM retrieved data from PLC, computed loans
+ # and made a dict of computed values.
+ slices[newslice] = Slice(newslice, live[newslice]['name'], live[newslice]['_rspec'])
+ slices[newslice].reset( 0, 0, 0, 0, live[newslice]['_rspec'] )
+ # Double check time for dead slice in deaddb is within 24hr recording period.
+ elif (time.time() <= (deaddb[live[newslice]['name']]['slice'].time + period)):
+ deadslice = deaddb[live[newslice]['name']]
+ logger.log("bwmon: Reinstantiating deleted slice %s" % live[newslice]['name'])
+ slices[newslice] = deadslice['slice']
+ slices[newslice].xid = newslice
+ # Start the HTB
+ slices[newslice].reset(deadslice['slice'].MaxRate,
+ deadslice['slice'].Maxi2Rate,
+ deadslice['htb']['usedbytes'],
+ deadslice['htb']['usedi2bytes'],
+ live[newslice]['_rspec'])
+ # Bring up to date
+ slices[newslice].update(deadslice['slice'].MaxRate,
+ deadslice['slice'].Maxi2Rate,
+ deadslice['htb']['usedbytes'],
+ deadslice['htb']['usedi2bytes'],
+ live[newslice]['_rspec'])
+ # Since the slice has been reinitialed, remove from dead database.
+ del deaddb[deadslice]