On Wed, Oct 31, 2012 at 2:15 PM, Philip Martin <philip.mar...@wandisco.com>wrote:
> Philip Martin <philip.mar...@wandisco.com> writes: > > > stef...@apache.org writes: > > > >> Author: stefan2 > >> Date: Wed Oct 31 12:27:29 2012 > >> New Revision: 1404112 > >> > >> URL: http://svn.apache.org/viewvc?rev=1404112&view=rev > >> Log: > >> Change the way we implement shared memory setup for our named atomics. > >> Instead of using APR's SHM API, we create a persistent file and simply > >> mmap it. > > > >> +/* Make sure the revprop_namespace member in FS is set. */ > >> +static svn_error_t * > >> +cleanup_revprop_namespace(svn_fs_t *fs) > >> +{ > >> + const char* name = svn_dirent_join(fs->path, > > > > const char *name > > > >> + err = svn_io_check_path(shm_name, &kind, sub_pool); > >> + if (!err && kind != svn_node_file) > >> { > >> - apr_err = apr_shm_attach(&shared_mem, shm_name, result_pool); > >> - if (!apr_err) > >> - { > >> - new_ns->data = apr_shm_baseaddr_get(shared_mem); > >> - break; > >> - } > >> - > >> - /* First race: failed to attach but another process could > create. */ > >> - > >> - apr_err = apr_shm_create(&shared_mem, > >> - sizeof(*new_ns->data), > >> - shm_name, > >> - result_pool); > >> - if (!apr_err) > >> + err = svn_io_file_open(&file, shm_name, > >> + APR_READ | APR_WRITE | APR_CREATE, > >> + APR_OS_DEFAULT, > >> + result_pool); > >> + if (!err) > >> { > >> - new_ns->data = apr_shm_baseaddr_get(shared_mem); > >> - > >> - /* Zero all counters, values and names. */ > >> - memset(new_ns->data, 0, sizeof(*new_ns->data)); > >> - break; > >> + /* Zero all counters, values and names. > >> + */ > >> + struct shared_data_t initial_data; > >> + memset(&initial_data, 0, sizeof(initial_data)); > >> + err = svn_io_file_write_full(file, &initial_data, > >> + sizeof(initial_data), NULL, > >> + sub_pool); > >> } > >> - > >> - /* Second race: failed to create but another process could > delete. */ > >> + } > >> + else > >> + { > >> + err = svn_io_file_open(&file, shm_name, > >> + APR_READ | APR_WRITE, APR_OS_DEFAULT, > >> + result_pool); > > Suppose the process that first created the file got interrupted between > the svn_io_file_open and svn_io_file_write_full calls. The file is > incomplete but this process is going to assume it is correct and use it. > Will that work? Perhaps we should stat() the file to check the size? > Thanks for the review(s)! As of r1404138, all issues should have been addressed. Let's see what the build bots have to say about that ;) -- Stefan^2. -- Certified & Supported Apache Subversion Downloads: * http://www.wandisco.com/subversion/download *