On Mon, Aug 24, 2009 at 04:08:04PM +0100, Matthew Toseland wrote: > I don't understand this commit. You never create a new > BandwidthStatsContainer (apart from in restore), so why do you delete it and > then store it? > > Author: Artefact2 <artefact2 at gmail.com> 2009-08-23 20:51:48 > Committer: Artefact2 <artefact2 at gmail.com> 2009-08-23 20:51:48 > Parent: 3995d18cbda6151ab4033644f5158dfa54a9aa5c (Implement compatibility > infobox functions (for plugins).) > Child: dfcfab2677ea2b6b60aba45d97ed432ba844d675 (Implement total uptime (see > bug #0002292).) > Branch: remotes/origin/master > Follows: build01232 > Precedes: > > Remove delay in stats page for persistant statistics. > > ------------- src/freenet/client/async/PersistentStatsPutter.java > ------------- > similarity index 70% > rename from src/freenet/client/async/BandwidthStatsPutter.java > rename to src/freenet/client/async/PersistentStatsPutter.java > index 464ffe9..4f359f3 100644 > @@ -1,91 +1,99 @@ > /* This code is part of Freenet. It is distributed under the GNU General > * Public License, version 2 (or at your option any later version). See > * http://www.gnu.org/ for further details of the GPL. */ > package freenet.client.async; > > import com.db4o.ObjectContainer; > import com.db4o.ObjectSet; > import freenet.node.Node; > import freenet.support.BandwidthStatsContainer; > > /** > - * Add/alter the BandwidthStatsContainer contained in the database, so that > + * Add/alter the containers contained in the database, so that > * the upload/download statistics persist. > * > * @author Artefact2 > */ > -public class BandwidthStatsPutter implements DBJob { > +public class PersistentStatsPutter implements DBJob { > public static final int OFFSET = 60000; > > private Node n; > private long latestNodeBytesOut = 0; > private long latestNodeBytesIn = 0; > - private BandwidthStatsContainer latest = new BandwidthStatsContainer(); > + private BandwidthStatsContainer latestBW = new > BandwidthStatsContainer(); > + private BandwidthStatsContainer latestBWStored = new > BandwidthStatsContainer(); > > - public BandwidthStatsPutter(Node n) { > + public PersistentStatsPutter(Node n) { > this.n = n; > } > > /** > * Initiates that putter by fetching the latest container stored. > * This should be called only once. > * > * @param container Database to use. > */ > public void restorePreviousData(ObjectContainer container) { > BandwidthStatsContainer highestBSC = null; > > ObjectSet<BandwidthStatsContainer> result = > container.query(BandwidthStatsContainer.class); > > // Fetch the latest BSC > for(BandwidthStatsContainer bsc : result) { > if(highestBSC == null) { > highestBSC = bsc; > continue; > } > > if(highestBSC.creationTime < bsc.creationTime) { > highestBSC = bsc; > } > } > > if(highestBSC == null) { > highestBSC = new BandwidthStatsContainer(); > } > > // Cleanup old stored items > // BUT we keep our last BSC in case of a node crash before a > new one > // gets written. > for(BandwidthStatsContainer bsc : result) { > if(!bsc.equals(highestBSC)) { > container.delete(bsc); > } > } > > - this.latest = highestBSC; > + this.latestBWStored = highestBSC; > + this.latestBW = this.latestBWStored; > > container.commit(); > } > > public BandwidthStatsContainer getLatestData() { > - return this.latest; > + return this.latestBW; > } > > - public boolean run(ObjectContainer container, ClientContext context) { > - container.delete(this.latest); > - > - // Update our BW values > + public void updateData() { > + // Update our values > // 0 : total bytes out, 1 : total bytes in > long[] nodeBW = this.n.collector.getTotalIO(); > - this.latest.totalBytesOut += nodeBW[0] - > this.latestNodeBytesOut; > - this.latest.totalBytesIn += nodeBW[1] - this.latestNodeBytesIn; > - this.latest.creationTime = System.currentTimeMillis(); > + this.latestBW.totalBytesOut += nodeBW[0] - > this.latestNodeBytesOut; > + this.latestBW.totalBytesIn += nodeBW[1] - > this.latestNodeBytesIn; > + this.latestBW.creationTime = System.currentTimeMillis(); > this.latestNodeBytesOut = nodeBW[0]; > this.latestNodeBytesIn = nodeBW[1]; > + } > > - container.store(this.latest); > + public boolean run(ObjectContainer container, ClientContext context) { > + container.delete(this.latestBWStored); > + > + this.updateData(); > + > + container.store(this.latestBW); > container.commit(); > > + this.latestBWStored = this.latestBW; > + > return false; > } > } >
Well, when run() is called, I delete the old stored container from the database, I update the values of that container and I put that new container in the database. Maybe there is a way to simply update the container, but I don't know how to do it. My way works pretty nicely, but feel free to make any changes. I have two containers : latest and latestStored, because in some pages (statistics) we want to show the latest data, whether it has been stored or not. -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 197 bytes Desc: not available URL: <https://emu.freenetproject.org/pipermail/devl/attachments/20090824/6738e71e/attachment.pgp>
