+ live = {}
+ # Get running slivers that should be on this node (from plc). {xid: name}
+ # db keys on name, bwmon keys on xid. db doesnt have xid either.
+ for plcSliver in nmdbcopy.keys():
+ live[bwlimit.get_xid(plcSliver)] = nmdbcopy[plcSliver]
+
+ logger.verbose("bwmon: Found %s instantiated slices" % live.keys().__len__())
+ logger.verbose("bwmon: Found %s slices in dat file" % slices.values().__len__())
+
+ # Get actual running values from tc.
+ # Update slice totals and bandwidth. {xid: {values}}
+ kernelhtbs = gethtbs(root_xid, default_xid)
+ logger.verbose("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.verbose( "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( {}, live[nohtbslice]['_rspec'] )
+ else:
+ logger.log("bwmon: Removing abondoned slice %s from dat." % nohtbslice)
+ del slices[nohtbslice]
+
+ # The dat file doesnt have HTB for the slice but kern has HTB
+ slicesnodat = set(kernelhtbs.keys()) - set(slices.keys())
+ logger.verbose( "bwmon: Found %s slices with HTBs but not in dat" % slicesnodat.__len__())
+ for slicenodat in slicesnodat:
+ # But slice is running
+ if live.has_key(slicenodat):
+ # init the slice. which means start accounting over since kernel
+ # htb was already there.
+ 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.verbose("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:
+ # Check to see if we recently deleted this slice.
+ 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( {}, 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
+ newvals = {"maxrate": deadslice['slice'].MaxRate * 1000,
+ "minrate": deadslice['slice'].MinRate * 1000,
+ "maxexemptrate": deadslice['slice'].Maxi2Rate * 1000,
+ "usedbytes": deadslice['htb']['usedbytes'] * 1000,
+ "usedi2bytes": deadslice['htb']['usedi2bytes'],
+ "share":deadslice['htb']['share']}
+ slices[newslice].reset(newvals, live[newslice]['_rspec'])
+ # Bring up to date
+ slices[newslice].update(newvals, live[newslice]['_rspec'])
+ # Since the slice has been reinitialed, remove from dead database.
+ del deaddb[deadslice['slice'].name]
+ del newvals
+ else:
+ logger.log("bwmon: Slice %s doesn't have xid. Skipping." % live[newslice]['name'])
+
+ # Move dead slices that exist in the pickle file, but
+ # aren't instantiated by PLC into the dead dict until
+ # recording period is over. This is to avoid the case where a slice is dynamically created
+ # and destroyed then recreated to get around byte limits.
+ deadxids = set(slices.keys()) - set(live.keys())
+ logger.verbose("bwmon: Found %s dead slices" % (deadxids.__len__() - 2))
+ for deadxid in deadxids:
+ if deadxid == root_xid or deadxid == default_xid: