AOLserver nsv CommandsThe nsv commands provide a high performance data sharing mechanism. This facility is much flexible alternative to the obsolete ns_share command. The model uses an array syntax and includes more features. In addition, lock contention is managed in a much more scalable way--something that is not possible with the obsolete ns_share facility.NOTE: The use of ns_share is deprecated. Careless use of ns_share commands can severely limit the scalability of an application. The nsv commands solve this and this document describes how to migrate your ns_share code to use nsv.
BasicsThe following commands currently make up the nsv interface:
nsv_get - get key value
Commands for the most part mirror the cooresponding Tcl command for ordinary variables. Basically, to set a value, simply use the nsv_set command: nsv_set myarray foo $value and to get a value, simply use the nsv_get command: set value [nsv_get myarray foo]
Migrating From ns_shareMigrating from ns_share is straightforward. If your init.tcl included commands such as:
ns_share myshare
use instead: nsv_set myshare lock [ns_mutex create] In your procedures, instead of: proc myproc {} { ns_share myshare ns_mutex lock $myshare(lock) ... use:
proc myproc {} {
and within an ADP page, instead of:
<%
<%=$myshare(key2)%> use:
<%
<%=[nsv_get myshare key2]%> Notice that, unlike ns_share, no command is required to define the shared array. The first attempt at setting the variable through any means will automaticaly create the array. Also notice that only arrays are supported. However, to migrate from ns_share you can simply package up all existing ns_share scalars into a single array with a short name, perhaps just ".". For example, if you had:
ns_share mylock myfile
you can use:
nsv_set . myfile /tmp/some.file
Multithreading FeaturesOne advantages of nsv is built in interlocking for thread safety. For example, consider a case of a "increment-by-one" unique id system. Here's the ns_share solution:
ns_share ids
proc nextid {} {
and here's an nsv solution: nsv_set ids next 0
proc nextid {} {
Note that the nsv solution does not need a mutex as the nsv_incr command is internally interlocked.
Compatibility with Tcl ArraysAnother useful feature of nsv is the nsv_array command which works much like the Tcl array command. This can be used to import and export values from ordinary Tcl arrays. For example, to copy from Tcl use: nsv_array set meta [array get tmpmeta] and to copy to Tcl use: array set metacopy [nsv_array get meta] As with all other nsv command, nsv_array is atomic and no explicit locking is required. This feature can be used to contruct a new nsv array by first filling up an ordinary temporary Tcl array via some time consuming process and then swapping it into place as above. While the new temporary array is being constructed, other threads can access the old array without delay or inconsistant data. You can even reset a complete nsv array in one step with "reset". For example, instead of:
ns_share lock meta
ns_mutex lock $lock
you can simply use: nsv_array reset meta [array get tmpmeta] The reset option will flush and then reset all values atomically, eliminating the need for the explicit lock. Other options for the nsv_array command include:
nsv_exists array - test existance of array
ConfigurationThe nsv system uses a common multithreading technique to reduce the potential for lock contention which is to split the locks to acheive finer grained locking. This technique groups arrays randomly into buckets and only the arrays within a particular bucket share a lock. The number of buckets to be used can be configured by setting the "nsvbuckets" tcl parameters, e.g.:
[ns/server/server1/tcl]
The default is 8 which should be reasonalbe. Note that you can monitor the lock contention, if any, by enabling mutex metering:
[ns/threads]
and then viewing the results of "ns_info locks" command after the server has been running for some time. The nsv locks all have names of the form "nsv:##". If you find many lock attempts which did not successed immediately, try increasing nsvbuckets. |