On Tue, Aug 25, 2009 at 06:55:21PM +0100, Matthew Toseland wrote: > 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.
Well, only latestStored is actually stored in the database. Comparing them is reliable because I overrided the compare() function. At least, that's what I do and it works. There are probably lots of improvements, I'm not very familiar yet with db4o. -------------- 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/20090826/89e4a429/attachment.pgp>