An identity is only needed if some message was written by it??? Don't we poll all identities with sufficient trust?
On Thursday 06 November 2008 19:55, xor at freenetproject.org wrote: > Author: xor > Date: 2008-11-06 19:55:40 +0000 (Thu, 06 Nov 2008) > New Revision: 23363 > > Modified: > trunk/plugins/Freetalk/FTIdentityManager.java > trunk/plugins/Freetalk/WoT/FTIdentityManagerWoT.java > trunk/plugins/Freetalk/WoT/FTIdentityWoT.java > trunk/plugins/Freetalk/WoT/FTOwnIdentityWoT.java > Log: > Implement the identity-retrieval loop. > > Modified: trunk/plugins/Freetalk/FTIdentityManager.java > =================================================================== > --- trunk/plugins/Freetalk/FTIdentityManager.java 2008-11-06 19:34:57 UTC (rev 23362) > +++ trunk/plugins/Freetalk/FTIdentityManager.java 2008-11-06 19:55:40 UTC (rev 23363) > @@ -3,22 +3,34 @@ > * http://www.gnu.org/ for further details of the GPL. */ > package plugins.Freetalk; > > +import java.util.Date; > +import java.util.Hashtable; > import java.util.Iterator; > +import java.util.List; > > +import plugins.WoT.Identity; > +import plugins.WoT.OwnIdentity; > +import plugins.WoT.WoT; > + > import com.db4o.ObjectContainer; > import com.db4o.ObjectSet; > +import com.db4o.query.Query; > > +import freenet.keys.FreenetURI; > import freenet.support.Executor; > +import freenet.support.Logger; > > /** > * @author saces, xor > * > */ > -public abstract class FTIdentityManager implements Iterable<FTIdentity> { > - > +public abstract class FTIdentityManager implements Runnable, Iterable<FTIdentity> { > + > protected final ObjectContainer db; > > protected final Executor mExecutor; > + > + public boolean isRunning = true; > > public FTIdentityManager(ObjectContainer myDB, Executor newExecutor) { > db = myDB; > @@ -46,4 +58,6 @@ > > return false; > } > + > + public abstract void run(); > } > > Modified: trunk/plugins/Freetalk/WoT/FTIdentityManagerWoT.java > =================================================================== > --- trunk/plugins/Freetalk/WoT/FTIdentityManagerWoT.java 2008-11-06 > 19:34:57 UTC (rev 23362) > +++ trunk/plugins/Freetalk/WoT/FTIdentityManagerWoT.java 2008-11-06 > 19:55:40 UTC (rev 23363) > @@ -3,12 +3,20 @@ > * http://www.gnu.org/ for further details of the GPL. */ > package plugins.Freetalk.WoT; > > +import java.util.List; > + > import plugins.Freetalk.FTIdentityManager; > +import plugins.WoT.Identity; > +import plugins.WoT.OwnIdentity; > import plugins.WoT.WoT; > +import plugins.WoT.exceptions.InvalidParameterException; > > import com.db4o.ObjectContainer; > +import com.db4o.ObjectSet; > +import com.db4o.query.Query; > > import freenet.support.Executor; > +import freenet.support.Logger; > > /** > * An identity manager which uses the identities from the WoT plugin. > @@ -18,6 +26,9 @@ > */ > public class FTIdentityManagerWoT extends FTIdentityManager { > > + /* FIXME: This really has to be tweaked before release. I set it quite short for debugging */ > + private static final int THREAD_PERIOD = 5 * 60 * 1000; > + > private WoT mWoT; > > /** > @@ -27,4 +38,101 @@ > super(myDB, executor); > mWoT = newWoT; > } > + > + private void receiveIdentities() throws InvalidParameterException { > + long time = System.currentTimeMillis(); > + > + ObjectSet<OwnIdentity> oids = mWoT.getAllOwnIdentities(); > + for(OwnIdentity o : oids) { > + synchronized(this) { /* We lock here and not during the > whole function to allow other threads to execute */ > + Query q = db.query(); > + q.constrain(FTOwnIdentityWoT.class); > + q.descend("mIdentity").equals(o); > + ObjectSet<FTOwnIdentityWoT> result = > q.execute(); > + > + if(result.size() == 0) { > + db.store(new FTOwnIdentityWoT(db, o)); > + db.commit(); > + } else { > + assert(result.size() == 1); > + > result.next().setLastReceivedFromWoT(time); > + } > + } > + } > + > + List<Identity> ids = mWoT.getIdentitiesByScore(null, 30, > "freetalk"); /* FIXME: the "30" has to be configurable */ > + > + for(Identity i : ids) { > + synchronized(this) { /* We lock here and not during the > whole function to allow other threads to execute */ > + Query q = db.query(); > + q.constrain(FTIdentityWoT.class); > + q.descend("mIdentity").equals(i); > + ObjectSet<FTIdentityWoT> result = q.execute(); > + > + if(result.size() == 0) { > + db.store(new FTIdentityWoT(db, i)); > + db.commit(); > + } else { > + assert(result.size() == 1); > + > result.next().setLastReceivedFromWoT(time); > + } > + } > + } > + } > + > + private synchronized void garbageCollectIdentities() { > + /* Executing the thread loop once will always take longer than THREAD_PERIOD. Therefore, if we set the limit to 3*THREAD_PERIOD, > + * it will hit identities which were last received before more > than 2*THREAD_LOOP, not exactly 3*THREAD_LOOP. */ > + long lastAcceptTime = System.currentTimeMillis() - > THREAD_PERIOD * 3; > + > + Query q = db.query(); > + q.constrain(FTIdentityWoT.class); > + q.descend("isNeeded").equals(false); > + q.descend("lastReceivedFromWoT").constrain(new Long(lastAcceptTime)).smaller(); > + ObjectSet<FTIdentityWoT> result = q.execute(); > + > + while(result.hasNext()) { > + FTIdentityWoT i = result.next(); > + assert(identityIsNotNeeded(i)); /* Check whether the > isNeeded field of the identity was correct */ > + db.delete(i); > + } > + > + db.commit(); > + } > + > + /** > + * Debug function for checking whether the isNeeded field of an > identity is correct. > + */ > + private boolean identityIsNotNeeded(FTIdentityWoT i) { > + /* FIXME: This function does not lock, it should probably. But > we cannot lock on the message manager because it locks on the identity > + * manager and therefore this might cause deadlock. */ > + Query q = db.query(); > + q.constrain(FTMessageWoT.class); > + q.descend("mAuthor").equals(i); > + return (q.execute().size() == 0); > + } > + > + > + @Override > + public void run() { > + try { > + Thread.sleep((long) (3*60*1000 * (0.5f + > Math.random()))); /* Let the node start up */ > + } catch (InterruptedException e) { } > + > + while(isRunning) { > + try { > + receiveIdentities(); > + } > + > + catch(InvalidParameterException e) { > + Logger.error(this, "Exception in identity fetch > loop", e); > + } > + > + garbageCollectIdentities(); > + > + try { > + Thread.sleep((long) (THREAD_PERIOD * (0.5f + > Math.random()))); > + } catch (InterruptedException e) { } > + } > + } > } > > Modified: trunk/plugins/Freetalk/WoT/FTIdentityWoT.java > =================================================================== > --- trunk/plugins/Freetalk/WoT/FTIdentityWoT.java 2008-11-06 19:34:57 UTC (rev 23362) > +++ trunk/plugins/Freetalk/WoT/FTIdentityWoT.java 2008-11-06 19:55:40 UTC (rev 23363) > @@ -5,6 +5,8 @@ > > import java.util.Date; > > +import com.db4o.ObjectContainer; > + > import freenet.keys.FreenetURI; > import plugins.Freetalk.FTIdentity; > > @@ -16,26 +18,64 @@ > */ > public class FTIdentityWoT implements FTIdentity { > > + protected final ObjectContainer db; > + > protected final Identity mIdentity; > + > + /** > + * Used for garbage collecting old identities which are not returned by the WoT plugin anymore. > + * We delete them if they were not received for a certain time interval. > + */ > + private long mLastReceivedFromWoT; > + > + /** > + * Set to true if the identity is referenced by any messages. > + */ > + private boolean mIsNeeded; > > - public FTIdentityWoT(Identity newIndentity) { > - mIdentity = newIndentity; > + public FTIdentityWoT(ObjectContainer myDB, Identity myIndentity) { > + db = myDB; > + mIdentity = myIndentity; > + mLastReceivedFromWoT = System.currentTimeMillis(); > + mIsNeeded = false; > } > > - public boolean doesPublishTrustList() { > + public synchronized boolean doesPublishTrustList() { > return mIdentity.doesPublishTrustList(); > } > > - public Date getLastChange() { > + public synchronized Date getLastChange() { > return mIdentity.getLastChange(); > } > > - public String getNickName() { > + public synchronized String getNickName() { > return mIdentity.getNickName(); > } > > - public FreenetURI getRequestURI() { > + public synchronized FreenetURI getRequestURI() { > return mIdentity.getRequestURI(); > } > + > + public synchronized long getLastReceivedFromWoT() { > + return mLastReceivedFromWoT; > + } > + > + public synchronized void setLastReceivedFromWoT(long time) { > + mLastReceivedFromWoT = time; > + store(); > + } > + > + public synchronized boolean isNeeded() { > + return mIsNeeded; > + } > + > + public synchronized void setIsNeeded(boolean newValue) { > + mIsNeeded = newValue; > + } > + > + protected void store() { > + db.store(this); > + db.commit(); > + } > > } > > Modified: trunk/plugins/Freetalk/WoT/FTOwnIdentityWoT.java > =================================================================== > --- trunk/plugins/Freetalk/WoT/FTOwnIdentityWoT.java 2008-11-06 19:34:57 UTC (rev 23362) > +++ trunk/plugins/Freetalk/WoT/FTOwnIdentityWoT.java 2008-11-06 19:55:40 UTC (rev 23363) > @@ -7,6 +7,8 @@ > import java.util.Iterator; > import java.util.LinkedList; > > +import com.db4o.ObjectContainer; > + > import plugins.Freetalk.FTBoard; > import plugins.Freetalk.FTIdentity; > import plugins.Freetalk.FTMessage; > @@ -19,11 +21,11 @@ > * > */ > public class FTOwnIdentityWoT extends FTIdentityWoT implements FTOwnIdentity { > - > + > private final LinkedList<FTBoard> mSubscribedBoards = new LinkedList<FTBoard>(); > > - public FTOwnIdentityWoT(OwnIdentity newIndentity) { > - super(newIndentity); > + public FTOwnIdentityWoT(ObjectContainer myDB, OwnIdentity newIndentity) > { > + super(myDB, newIndentity); > } > > protected OwnIdentity getOwnIdentity() { > @@ -49,10 +51,13 @@ > return; > } > mSubscribedBoards.add(board); > + > + store(); > } > > public synchronized void unsubscribeFromBoard(FTBoard board) { > mSubscribedBoards.remove(board); > + store(); > } > > public synchronized Iterator<FTBoard> subscribedBoardsIterator() { > @@ -63,7 +68,7 @@ > // TODO Auto-generated method stub > return false; > } > - > + > /* > public final void exportXML(OutputStream out) throws IOException { > Writer w = new BufferedWriter(new OutputStreamWriter(out)); > > _______________________________________________ > cvs mailing list > cvs at freenetproject.org > http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs > > -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 827 bytes Desc: not available URL: <https://emu.freenetproject.org/pipermail/devl/attachments/20081112/c2e726b3/attachment.pgp>
