I2P Address: [http://git.idk.i2p]

Skip to content
Snippets Groups Projects
Commit 3870924f authored by zzz's avatar zzz
Browse files

* i2psnark: Improve request tracking to reduce memory usage

parent a692ab42
No related branches found
No related tags found
No related merge requests found
package org.klomp.snark; package org.klomp.snark;
import java.util.Collections; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import net.i2p.util.ConcurrentHashSet;
/** /**
* This class is used solely by PeerCoordinator. * This class is used solely by PeerCoordinator.
* Caller must synchronize on many of these methods.
*/ */
class Piece implements Comparable { class Piece implements Comparable {
private int id; private final int id;
private Set<PeerID> peers; private final Set<PeerID> peers;
/** @since 0.8.3 */ /** @since 0.8.3 */
private Set<PeerID> requests; private Set<PeerID> requests;
/** @since 0.8.1 */ /** @since 0.8.1 */
...@@ -19,8 +18,8 @@ class Piece implements Comparable { ...@@ -19,8 +18,8 @@ class Piece implements Comparable {
public Piece(int id) { public Piece(int id) {
this.id = id; this.id = id;
this.peers = new ConcurrentHashSet(I2PSnarkUtil.MAX_CONNECTIONS); this.peers = new HashSet(I2PSnarkUtil.MAX_CONNECTIONS);
this.requests = new ConcurrentHashSet(2); // defer creating requests to save memory
} }
/** /**
...@@ -51,35 +50,50 @@ class Piece implements Comparable { ...@@ -51,35 +50,50 @@ class Piece implements Comparable {
} }
public int getId() { return this.id; } public int getId() { return this.id; }
/** caller must synchronize */
public boolean addPeer(Peer peer) { return this.peers.add(peer.getPeerID()); } public boolean addPeer(Peer peer) { return this.peers.add(peer.getPeerID()); }
/** caller must synchronize */
public boolean removePeer(Peer peer) { return this.peers.remove(peer.getPeerID()); } public boolean removePeer(Peer peer) { return this.peers.remove(peer.getPeerID()); }
public boolean isRequested() { return !this.requests.isEmpty(); }
/** caller must synchronize */
public boolean isRequested() {
return this.requests != null && !this.requests.isEmpty();
}
/** /**
* Since 0.8.3, keep track of who is requesting here, * Since 0.8.3, keep track of who is requesting here,
* to avoid deadlocks from querying each peer. * to avoid deadlocks from querying each peer.
* Caller must synchronize
*/ */
public void setRequested(Peer peer, boolean requested) { public void setRequested(Peer peer, boolean requested) {
if (requested) if (requested) {
if (this.requests == null)
this.requests = new HashSet(2);
this.requests.add(peer.getPeerID()); this.requests.add(peer.getPeerID());
else } else {
this.requests.remove(peer.getPeerID()); if (this.requests != null)
this.requests.remove(peer.getPeerID());
}
} }
/** /**
* Is peer requesting this piece? * Is peer requesting this piece?
* Caller must synchronize
* @since 0.8.3 * @since 0.8.3
*/ */
public boolean isRequestedBy(Peer peer) { public boolean isRequestedBy(Peer peer) {
return this.requests.contains(peer.getPeerID()); return this.requests != null && this.requests.contains(peer.getPeerID());
} }
/** /**
* How many peers are requesting this piece? * How many peers are requesting this piece?
* Caller must synchronize
* @since 0.8.3 * @since 0.8.3
*/ */
public int getRequestCount() { public int getRequestCount() {
return this.requests.size(); return this.requests == null ? 0 : this.requests.size();
} }
/** @return default 0 @since 0.8.1 */ /** @return default 0 @since 0.8.1 */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment