Tcl Library Source Code

Check-in [b79e07e239]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Redesign of the free_port system for nns_cluster.
Timelines: family | ancestors | descendants | both | odie
Files: files | file ages | folders
SHA1: b79e07e239dc02ed986caff8700ca724c2f84eae
User & Date: hypnotoad 2015-09-21 17:17:31
Context
2015-09-24
00:34
Added a new mechanism to designate certain parties in the cluster to act as repositories. When a DISCOVERY request goes out that parrot back everything they have seen, not just its own services check-in: 64d9695c87 user: hypnotoad tags: odie
2015-09-21
17:17
Redesign of the free_port system for nns_cluster. check-in: b79e07e239 user: hypnotoad tags: odie
10:48
Updated the TOOL description check-in: 06880d1d1f user: hypnotoad tags: odie
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to modules/nns/nns_cluster.tcl.

35
36
37
38
39
40
41

42
43
44
45
46
47
48
    flush $sock
  } error]} {
    set ::cluster::broadcast_sock {}
    if {$::cluster::config(debug)} {
      puts "Broadcast ERR: $error - Reopening Socket"
      ::cluster::sleep 2000
    } else {

      ::cluster::sleep 250
    }
  }
}

###
# topic: 963e24601d0dc61580c9727a74cdba67







>







35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
    flush $sock
  } error]} {
    set ::cluster::broadcast_sock {}
    if {$::cluster::config(debug)} {
      puts "Broadcast ERR: $error - Reopening Socket"
      ::cluster::sleep 2000
    } else {
      # Double the delay
      ::cluster::sleep 250
    }
  }
}

###
# topic: 963e24601d0dc61580c9727a74cdba67
128
129
130
131
132
133
134

135
136
137
138
139
140
141

142
143
144
145
146
147
148
      set serviceurl [lindex $messageinfo 0]
      set serviceinfo [lindex $messageinfo 1]
      dict set serviceinfo ipaddr [lindex $peer 0]
      dict set serviceinfo closed 1
      Service_Remove $serviceurl $serviceinfo
    }
    ~SERVICE {

      set serviceurl [lindex $messageinfo 0]
      set serviceinfo [lindex $messageinfo 1]
      dict set serviceinfo ipaddr [lindex $peer 0]
      Service_Modified $serviceurl $serviceinfo
      set ::cluster::ping_recv($serviceurl) [clock seconds]
    }
    +SERVICE {

      set serviceurl [lindex $messageinfo 0]
      set serviceinfo [lindex $messageinfo 1]
      dict set serviceinfo ipaddr [lindex $peer 0]
      Service_Add $serviceurl $serviceinfo
      set ::cluster::ping_recv($serviceurl) [clock seconds]
    }
    DISCOVERY {







>







>







129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
      set serviceurl [lindex $messageinfo 0]
      set serviceinfo [lindex $messageinfo 1]
      dict set serviceinfo ipaddr [lindex $peer 0]
      dict set serviceinfo closed 1
      Service_Remove $serviceurl $serviceinfo
    }
    ~SERVICE {
      set ::cluster::recv_message 1
      set serviceurl [lindex $messageinfo 0]
      set serviceinfo [lindex $messageinfo 1]
      dict set serviceinfo ipaddr [lindex $peer 0]
      Service_Modified $serviceurl $serviceinfo
      set ::cluster::ping_recv($serviceurl) [clock seconds]
    }
    +SERVICE {
      set ::cluster::recv_message 1
      set serviceurl [lindex $messageinfo 0]
      set serviceinfo [lindex $messageinfo 1]
      dict set serviceinfo ipaddr [lindex $peer 0]
      Service_Add $serviceurl $serviceinfo
      set ::cluster::ping_recv($serviceurl) [clock seconds]
    }
    DISCOVERY {
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255








256
257
258
259
260
261
262
263
264
265
266
267

268
269
270
271
272
273
274
proc ::cluster::unpublish {url infodict} {
  variable local_data
  foreach {field value} $infodict {
    dict set local_data($url) $field $value
  }
  set info [lindex [array get local_data $url] 1]
  broadcast -SERVICE $url $info
  update
  unset -nocomplain local_data($url)
}

proc ::cluster::configure {url infodict {send 1}} {
  variable local_data
  if {![::info exists local_data($url)]} return
  foreach {field value} $infodict {
    dict set local_data($url) $field $value
  }
  if {$send} {
    broadcast ~SERVICE $url $local_data($url)
    update
  }
}

proc ::cluster::get_free_port {{startport 50000}} {








  set port $startport
  set conflict 1
  while {$conflict} {
    set conflict 0
    set port [::nettool::find_port $port]
    foreach {url info} [search *@[macid]] {
      if {[dict exists $info port] && [dict get $info port] eq $port} {
        incr port
        set conflict 1
        break
      }
    }

  }
  return $port
}

proc ::cluster::log args {
  broadcast LOG {*}$args
}







<
















>
>
>
>
>
>
>
>












>







235
236
237
238
239
240
241

242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
proc ::cluster::unpublish {url infodict} {
  variable local_data
  foreach {field value} $infodict {
    dict set local_data($url) $field $value
  }
  set info [lindex [array get local_data $url] 1]
  broadcast -SERVICE $url $info

  unset -nocomplain local_data($url)
}

proc ::cluster::configure {url infodict {send 1}} {
  variable local_data
  if {![::info exists local_data($url)]} return
  foreach {field value} $infodict {
    dict set local_data($url) $field $value
  }
  if {$send} {
    broadcast ~SERVICE $url $local_data($url)
    update
  }
}

proc ::cluster::get_free_port {{startport 50000}} {
  ::cluster::listen
  ::cluster::broadcast DISCOVERY
  after 10000 {set ::cluster::recv_message 0}
  # Wait for a pingback or timeout
  vwait ::cluster::recv_message
  update
  
  set macid [::cluster::macid]
  set port $startport
  set conflict 1
  while {$conflict} {
    set conflict 0
    set port [::nettool::find_port $port]
    foreach {url info} [search *@[macid]] {
      if {[dict exists $info port] && [dict get $info port] eq $port} {
        incr port
        set conflict 1
        break
      }
    }
    update
  }
  return $port
}

proc ::cluster::log args {
  broadcast LOG {*}$args
}