View Javadoc

1   /*
2    * Copyright (c) 1998-2002 The Jgroup Team.
3    *
4    * This program is free software; you can redistribute it and/or modify
5    * it under the terms of the GNU Lesser General Public License version 2 as
6    * published by the Free Software Foundation.
7    *
8    * This program is distributed in the hope that it will be useful,
9    * but WITHOUT ANY WARRANTY; without even the implied warranty of
10   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11   * GNU Lesser General Public License for more details.
12   *
13   * You should have received a copy of the GNU Lesser General Public License
14   * along with this program; if not, write to the Free Software
15   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16   *
17   */
18  
19  package jgroup.relacs.mss;
20  
21  import java.util.Random;
22  
23  /**
24   *  Class for generating random and timeout values.
25   *
26   *  @author Salvatore Cammarata
27   *  @author Alberto Montresor
28   *  @author Hein Meling
29   *  @since Jgroup 1.2
30   */
31  final class RandomGenerator 
32  {
33  
34    ////////////////////////////////////////////////////////////////////////////////////////////
35    // Static section
36    ////////////////////////////////////////////////////////////////////////////////////////////
37  
38    /** Random generator */
39    private static final Random random = new Random();
40  
41  
42    ////////////////////////////////////////////////////////////////////////////////////////////
43    // Probabilistic Parameters
44    ////////////////////////////////////////////////////////////////////////////////////////////
45  
46    // FIXME Change this static fields
47    private static final long RANDOM_SECTOR = 4;
48  
49    /* Random part to be used for computing a random value. */
50    private static long RANDOM_TIMEOUT;
51  
52    /* Fixed part to be used for computing a random value. */
53    private static long FIXED_TIMEOUT;
54  
55    /* Last NACK deadline; initialized with the current time. */
56    private static long lastNackDeadline = System.currentTimeMillis();
57  
58  
59    ////////////////////////////////////////////////////////////////////////////////////////////
60    // Static methods
61    ////////////////////////////////////////////////////////////////////////////////////////////
62  
63    /**
64     *  Generate a positive integer within the integer range.  This is
65     *  used to generate message identifiers.
66     */
67    public static int newNonce()
68    {
69      return random.nextInt(Integer.MAX_VALUE);
70    }
71  
72  
73    /**
74     *  Compute a routing timeout value based on a random value and the
75     *  values previously set using the <code>setRoutingTimeout</code>
76     *  method.
77     */
78    public static long getRoutingTimeout() {
79      return (long) (random.nextDouble() * RANDOM_TIMEOUT + FIXED_TIMEOUT);
80    }
81  
82  
83    /**
84     *  Compute routing timeout values based on the given value.
85     */
86    public static void setRoutingTimeout(long rt)
87    {
88      RANDOM_TIMEOUT = rt / RANDOM_SECTOR;
89      FIXED_TIMEOUT = rt - RANDOM_TIMEOUT;
90    }
91  
92  
93    /**
94     *  Compute a random timeout value based on the given value.
95     */
96    public static long getRandomTimeout(long rt)
97    {
98      long randomTimeout = rt / RANDOM_SECTOR;
99      long fixedTimeout = rt - randomTimeout;
100 
101     double deltaRandom = random.nextDouble() * randomTimeout;
102     long deltaNew = (long) (deltaRandom + fixedTimeout);
103 
104     long current = System.currentTimeMillis();
105     if (deltaNew + current < lastNackDeadline) {
106       lastNackDeadline += deltaRandom; 
107       deltaNew = lastNackDeadline - current;
108     } else {
109       lastNackDeadline = current + deltaNew;
110     }
111     return deltaNew;
112   }
113 
114 } // END RandomGenerator