Changeset 57e2bb7b


Ignore:
Timestamp:
Jan 10, 2018 3:11:10 PM (3 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
d55a0c9
Parents:
eeb2835
Message:

Addressbook: Remove finalizers (ticket #2115)
Better resource cleanup

Location:
apps/addressbook/java/src/net/i2p/addressbook
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • apps/addressbook/java/src/net/i2p/addressbook/AddressBook.java

    reeb2835 r57e2bb7b  
    134134        Map<String, HostTxtEntry> a = null;
    135135        File subf = null;
     136        File tmp = null;
    136137        try {
    137             File tmp = SecureFile.createTempFile("addressbook", null, I2PAppContext.getGlobalContext().getTempDir());
     138            tmp = SecureFile.createTempFile("addressbook", null, I2PAppContext.getGlobalContext().getTempDir());
    138139            EepGet get = new EepGet(I2PAppContext.getGlobalContext(), true,
    139140                    proxyHost, proxyPort, 0, -1l, MAX_SUB_SIZE, tmp.getAbsolutePath(), null,
     
    149150            }
    150151        } catch (IOException ioe) {
     152            if (tmp != null)
     153                tmp.delete();
    151154            a = Collections.emptyMap();
    152155        }
     
    307310        if (this.addresses == null)
    308311            throw new IllegalStateException();
    309         for (Iterator<Map.Entry<String, HostTxtEntry>> iter = other.iterator(); iter.hasNext(); ) {
     312        Iterator<Map.Entry<String, HostTxtEntry>> iter = other.iterator();
     313        try {
     314            merge2(other, iter, overwrite, log);
     315        } finally {
     316            if (iter instanceof HostTxtIterator)
     317                ((HostTxtIterator) iter).close();
     318        }
     319    }
     320
     321    private void merge2(AddressBook other, Iterator<Map.Entry<String, HostTxtEntry>> iter, boolean overwrite, Log log) {
     322        while(iter.hasNext()) {
    310323            Map.Entry<String, HostTxtEntry> entry = iter.next();
    311324            String otherKey = entry.getKey();
     
    368381    }
    369382
    370     @Override
    371     protected void finalize() {
    372         delete();
    373     }
    374 
    375383/****
    376384    public static void main(String[] args) {
  • apps/addressbook/java/src/net/i2p/addressbook/Daemon.java

    reeb2835 r57e2bb7b  
    131131        String nsClass = router.getClass().getSimpleName();
    132132        boolean isTextFile = nsClass.equals("HostsTxtNamingService") || nsClass.equals("SingleFileNamingService");
    133         Set<String> knownNames = null;
    134 
    135         NamingService publishedNS = null;
     133        Set<String> knownNames;
     134        if (isTextFile) {
     135            // load the hostname set
     136            Properties opts = new Properties();
     137            opts.setProperty("file", "hosts.txt");
     138            knownNames = router.getNames(opts);
     139        } else {
     140            knownNames = null;
     141        }
     142        NamingService publishedNS;
     143        if (published != null) {
     144            publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
     145        } else {
     146            publishedNS = null;
     147        }
     148
    136149        Iterator<AddressBook> iter = subscriptions.iterator();
    137150        while (iter.hasNext()) {
     
    143156                long end = System.currentTimeMillis();
    144157                log.append("Fetch of " + addressbook.getLocation() + " took " + (end - start));
    145                 start = end;
    146158            }
     159            Iterator<Map.Entry<String, HostTxtEntry>> iter2 = addressbook.iterator();
     160            try {
     161                update(router, knownNames, publishedNS, addressbook, iter2, log);
     162            } finally {
     163                if (iter2 instanceof HostTxtIterator)
     164                    ((HostTxtIterator) iter2).close();
     165                addressbook.delete();
     166            }
     167        }  // subscriptions
     168        subscriptions.write();
     169    }
     170
     171    /**
     172     *  @param knownNames only non-null if router book is a text file
     173     *  @param publishedNS only non-null if we have a published address book
     174     *  @since 0.9.33 split out from above
     175     */
     176    private static void update(NamingService router, Set<String> knownNames,
     177                               NamingService publishedNS, AddressBook addressbook,
     178                               Iterator<Map.Entry<String, HostTxtEntry>> iter, Log log) {
     179            long start = System.currentTimeMillis();
    147180            int old = 0, nnew = 0, invalid = 0, conflict = 0, total = 0;
    148181            int deleted = 0;
    149             for (Map.Entry<String, HostTxtEntry> entry : addressbook) {
     182            while(iter.hasNext()) {
     183                Map.Entry<String, HostTxtEntry> entry = iter.next();
    150184                total++;
    151185                // may be null for 'remove' entries
     
    154188                // NOT set for text file NamingService
    155189                Destination oldDest;
    156                 if (isTextFile) {
    157                     if (knownNames == null) {
    158                         // load the hostname set
    159                         Properties opts = new Properties();
    160                         opts.setProperty("file", "hosts.txt");
    161                         knownNames = router.getNames(opts);
    162                     }
     190                if (knownNames != null) {
    163191                    oldDest = null;
    164192                    isKnown = key != null ? knownNames.contains(key) : null;
     
    244272                                            // now update the published addressbook
    245273                                            // ditto
    246                                             if (published != null) {
    247                                                 if (publishedNS == null)
    248                                                     publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
     274                                            if (publishedNS != null) {
    249275                                                // FIXME this fails, no support in SFNS
    250276                                                success = publishedNS.addDestination(key, dest, props);
    251277                                                if (log != null && !success)
    252                                                     log.append("Add to published address book " + published.getAbsolutePath() + " failed for " + key);
     278                                                    log.append("Add to published address book " + publishedNS.getName() + " failed for " + key);
    253279                                            }
    254280                                            nnew++;
     
    417443                                            }
    418444                                            // now update the published addressbook
    419                                             if (published != null) {
    420                                                 if (publishedNS == null)
    421                                                     publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
     445                                            if (publishedNS != null) {
    422446                                                success = publishedNS.remove(poldname, dest);
    423447                                                if (log != null && !success)
    424                                                     log.append("Remove from published address book " + published.getAbsolutePath() + " failed for " + poldname);
     448                                                    log.append("Remove from published address book " + publishedNS.getName() + " failed for " + poldname);
    425449                                            }
    426450                                        } else {
     
    464488                            }
    465489                            // now update the published addressbook
    466                             if (published != null) {
    467                                 if (publishedNS == null)
    468                                     publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
     490                            if (publishedNS != null) {
    469491                                if (allowExistingKeyInPublished)
    470492                                    success = publishedNS.put(key, dest, props);
     
    472494                                    success = publishedNS.putIfAbsent(key, dest, props);
    473495                                if (log != null && !success) {
    474                                     log.append("Save to published address book " + published.getAbsolutePath() + " failed for new key " + key);
     496                                    log.append("Save to published address book " + publishedNS.getName() + " failed for new key " + key);
    475497                                }
    476498                            }
    477                             if (isTextFile)
     499                            if (knownNames != null) {
    478500                                // keep track for later dup check
    479501                                knownNames.add(key);
     502                            }
    480503                            nnew++;
    481504                        } else if (key == null) {
     
    508531                                            }
    509532                                            // now update the published addressbook
    510                                             if (published != null) {
    511                                                 if (publishedNS == null)
    512                                                     publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
     533                                            if (publishedNS != null) {
    513534                                                success = publishedNS.remove(poldname, pod);
    514535                                                if (log != null && !success)
    515                                                     log.append("Remove from published address book " + published.getAbsolutePath() + " failed for " + poldname);
     536                                                    log.append("Remove from published address book " + publishedNS.getName() + " failed for " + poldname);
    516537                                            }
    517538                                        } else if (pod2 != null) {
     
    552573                                                }
    553574                                                // now update the published addressbook
    554                                                 if (published != null) {
    555                                                     if (publishedNS == null)
    556                                                         publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
     575                                                if (publishedNS != null) {
    557576                                                    success = publishedNS.remove(poldname, pod);
    558577                                                    if (log != null && !success)
    559                                                         log.append("Remove from published address book " + published.getAbsolutePath() + " failed for " + poldname);
     578                                                        log.append("Remove from published address book " + publishedNS.getName() + " failed for " + poldname);
    560579                                                }
    561580                                            } else if (pod2 != null) {
     
    587606                                                }
    588607                                                // now update the published addressbook
    589                                                 if (published != null) {
    590                                                     if (publishedNS == null)
    591                                                         publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
     608                                                if (publishedNS != null) {
    592609                                                    success = publishedNS.remove(rev, pod);
    593610                                                    if (log != null && !success)
    594                                                         log.append("Remove from published address book " + published.getAbsolutePath() + " failed for " + rev);
     611                                                        log.append("Remove from published address book " + publishedNS.getName() + " failed for " + rev);
    595612                                                }
    596613                                            }
     
    642659                    invalid++;
    643660                }
    644             }
     661            }  // entries
    645662            if (DEBUG && log != null && total > 0) {
    646663                log.append("Merge of " + addressbook.getLocation() + " into " + router +
     
    652669                           invalid + " invalid, " +
    653670                           conflict + " conflicts");
    654             }  // entries
    655             addressbook.delete();
    656         }  // subscriptions
    657         subscriptions.write();
     671            }
    658672    }
    659673
  • apps/addressbook/java/src/net/i2p/addressbook/HostTxtIterator.java

    reeb2835 r57e2bb7b  
    111111    }
    112112
    113     @Override
    114     protected void finalize() {
    115         close();
    116     }
    117 
    118113    /**
    119114     *  The object returned by the iterator.
Note: See TracChangeset for help on using the changeset viewer.