Changeset 6bbd34ee


Ignore:
Timestamp:
Jun 13, 2013 2:38:13 PM (7 years ago)
Author:
dev <dev@…>
Branches:
master
Children:
29b599bc
Parents:
ff5abfb
Message:

Fixed MultiRouter?. Removed MultiRouterBuilder? as it no longer serves any purpose. Added the router.rejectStartupTime property to allow for quicker testing with MultiRouter?.

Location:
router/java/src/net/i2p/router
Files:
1 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • router/java/src/net/i2p/router/MultiRouter.java

    rff5abfb r6bbd34ee  
    11package net.i2p.router;
    22
     3import java.io.File;
    34import java.io.FileInputStream;
    45import java.io.IOException;
     6import java.io.PrintStream;
    57import java.util.ArrayList;
     8import java.util.HashSet;
    69import java.util.Properties;
     10import java.util.Scanner;
    711
    812import net.i2p.I2PAppContext;
     13import net.i2p.data.DataHelper;
     14import net.i2p.data.RouterInfo;
     15import net.i2p.router.Router;
    916import net.i2p.util.Log;
    1017
     
    1724 *
    1825 * <b>Usage:</b><pre>
    19  *  MultiRouter globalContextFile routerContextFile[ routerContextFile]*
     26 *  MultiRouter numberRouters
    2027 * </pre>
    2128 *
     
    3744 * has i2p.encryption=off, you should also add that line to the client's JVM
    3845 * (for example, <code>java -Di2p.encryption=off -jar lib/i2ptunnel.jar</code>).<p />
     46 *
     47 * To make the router console work, either run from a directory containing
     48 * lib/, webapps/, docs/, etc., or point i2p.dir.base to a directory containing the
     49 * above.
    3950 *
    4051 * The multirouter waits until all of the routers are shut down (which none will
     
    4253 */
    4354public class MultiRouter {
    44     private static Log _log;
    45     private static ArrayList _routers = new ArrayList(8);
     55       
     56        private static final int BASE_PORT = 5000;
     57
     58        private static int nbrRouters;
     59       
     60        private static PrintStream _out;
     61        private static ArrayList<Router> _routers = new ArrayList<Router>(8);
    4662    private static I2PAppContext _defaultContext;
    4763   
    4864    public static void main(String args[]) {
    49         if ( (args == null) || (args.length <= 1) ) {
     65        if ( (args == null) || (args.length < 1) ) {
    5066            usage();
    5167            return;
    5268        }
    53         _defaultContext = new I2PAppContext(getEnv(args[0]));
    54        
    55         _log = _defaultContext.logManager().getLog(MultiRouter.class);
    56         try { Thread.sleep(5*1000); } catch (InterruptedException ie) {}
    57        
     69        Scanner scan = new Scanner(args[0]);
     70        if (!scan.hasNextInt()) {
     71            usage();
     72            return;
     73        }
     74        nbrRouters = scan.nextInt();
     75        if (nbrRouters < 0) {
     76            usage();
     77            return;
     78        }
     79       
     80        _out = System.out;
     81
     82        buildClientProps(0);
     83        _defaultContext = new I2PAppContext(buildRouterProps(0));
    5884        _defaultContext.clock().setOffset(0);
    5985       
     
    6187            @Override
    6288            public void run() {
    63                 Thread.currentThread().setName("Router* Shutdown");
    64                 try { Thread.sleep(120*1000); } catch (InterruptedException ie) {}
    65                 Runtime.getRuntime().halt(-1);
     89                _out.println("Shutting down in a few moments..");
     90                for(Router r : _routers) {
     91                        r.shutdown(-1);
     92                }
     93                try { Thread.sleep(1500); } catch (InterruptedException ie) {}
     94                Runtime.getRuntime().halt(0);
    6695            }
    6796        });
    6897       
    69         for (int i = 1; i < args.length; i++) {
    70             Router router = new Router(getEnv(args[i]));
     98        for (int i = 0; i < nbrRouters; i++) {
     99            Router router = new Router(buildRouterProps(i));
    71100            router.setKillVMOnEnd(false);
    72101            _routers.add(router);
    73             _log.info("Router " + i + " created from " + args[i]);
    74             //try { Thread.sleep(2*1000); } catch (InterruptedException ie) {}
    75         }
    76        
    77         for (int i = 0; i < _routers.size(); i++) {
    78             Router r = (Router)_routers.get(i);
     102            _out.println("Router " + i + " was created");
     103        }
     104       
     105        for (int i = 0; i < nbrRouters; i++) {
     106                Router r = _routers.get(i);
    79107            long offset = r.getContext().random().nextLong(Router.CLOCK_FUDGE_FACTOR/2);
    80108            if (r.getContext().random().nextBoolean())
     
    82110            r.getContext().clock().setOffset(offset, true);
    83111            r.runRouter();
    84             _log.info("Router " + i + " started with clock offset " + offset);
    85             try { Thread.sleep(2*1000 + new java.util.Random().nextInt(2)*1000); } catch (InterruptedException ie) {}
    86         }
    87         _log.info("All " + _routers.size() + " routers started up");
     112            _out.println("Router " + i + " was started with time offset " + offset);
     113        }
     114        _out.println("All routers have been started");
     115       
     116        /* Wait for routers to start services and generate keys.. */
     117        try { Thread.sleep(1000); } catch (InterruptedException ie) {}   
     118        internalReseed();
     119       
    88120        waitForCompletion();
    89121    }
    90122   
    91     private static Properties getEnv(String filename) {
     123    private static void internalReseed() {
     124
     125        HashSet<RouterInfo> riSet = new HashSet<RouterInfo>();
     126        for(Router r : _routers) {
     127                riSet.addAll(r.getContext().netDb().getRouters());
     128        }
     129                for(Router r : _routers) {
     130                for(RouterInfo ri : riSet){
     131                        r.getContext().netDb().publish(ri);
     132                }
     133        }
     134                _out.println(riSet.size() + " RouterInfos were reseeded");
     135    }
     136   
     137    private static Properties buildRouterProps(int id) {
     138        Properties props = getRouterProps(id);
     139        File f = new File(props.getProperty("router.configLocation"));
     140        f.getParentFile().mkdirs();
     141        if (!f.exists()) {
     142            try {
     143                                DataHelper.storeProps(props, f);
     144                        } catch (IOException e) {
     145                                e.printStackTrace();
     146                        }
     147        }
     148        return props;
     149    }
     150   
     151    private static Properties getRouterProps(int id) {
    92152        Properties props = new Properties();
    93         FileInputStream in = null;
    94         try {
    95             in = new FileInputStream(filename);
    96             props.load(in);
    97             props.setProperty("time.disabled", "true");
    98             return props;
    99         } catch (IOException ioe) {
    100             ioe.printStackTrace();
    101             return null;
    102         } finally {
    103             if (in != null) try { in.close(); } catch (IOException ioe) {}
    104         }
     153
     154        props.setProperty("router.profileDir", "/peerProfiles");
     155        props.setProperty("router.sessionKeys.location", "/sessionKeys.dat");
     156        props.setProperty("router.info.location", "/router.info");
     157        props.setProperty("router.keys.location", "/router.keys");
     158        props.setProperty("router.networkDatabase.dbDir", "/netDb");
     159        props.setProperty("router.tunnelPoolFile", "/tunnelPool.dat");
     160        props.setProperty("router.keyBackupDir", "/keyBackup");
     161        props.setProperty("router.clientConfigFile", getBaseDir(id) + "/clients.config");
     162        props.setProperty("router.configLocation", getBaseDir(id) + "/router.config");
     163        props.setProperty("router.pingFile", getBaseDir(id) + "/router.ping");
     164        props.setProperty("router.rejectStartupTime", "0");
     165        props.setProperty("router.reseedDisable", "true");
     166        props.setProperty("i2p.dir.app", getBaseDir(id));
     167       
     168        /* If MultiRouter is not run from a dir containing lib/, webapps/, docs/, etc.
     169         * point i2p.dir.base to a directory containing the above. */
     170        //props.setProperty("i2p.dir.base", getBaseDir(id));
     171        props.setProperty("i2p.dir.config", getBaseDir(id));
     172        props.setProperty("i2p.dir.log", getBaseDir(id));
     173        props.setProperty("i2p.dir.router", getBaseDir(id));
     174        props.setProperty("i2p.dir.pid", getBaseDir(id));
     175        //props.setProperty("i2p.vmCommSystem", "true");
     176        props.setProperty("i2np.ntcp.hostname", "127.0.0.1");
     177        props.setProperty("i2np.udp.host", "127.0.0.1");
     178        props.setProperty("i2np.ntcp.port", BASE_PORT + id + "");
     179        props.setProperty("i2np.udp.port", BASE_PORT + id + "");
     180        props.setProperty("i2np.ntcp.allowLocal", "true");
     181        props.setProperty("i2np.udp.allowLocal", "true");
     182        props.setProperty("i2np.udp.internalPort", BASE_PORT + id + "");
     183        props.setProperty("i2cp.port", Integer.toString((BASE_PORT + nbrRouters + id)));   
     184
     185        return props;
     186    }
     187   
     188    private static Properties buildClientProps(int id) {
     189        Properties rProps = getRouterProps(id);
     190        Properties props = getClientProps();
     191        File f = new File(rProps.getProperty("router.clientConfigFile"));
     192        f.getParentFile().mkdirs();
     193        if (!f.exists()) {
     194            try {
     195                                DataHelper.storeProps(props, f);
     196                        } catch (IOException e) {
     197                                e.printStackTrace();
     198                        }
     199        }
     200        return props;
     201    }
     202   
     203    private static Properties getClientProps() {
     204        Properties props = new Properties();
     205       
     206        props.setProperty("clientApp.0.args", (BASE_PORT-1) + " 127.0.0.1 ./webapps");
     207        props.setProperty("clientApp.0.main", "net.i2p.router.web.RouterConsoleRunner");
     208        props.setProperty("clientApp.0.name", "webconsole");
     209        props.setProperty("clientApp.0.onBoot", "true");
     210        props.setProperty("clientApp.1.args", "i2ptunnel.config");
     211        props.setProperty("clientApp.1.main", "net.i2p.i2ptunnel.TunnelControllerGroup");
     212        props.setProperty("clientApp.1.name", "tunnels");
     213        props.setProperty("clientApp.1.delay", "6");
     214       
     215        return props;
     216    }
     217   
     218    private static String getBaseDir(int id) {
     219        File f = new File(".");
     220        return f.getAbsoluteFile().getParentFile().toString() + "/multirouter/"+ Integer.toString(id);
    105221    }
    106222   
     
    111227                Router r = (Router)_routers.get(i);
    112228                if (!r.isAlive()) {
    113                     if (_log.shouldLog(Log.INFO))
    114                         _log.info("Router " + i + " is dead");
     229                        _out.println("Router " + i + " is dead");
    115230                } else {
    116231                    alive++;
     
    123238            }
    124239        }
    125         _log.info("All routers shut down");
     240        _out.println("All routers shut down");
    126241    }
    127242   
    128243    private static void usage() {
    129         System.err.println("Usage: MultiRouter globalContextFile routerContextFile[ routerContextFile]*");
    130         System.err.println("       The context files contain key=value entries specifying properties");
    131         System.err.println("       to load into the given context.  In addition, each routerContextFile");
    132         System.err.println("       in turn is used to boot a router");
     244        System.err.println("Usage: MultiRouter nbr_routers");
     245        System.err.println("       Where nbr_routers > 0");
    133246    }
    134247}
  • router/java/src/net/i2p/router/RouterThrottleImpl.java

    rff5abfb r6bbd34ee  
    2828    private static final int DEFAULT_MAX_TUNNELS = 5000;
    2929    private static final String PROP_MAX_PROCESSINGTIME = "router.defaultProcessingTimeThrottle";
     30    private static final long DEFAULT_REJECT_STARTUP_TIME = 20*60*1000;
     31    private static final String PROP_REJECT_STARTUP_TIME = "router.rejectStartupTime";
    3032
    3133    /**
     
    4042    private static final int PREPROCESSED_SIZE = 1024;
    4143
    42     private static final long REJECT_STARTUP_TIME = 20*60*1000;
    4344   
    4445    public RouterThrottleImpl(RouterContext context) {
     
    4647        _log = context.logManager().getLog(RouterThrottleImpl.class);
    4748        setTunnelStatus();
    48         _context.simpleScheduler().addEvent(new ResetStatus(), REJECT_STARTUP_TIME + 120*1000);
     49        _context.simpleScheduler().addEvent(new ResetStatus(), 5*1000 + _context.getProperty(PROP_REJECT_STARTUP_TIME, DEFAULT_REJECT_STARTUP_TIME));
    4950        _context.statManager().createRateStat("router.throttleNetworkCause", "How lagged the jobQueue was when an I2NP was throttled", "Throttle", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 });
    5051        //_context.statManager().createRateStat("router.throttleNetDbCause", "How lagged the jobQueue was when a networkDb request was throttled", "Throttle", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 });
     
    115116       
    116117        // Don't use CRIT because we don't want peers to think we're failing
    117         if (_context.router().getUptime() < REJECT_STARTUP_TIME) {
     118        if (_context.router().getUptime() < DEFAULT_REJECT_STARTUP_TIME) {
    118119            setTunnelStatus(_x("Rejecting tunnels: Starting up"));
    119120            return TunnelHistory.TUNNEL_REJECT_BANDWIDTH;
Note: See TracChangeset for help on using the changeset viewer.