On Fri, Jun 21, 2002 at 03:05:38AM +0100, Matthew Toseland wrote:
> On Fri, Jun 21, 2002 at 02:58:11AM +0100, Matthew Toseland wrote:
> > Attached is a patch to Fred to implement a histogram of the bytes,
> > rather than the number of keys, under each prefix.
> 
> Whoops. BTW, my sourceforge nym is 'amphibian'.
Slightly better version attached. The second file is
src/freenet/support/KeyBytesHistogram.java.
? mydiff
? src/freenet/support/KeyBytesHistogram.java
? src/freenet/support/KeySizeHistogram.java
Index: src/freenet/client/http/NodeStatusServlet.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/client/http/NodeStatusServlet.java,v
retrieving revision 1.26
diff -r1.26 NodeStatusServlet.java
43a44
> import freenet.support.KeySizeHistogram;
143a145,149
>           if (uri.endsWith("ds_size_histogram.txt")) {
>               sendDSSizeHistogram(resp, false);
>               return;
>           };
> 
152c158
<                                  MSG_NO_REQUEST_DIST);
---
>                                  MSG_NO_REQUEST_DIST, "keys");
166a173,177
>           if (uri.endsWith("ds_size_histogram_data.txt")) {
>               sendDSSizeHistogram(resp, true);
>               return;
>           }
> 
176c187
<                                  MSG_NO_REQUEST_DIST); 
---
>                                  MSG_NO_REQUEST_DIST, "keys"); 
341,342c352,353
<         pw.println("            <a href= \"" + baseURL +
<                    "ds_histogram_data.txt\">" +
---
>         pw.println("            <li> <a href= \"" + baseURL +
>                    "ds_histogram_data.txt\"> " +
343a355,359
>       pw.println("            <li> <a href=\"" + baseURL + "ds_size_histogram.txt\"> 
>" +
>                   " Histogram of bytes in the local DataStore. </a>");
>       pw.println("            <li> <a href= \"" + baseURL +
>                  "ds_size_histogram_data.txt\">" +
>                  "<br>(flat ascii)</a><br>");
489c505,506
<                          MSG_OOPS /* bins should always be non-null */);
---
>                          MSG_OOPS /* bins should always be non-null */,
>                        "keys");
502c519,520
<                          MSG_OOPS /* bins should always be non-null */);
---
>                          MSG_OOPS /* bins should always be non-null */,
>                        "keys");
505a524,535
>     private void sendDSSizeHistogram(HttpServletResponse resp, boolean justData) 
>throws IOException {
> 
>       FSDataStore ds = (FSDataStore) node.ds;
>       KeySizeHistogram histogram = ds.getSizeHistogram();
> 
>       sendKeyHistogram(resp, justData, histogram.getBins(),
>                  "Histogram of bytes used by keys in fred's data store",
>                  "These are the total amounts of bytes used by the data " +
>                  "in your node's local cache (DataStore)",
>                  MSG_OOPS /* bins should always be non-null */, "bytes");
>     }
> 
508c538
<                                   String complaint) throws IOException {
---
>                                   String complaint, String commodity) throws 
>IOException {
529c559
<         float scale = 1.0f;
---
>         double scale = 1.0f;
546c576
<             pw.println("# keys: " + count);
---
>             pw.println("# " + commodity + ": " + count);
553c583
<             pw.println("keys: " + count);
---
>             pw.println(commodity + ": " + count);
Index: src/freenet/node/ds/FSDataStore.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/node/ds/FSDataStore.java,v
retrieving revision 1.6
diff -r1.6 FSDataStore.java
263a264,284
>     public KeySizeHistogram getSizeHistogram() {
>       KeySizeHistogram histogram = new KeySizeHistogram();
> 
>       synchronized (dir.semaphore()) {
>           Enumeration keys = dir.keys(true);
>           while (keys.hasMoreElements()) {
>               FileNumber fn = (FileNumber) keys.nextElement();
>               Buffer buffer = dir.fetch(fn);
>               try {
>                   histogram.add( new Key(fn.getByteArray()), buffer.length() );
>               }
>               finally
>               {
>                   buffer.release();
>               };
>           };
>       };
>           
>       return histogram;
>     };
>       
package freenet.support;

import freenet.Key;

public class KeySizeHistogram {

    public synchronized void add(Key key, long len) {
        // Most significant nibble of the most 
        // significant byte.
        final int binNumber = (((int)key.getVal()[0]) & 0xff)  >>> ((byte)4);
        bins[binNumber] += len;
    }

    // Distribution of keys with most significant nibbles 0-f.
    public synchronized int[] getBins() {
        int[] ret = new int[bins.length];
        System.arraycopy(bins, 0, ret, 0, bins.length);
        return ret;
    }
    
    private int bins[] = new int[16];
}

Attachment: msg03314/pgp00000.pgp
Description: PGP signature

Reply via email to