On Monday 24 August 2009 16:07:37 Artefact2 wrote: > 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.
You only need to store() it. > > 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. This will not work. The object will not be duplicated merely by putting it into the database - that only happens with array members. The two objects will remain identical and therefore the updates will be wrong if they rely on comparing them. -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 835 bytes Desc: This is a digitally signed message part. URL: <https://emu.freenetproject.org/pipermail/devl/attachments/20090825/6b90e9ea/attachment.pgp>