Changeset 258c260


Ignore:
Timestamp:
Feb 21, 2011 9:35:01 PM (9 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
c269546c
Parents:
ad3342a
Message:

fix SkipIterator?

Location:
core/java/src/net
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/client/naming/BlockfileNamingService.java

    rad3342a r258c260  
    3333import net.metanotion.io.Serializer;
    3434import net.metanotion.io.block.BlockFile;
     35import net.metanotion.util.skiplist.SkipIterator;
    3536import net.metanotion.util.skiplist.SkipList;
    3637
     
    362363    }
    363364
     365    private void dumpDB() {
     366        synchronized(_bf) {
     367            if (_isClosed)
     368                _log.error("Database is closed");
     369            for (String list : _lists) {
     370                try {
     371                    SkipList sl = _bf.getIndex(list, _stringSerializer, _destSerializer);
     372                    if (sl == null) {
     373                        _log.error("No list found for " + list);
     374                        continue;
     375                    }
     376                    int i = 0;
     377                    for (SkipIterator iter = sl.iterator(); iter.hasNext(); ) {
     378                         String key = (String) iter.nextKey();
     379                         DestEntry de = (DestEntry) iter.next();
     380                         _log.error("DB " + list + " key " + key + " val " + de);
     381                         i++;
     382                    }
     383                    _log.error(i + " entries found for " + list);
     384                } catch (IOException ioe) {
     385                    _log.error("Fail", ioe);
     386                    break;
     387                }
     388            }
     389        }
     390    }
     391
    364392    public void close() {
    365393        synchronized(_bf) {
     
    507535        System.out.println("BFNS took " + DataHelper.formatDuration(System.currentTimeMillis() - start));
    508536        System.out.println("found " + found + " notfound " + notfound);
     537        bns.dumpDB();
    509538        bns.close();
    510539
  • core/java/src/net/metanotion/io/block/index/BSkipList.java

    rad3342a r258c260  
    4747        public HashMap levelHash = new HashMap();
    4848
    49         protected BSkipList() { }
     49        private final boolean fileOnly;
    5050
    5151        public BSkipList(int spanSize, BlockFile bf, int skipPage, Serializer key, Serializer val) throws IOException {
     
    6666                //System.out.println(size + " " + spans);
    6767
     68                this.fileOnly = fileOnly;
    6869                if (fileOnly)
    6970                        first = new IBSkipSpan(bf, this, firstSpanPage, key, val);
     
    128129        }
    129130
     131        @Override
     132        public SkipIterator iterator() {
     133                if (!this.fileOnly)
     134                        return super.iterator();
     135                return new IBSkipIterator(first, 0);
     136        }
     137
     138        @Override
     139        public SkipIterator min() {
     140                return iterator();
     141        }
     142
     143        @Override
     144        public SkipIterator max() {
     145                if (!this.fileOnly)
     146                        return super.max();
     147                SkipSpan ss = stack.getEnd();
     148                return new IBSkipIterator(ss, ss.nKeys - 1);
     149        }
     150
     151        @Override
     152        public SkipIterator find(Comparable key) {
     153                if (!this.fileOnly)
     154                        return super.find(key);
     155                int[] search = new int[1];
     156                SkipSpan ss = stack.getSpan(stack.levels.length - 1, key, search);
     157                if(search[0] < 0) { search[0] = -1 * (search[0] + 1); }
     158                return new IBSkipIterator(ss, search[0]);
     159        }
     160
    130161}
  • core/java/src/net/metanotion/io/block/index/BSkipSpan.java

    rad3342a r258c260  
    130130        private static void load(BSkipSpan bss, BlockFile bf, BSkipList bsl, int spanPage, Serializer key, Serializer val) throws IOException {
    131131                loadInit(bss, bf, bsl, spanPage, key, val);
    132                 loadData(bss, bf, spanPage, key, val);
     132                bss.loadData();
    133133        }
    134134
     
    158158         * Load the whole span's keys and values into memory
    159159         */
    160         protected static void loadData(BSkipSpan bss, BlockFile bf, int spanPage, Serializer key, Serializer val) throws IOException {
    161                 bss.keys = new Comparable[bss.spanSize];
    162                 bss.vals = new Object[bss.spanSize];
     160        protected void loadData() throws IOException {
     161                this.keys = new Comparable[this.spanSize];
     162                this.vals = new Object[this.spanSize];
    163163
    164164                int ksz, vsz;
    165                 int curPage = spanPage;
     165                int curPage = this.page;
    166166                int[] curNextPage = new int[1];
    167                 curNextPage[0] = bss.overflowPage;
     167                curNextPage[0] = this.overflowPage;
    168168                int[] pageCounter = new int[1];
    169169                pageCounter[0] = 16;
    170170//              System.out.println("Span Load " + sz + " nKeys " + nKeys + " page " + curPage);
    171                 for(int i=0;i<bss.nKeys;i++) {
     171                for(int i=0;i<this.nKeys;i++) {
    172172                        if((pageCounter[0] + 4) > BlockFile.PAGESIZE) {
    173                                 BlockFile.pageSeek(bf.file, curNextPage[0]);
     173                                BlockFile.pageSeek(this.bf.file, curNextPage[0]);
    174174                                curPage = curNextPage[0];
    175                                 curNextPage[0] = bf.file.readInt();
     175                                curNextPage[0] = this.bf.file.readInt();
    176176                                pageCounter[0] = 4;
    177177                        }
    178                         ksz = bf.file.readShort();
    179                         vsz = bf.file.readShort();
     178                        ksz = this.bf.file.readShort();
     179                        vsz = this.bf.file.readShort();
    180180                        pageCounter[0] +=4;
    181181                        byte[] k = new byte[ksz];
    182182                        byte[] v = new byte[vsz];
    183                         curPage = bf.readMultiPageData(k, curPage, pageCounter, curNextPage);
    184                         curPage = bf.readMultiPageData(v, curPage, pageCounter, curNextPage);
     183                        curPage = this.bf.readMultiPageData(k, curPage, pageCounter, curNextPage);
     184                        curPage = this.bf.readMultiPageData(v, curPage, pageCounter, curNextPage);
    185185//                      System.out.println("i=" + i + ", Page " + curPage + ", offset " + pageCounter[0] + " ksz " + ksz + " vsz " + vsz);
    186                         bss.keys[i] = (Comparable) bss.keySer.construct(k);
    187                         bss.vals[i] = bss.valSer.construct(v);
     186                        this.keys[i] = (Comparable) this.keySer.construct(k);
     187                        this.vals[i] = this.valSer.construct(v);
    188188                }
    189189
  • core/java/src/net/metanotion/io/block/index/IBSkipSpan.java

    rad3342a r258c260  
    9393         * Load the whole span's keys and values into memory
    9494         */
    95         protected static void loadData(IBSkipSpan bss, BlockFile bf, int spanPage, Serializer key, Serializer val) throws IOException {
    96                 BSkipSpan.loadData(bss, bf, spanPage, key, val);
    97                 if (bss.nKeys > 0)
    98                         bss.firstKey = bss.keys[0];
    99                 if (DEBUG)
    100                         System.err.println("Loaded data for page " + spanPage + " containing " + bss.nKeys + '/' + bss.spanSize + " first key: " + bss.firstKey);
     95        @Override
     96        protected void loadData() throws IOException {
     97                super.loadData();
     98                if (this.nKeys > 0)
     99                        this.firstKey = this.keys[0];
     100                if (DEBUG)
     101                        System.err.println("Loaded data for page " + this.page + " containing " + this.nKeys + '/' + this.spanSize + " first key: " + this.firstKey);
    101102        }
    102103
     
    135136        /**
    136137         * Seek to the start of the span and load the data
    137          */
    138         private void seekAndLoadData() throws IOException {
     138         * Package private so BSkipIterator can call it
     139         */
     140        void seekAndLoadData() throws IOException {
    139141                seekData();
    140                 loadData(this, this.bf, this.page, this.keySer, this.valSer);
     142                loadData();
    141143        }
    142144
  • core/java/src/net/metanotion/util/skiplist/SkipIterator.java

    rad3342a r258c260  
    3636        skip list is a map and is therefore indexed by Comparable objects instead
    3737        of int's, the nextIndex and previousIndex methods are not really relevant.
     38
     39        To be clear, this is an iterator through the values.
     40        To get the key, call nextKey() BEFORE calling next().
    3841*/
    3942public class SkipIterator implements ListIterator {
    40         SkipSpan ss;
    41         int index;
     43        protected SkipSpan ss;
     44        protected int index;
    4245
    4346        protected SkipIterator() { }
     
    5356        }
    5457
     58        /**
     59         * @return the next value, and advances the index
     60         * @throws NoSuchElementException
     61         */
    5562        public Object next() {
    5663                Object o;
     
    7279        }
    7380
     81        /**
     82         * The key. Does NOT advance the index.
     83         * @return the key for which the value will be returned in the subsequent call to next()
     84         * @throws NoSuchElementException
     85         */
    7486        public Comparable nextKey() {
    7587                Comparable c;
     
    8496        }
    8597
     98        /**
     99         * @return the previous value, and decrements the index
     100         * @throws NoSuchElementException
     101         */
    86102        public Object previous() {
    87103                if(index > 0) {
  • core/java/src/net/metanotion/util/skiplist/SkipList.java

    rad3342a r258c260  
    137137        }
    138138
     139        /** @return an iterator where nextKey() is the first one greater than or equal to 'key' */
    139140        public SkipIterator find(Comparable key) {
    140141                int[] search = new int[1];
     
    164165                Repeat, with splits induced, and collapse induced.
    165166*/
     167/*****
    166168        public static void main(String args[]) {
    167169                SkipList sl = new SkipList(3);
     
    172174                sl.put(".2", "2");
    173175                sl.put(".3", "3");
     176*****/
    174177/*              System.out.println("\n#1");
    175178                sl.print();
    176179*/
     180/*****
    177181
    178182                sl.put(".4", "4");
     183*****/
    179184/*              System.out.println("\n#2");
    180185                sl.print();
     
    194199                sl.print();
    195200*/
     201/******
    196202                sl.put(".1", "1-2");
    197203                sl.put(".2", "2-1");
     
    312318                }
    313319        }
     320*****/
    314321}
Note: See TracChangeset for help on using the changeset viewer.