From 13c71cb9d038bc871883f55c3bc61392ed702161 Mon Sep 17 00:00:00 2001 From: Arne Babenhauserheide Date: Tue, 12 Nov 2024 22:23:49 +0100 Subject: [PATCH] refactor: split parsing peers into multiple steps The previous code nested too much error handling even though many parts are independent. --- src/freenet/node/PeerManager.java | 94 ++++++++++++++++--------------- 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/src/freenet/node/PeerManager.java b/src/freenet/node/PeerManager.java index 1d6a1a4c2e..024dfafe6a 100644 --- a/src/freenet/node/PeerManager.java +++ b/src/freenet/node/PeerManager.java @@ -238,58 +238,60 @@ private boolean readPeers(File peersFile, NodeCrypto crypto, OpennetManager open BufferedReader br = new BufferedReader(ris); File brokenPeersFile = new File(peersFile.getPath() + ".broken"); DroppedOldPeersUserAlert droppedOldPeers = new DroppedOldPeersUserAlert(brokenPeersFile); - try { // FIXME: no better way? - while(true) { - // Read a single NodePeer - SimpleFieldSet fs; - fs = new SimpleFieldSet(br, false, true); - try { - PeerNode pn = PeerNode.create(fs, node, crypto, opennet, this); - if(oldOpennetPeers) { - if(!(pn instanceof OpennetPeerNode)) - Logger.error(this, "Darknet node in old opennet peers?!: "+pn); - else - opennet.addOldOpennetNode((OpennetPeerNode)pn); - } else - addPeer(pn, true, false); - } catch(FSParseException e2) { - Logger.error(this, "Could not parse peer: " + e2 + '\n' + fs.toString(), e2); - System.err.println("Cannot parse a friend from the peers file: "+e2); - someBroken = true; - continue; - } catch(PeerParseException e2) { - Logger.error(this, "Could not parse peer: " + e2 + '\n' + fs.toString(), e2); - System.err.println("Cannot parse a friend from the peers file: "+e2); - someBroken = true; - continue; - } catch(ReferenceSignatureVerificationException e2) { - Logger.error(this, "Could not parse peer: " + e2 + '\n' + fs.toString(), e2); - System.err.println("Cannot parse a friend from the peers file: "+e2); - someBroken = true; - continue; - } catch (RuntimeException e2) { - Logger.error(this, "Could not parse peer: " + e2 + '\n' + fs.toString(), e2); - System.err.println("Cannot parse a friend from the peers file: "+e2); - someBroken = true; - continue; - // FIXME tell the user??? - } catch (PeerTooOldException e) { - if(crypto.isOpennet()) { - // Ignore. - Logger.error(this, "Dropping too-old opennet peer"); - } else { - // A lot more noisy! - droppedOldPeers.add(e, fs.get("myName")); - } - someBroken = true; - continue; - } + List peerEntries = new ArrayList<>(); + // read the peers file + try { + while (true) { + peerEntries.add(new SimpleFieldSet(br, false, true)); } } catch(EOFException e) { // End of file, fine } catch(IOException e1) { Logger.error(this, "Could not read peers file: " + e1, e1); } + + List createdNodes = new ArrayList<>(); + for (SimpleFieldSet fs : peerEntries) { + try { + createdNodes.add(PeerNode.create(fs, node, crypto, opennet, this)); + } catch(FSParseException e2) { + Logger.error(this, "Could not parse peer due to broken fieldset syntax: " + e2 + '\n' + fs.toString(), e2); + System.err.println("Cannot parse a friend from the peers file due to broken fieldset syntax: "+e2); + someBroken = true; + } catch(PeerParseException e2) { + Logger.error(this, "Could not parse peer: " + e2 + '\n' + fs.toString(), e2); + System.err.println("Cannot parse a friend from the peers file: "+e2); + someBroken = true; + } catch(ReferenceSignatureVerificationException e2) { + Logger.error(this, "Could not verify signature of peer: " + e2 + '\n' + fs.toString(), e2); + System.err.println("Cannot verify signature of a friend from the peers file: "+e2); + someBroken = true; + } catch (RuntimeException e2) { + Logger.error(this, "Could not parse peer: " + e2 + '\n' + fs.toString(), e2); + System.err.println("Cannot parse a friend from the peers file: " + e2); + someBroken = true; + // FIXME tell the user??? + } catch (PeerTooOldException e) { + someBroken = true; + if(crypto.isOpennet()) { + // Ignore. + Logger.error(this, "Dropping too-old opennet peer"); + } else { + // A lot more noisy + droppedOldPeers.add(e, fs.get("myName")); + } + } + } + + for (PeerNode pn : createdNodes) { + if(oldOpennetPeers) { + if(!(pn instanceof OpennetPeerNode)) + Logger.error(this, "Darknet node in old opennet peers?!: "+pn); + else + opennet.addOldOpennetNode((OpennetPeerNode)pn); + } else + addPeer(pn, true, false); + } try { br.close(); } catch(IOException e3) {