cluster-init.tcl
Does not contain a contract.
- Location:
- /packages/acs-tcl/tcl/cluster-init.tcl
Related Files
[ hide source ] | [ make this the default ]
File Contents
# # Check if cluster is enabled, and if, set up the custer objects # ns_log notice "cluster-init: server_cluster_enabled_p: [server_cluster_enabled_p]" if {[server_cluster_enabled_p]} { # # Check, whether the secret for intra-cluster communication is # properly defined. If not, then do not activate cluster mode. # if {![::acs::cluster secret_configured]} { ns_log error "cluster-init: cluster setup aborted:" \ "the cluster secret is missing." \ "Deactivated cluster mode." proc server_cluster_enabled_p {} { return 0 } return } # # Perform setup only once (not in every object creation in new # threads). # ns_log notice "cluster-init: performing cluster setup" ::acs::cluster setup ns_log notice "cluster-init: performing cluster setup DONE" # # Update the cluster info depending of the configured # ClusterHeartbeatInterval to detect changed cluster # configurations (maybe induced by missing reachability). # This has to happen on all cluster nodes. # ad_schedule_proc -all_servers t \ [parameter::get \ -package_id $::acs::kernel_id \ -parameter ClusterHeartbeatInterval \ -default 20s] \ ::acs::cluster update_node_info # # Liveliness manager (running on the canonical server). It checks # e.g. whether dynamic nodes should be deleted from the dynamic # cluster nodes list automatically after some time of being not # reachable. # ad_schedule_proc 5s ::acs::cluster check_state # # Setup of the listening URL # set url [::acs::cluster cget -url] # Check, if the filter URL mirrors a site node. If so, # the cluster mechanism will not work, if the site node # requires a login. Clustering will only work if the # root node is freely accessible. set node_info [site_node::get -url $url] if {[dict get $node_info url] ne "/"} { ns_log warning "***\n*** WARNING: there appears a package mounted on" \ "$url\n***Cluster configuration will not work" \ "since there is a conflict with the filter with the same name! (n)" } else { #ns_register_filter trace GET $url ::acs::cluster ns_register_filter preauth GET $url ::acs::cluster #ns_register_filter postauth GET $url ::acs::cluster #ad_register_filter -priority 900 preauth GET $url ::acs::cluster ns_register_proc GET $url ::acs::cluster incoming_request } # # Register the nodes, which are reachable at startup time. # ::acs::cluster register_nodes -startup ns_atstartup { ns_log notice "acs::cluster starting:" \ "running as canonical server [::acs::cluster current_server_is_canonical_server]," \ "cluster nodes: [nsv_get cluster cluster_peer_nodes]" } # # Register callback for shutdown operations. When the shutdown is # performed at a dynamic cluster node, disconnect the node from the # cluster. # ns_atshutdown { if {[::acs::cluster current_server_is_canonical_server]} { ns_log notice "acs::cluster: shutdown canonical server" } elseif {[::acs::cluster current_server_is_dynamic_cluster_peer]} { ns_log notice "acs::cluster: shutdown dynamic cluster peer (perform disconnect operation)" acs::cluster send_disconnect_request_to_canonical_server } else { ns_log notice "acs::cluster: shutdown static cluster peer" } } } # # Local variables: # mode: tcl # tcl-indent-level: 4 # indent-tabs-mode: nil # End: