This is a huge commit with - no links back to the Jira ticket - no source code comments - no indication of the problem that it is solving or how it solves it - no performance comparison (I assume this for performance) - no documentation of the new configuration parameters - no indication of compatibility (is it really OK to the 4.x branch?) - no tests
Please, can we talk about the above issues? On Nov 19, 2013, at 11:45 PM, wei...@apache.org wrote: > Updated Branches: > refs/heads/refine_cluster [created] 7ffc10a9c > > > http://git-wip-us.apache.org/repos/asf/trafficserver/blob/7ffc10a9/iocore/cluster/P_ClusterInline.h > ---------------------------------------------------------------------- > diff --git a/iocore/cluster/P_ClusterInline.h > b/iocore/cluster/P_ClusterInline.h > index c653956..1d26b3a 100644 > --- a/iocore/cluster/P_ClusterInline.h > +++ b/iocore/cluster/P_ClusterInline.h > @@ -36,25 +36,30 @@ inline Action * > Cluster_lookup(Continuation * cont, CacheKey * key, CacheFragType frag_type, > char *hostname, int host_len) > { > // Try to send remote, if not possible, handle locally > - Action *retAct; > - ClusterMachine *m = cluster_machine_at_depth(cache_hash(*key)); > - if (m && !clusterProcessor.disable_remote_cluster_ops(m)) { > - CacheContinuation *cc = CacheContinuation::cacheContAllocator_alloc(); > - cc->action = cont; > - cc->mutex = cont->mutex; > - retAct = CacheContinuation::do_remote_lookup(cont, key, cc, frag_type, > hostname, host_len); > - if (retAct) { > - return retAct; > - } else { > - // not remote, do local lookup > - CacheContinuation::cacheContAllocator_free(cc); > - return (Action *) NULL; > - } > - } else { > - Action a; > - a = cont; > - return CacheContinuation::callback_failure(&a, > CACHE_EVENT_LOOKUP_FAILED, 0); > - } > +// Action *retAct; > +// ClusterMachine *m = cluster_machine_at_depth(cache_hash(*key)); > +// if (m && !clusterProcessor.disable_remote_cluster_ops(m)) { > +// CacheContinuation *cc = CacheContinuation::cacheContAllocator_alloc(); > +// cc->action = cont; > +// cc->mutex = cont->mutex; > +// retAct = CacheContinuation::do_remote_lookup(cont, key, cc, frag_type, > hostname, host_len); > +// if (retAct) { > +// return retAct; > +// } else { > +// // not remote, do local lookup > +// CacheContinuation::cacheContAllocator_free(cc); > +// return (Action *) NULL; > +// } > +// } else { > +// Action a; > +// a = cont; > +// return CacheContinuation::callback_failure(&a, > CACHE_EVENT_LOOKUP_FAILED, 0); > +// } > + (void) cont; > + (void) key; > + (void) frag_type; > + (void) hostname; > + (void) host_len; > return (Action *) NULL; > } > > @@ -66,18 +71,24 @@ Cluster_read(ClusterMachine * owner_machine, int opcode, > time_t pin_in_cache, CacheFragType frag_type, char *hostname, > int host_len) > { > (void) params; > - if (clusterProcessor.disable_remote_cluster_ops(owner_machine)) { > - Action a; > - a = cont; > - return CacheContinuation::callback_failure(&a, > CACHE_EVENT_OPEN_READ_FAILED, 0); > + ink_assert(cont); > + ClusterSession session; > + if (cluster_create_session(&session, owner_machine, NULL, 0)) { > + cont->handleEvent(CACHE_EVENT_OPEN_READ_FAILED, NULL); > + return ACTION_RESULT_DONE; > } > + > int vers = CacheOpMsg_long::protoToVersion(owner_machine->msg_proto_major); > + CacheOpArgs_General readArgs; > + Ptr<IOBufferData> d; > + > int flen; > int len = 0; > int cur_len; > int res = 0; > - char *msg; > + char *msg = 0; > char *data; > + Action *action = NULL; > > if (vers == CacheOpMsg_long::CACHE_OP_LONG_MESSAGE_VERSION) { > if ((opcode == CACHE_OPEN_READ_LONG) > @@ -87,20 +98,21 @@ Cluster_read(ClusterMachine * owner_machine, int opcode, > > const char *url_hostname; > int url_hlen; > - INK_MD5 url_only_md5; > + INK_MD5 url_md5; > > - Cache::generate_key(&url_only_md5, url, 0); > + Cache::generate_key(&url_md5, url); > url_hostname = url->host_get(&url_hlen); > > len += request->m_heap->marshal_length(); > - len += params->marshal_length(); > + len += sizeof(CacheLookupHttpConfig) + params->marshal_length(); > len += url_hlen; > > if ((flen + len) > DEFAULT_MAX_BUFFER_SIZE) // Bound marshalled > data > goto err_exit; > > // Perform data Marshal operation > - msg = (char *) ALLOCA_DOUBLE(flen + len); > + d = new_IOBufferData(iobuffer_size_to_index(flen + len)); > + msg = (char *) d->data(); > data = msg + flen; > > cur_len = len; > @@ -110,6 +122,13 @@ Cluster_read(ClusterMachine * owner_machine, int opcode, > } > data += res; > cur_len -= res; > + > + if (cur_len < (int) sizeof(CacheLookupHttpConfig)) > + goto err_exit; > + memcpy(data, params, sizeof(CacheLookupHttpConfig)); > + data += sizeof(CacheLookupHttpConfig); > + cur_len -= sizeof(CacheLookupHttpConfig); > + > if ((res = params->marshal(data, cur_len)) < 0) > goto err_exit; > data += res; > @@ -117,37 +136,33 @@ Cluster_read(ClusterMachine * owner_machine, int opcode, > memcpy(data, url_hostname, url_hlen); > > CacheOpArgs_General readArgs; > - readArgs.url_md5 = &url_only_md5; > + readArgs.url_md5 = &url_md5; > readArgs.pin_in_cache = pin_in_cache; > readArgs.frag_type = frag_type; > - return CacheContinuation::do_op(cont, owner_machine, (void *) > &readArgs, > - opcode, (char *) msg, (flen + len), > -1, buf); > + > + action = CacheContinuation::do_op(cont, session, (void *) &readArgs, > + opcode, d, (flen + len), -1, > buf); > } else { > // Build message if we have host data. > + flen = op_to_sizeof_fixedlen_msg(opcode); > + len = host_len; > > - if (host_len) { > - // Determine length of data to Marshal > - flen = op_to_sizeof_fixedlen_msg(opcode); > - len = host_len; > - > - if ((flen + len) > DEFAULT_MAX_BUFFER_SIZE) // Bound marshalled > data > - goto err_exit; > + if ((flen + len) > DEFAULT_MAX_BUFFER_SIZE) // Bound marshalled > data > + goto err_exit; > > - msg = (char *) ALLOCA_DOUBLE(flen + len); > - data = msg + flen; > + d = new_IOBufferData(iobuffer_size_to_index(flen + len)); > + msg = (char *) d->data(); > + data = msg + flen; > + if (host_len) > memcpy(data, hostname, host_len); > > - } else { > - msg = 0; > - flen = 0; > - len = 0; > - } > - CacheOpArgs_General readArgs; > readArgs.url_md5 = key; > readArgs.frag_type = frag_type; > - return CacheContinuation::do_op(cont, owner_machine, (void *) > &readArgs, > - opcode, (char *) msg, (flen + len), > -1, buf); > + > + action = CacheContinuation::do_op(cont, session, (void *) &readArgs, > + opcode, d, (flen + len), -1, > buf); > } > + ink_assert(msg); > > } else { > ////////////////////////////////////////////////////////////// > @@ -155,10 +170,12 @@ Cluster_read(ClusterMachine * owner_machine, int opcode, > ////////////////////////////////////////////////////////////// > ink_release_assert(!"CacheOpMsg_long [read] bad msg version"); > } > + > + if (action) > + return action; > err_exit: > - Action a; > - a = cont; > - return CacheContinuation::callback_failure(&a, > CACHE_EVENT_OPEN_READ_FAILED, 0); > + cont->handleEvent(CACHE_EVENT_OPEN_READ_FAILED, NULL); > + return ACTION_RESULT_DONE; > } > > inline Action * > @@ -171,10 +188,11 @@ Cluster_write(Continuation * cont, int expected_size, > { > (void) key; > (void) request; > - if (clusterProcessor.disable_remote_cluster_ops(m)) { > - Action a; > - a = cont; > - return CacheContinuation::callback_failure(&a, > CACHE_EVENT_OPEN_WRITE_FAILED, 0); > + ClusterSession session; > + ink_assert(cont); > + if (cluster_create_session(&session, m, NULL, 0)) { > + cont->handleEvent(CACHE_EVENT_OPEN_WRITE_FAILED, NULL); > + return ACTION_RESULT_DONE; > } > char *msg = 0; > char *data = 0; > @@ -182,24 +200,22 @@ Cluster_write(Continuation * cont, int expected_size, > int len = 0; > int flen = 0; > int vers = CacheOpMsg_long::protoToVersion(m->msg_proto_major); > + Ptr<IOBufferData> d; > > switch (opcode) { > case CACHE_OPEN_WRITE: > { > // Build message if we have host data > - if (host_len) { > - // Determine length of data to Marshal > - flen = op_to_sizeof_fixedlen_msg(CACHE_OPEN_WRITE); > - len = host_len; > - > - if ((flen + len) > DEFAULT_MAX_BUFFER_SIZE) // Bound marshalled > data > - goto err_exit; > - > - msg = (char *) ALLOCA_DOUBLE(flen + len); > - data = msg + flen; > + len = host_len; > + flen = op_to_sizeof_fixedlen_msg(CACHE_OPEN_WRITE); > + if ((flen + len) > DEFAULT_MAX_BUFFER_SIZE) // Bound marshalled > data > + goto err_exit; > > + d = new_IOBufferData(iobuffer_size_to_index(flen + len)); > + msg = (char *) d->data(); > + data = msg + flen; > + if (host_len) > memcpy(data, hostname, host_len); > - } > break; > } > case CACHE_OPEN_WRITE_LONG: > @@ -223,8 +239,9 @@ Cluster_write(Continuation * cont, int expected_size, > if ((flen + len) > DEFAULT_MAX_BUFFER_SIZE) // Bound marshalled > data > goto err_exit; > > + d = new_IOBufferData(iobuffer_size_to_index(flen + len)); > + msg = (char *) d->data(); > // Perform data Marshal operation > - msg = (char *) ALLOCA_DOUBLE(flen + len); > data = msg + flen; > int res = 0; > > @@ -257,7 +274,9 @@ Cluster_write(Continuation * cont, int expected_size, > writeArgs.cfl_flags |= (old_info ? CFL_LOPENWRITE_HAVE_OLDINFO : 0); > writeArgs.cfl_flags |= (allow_multiple_writes ? CFL_ALLOW_MULTIPLE_WRITES > : 0); > > - return CacheContinuation::do_op(cont, m, (void *) &writeArgs, opcode, > msg, flen + len, expected_size, buf); > + Action *action = CacheContinuation::do_op(cont, session, (void *) > &writeArgs, opcode, d, flen + len, expected_size, buf); > + if (action) > + return action; > } else { > ////////////////////////////////////////////////////////////// > // Create the specified down rev version of this message > @@ -267,19 +286,21 @@ Cluster_write(Continuation * cont, int expected_size, > } > > err_exit: > - Action a; > - a = cont; > - return CacheContinuation::callback_failure(&a, > CACHE_EVENT_OPEN_WRITE_FAILED, 0); > + cont->handleEvent(CACHE_EVENT_OPEN_WRITE_FAILED, NULL); > + return ACTION_RESULT_DONE; > } > > inline Action * > Cluster_link(ClusterMachine * m, Continuation * cont, CacheKey * from, > CacheKey * to, > CacheFragType type, char *hostname, int host_len) > { > - if (clusterProcessor.disable_remote_cluster_ops(m)) { > - Action a; > - a = cont; > - return CacheContinuation::callback_failure(&a, CACHE_EVENT_LINK_FAILED, > 0); > + ClusterSession session; > + Ptr<IOBufferData> d; > + char *msg = NULL; > + > + if (cluster_create_session(&session, m, NULL, 0)) { > + cont->handleEvent(CACHE_EVENT_LINK_FAILED, NULL); > + return ACTION_RESULT_DONE; > } > > int vers = CacheOpMsg_short_2::protoToVersion(m->msg_proto_major); > @@ -293,7 +314,8 @@ Cluster_link(ClusterMachine * m, Continuation * cont, > CacheKey * from, CacheKey > if ((flen + len) > DEFAULT_MAX_BUFFER_SIZE) // Bound marshalled data > goto err_exit; > > - char *msg = (char *) ALLOCA_DOUBLE(flen + len); > + d = new_IOBufferData(iobuffer_size_to_index(flen + len)); > + msg = (char *) d->data(); > memcpy((msg + flen), hostname, host_len); > > // Setup args for remote link > @@ -301,7 +323,9 @@ Cluster_link(ClusterMachine * m, Continuation * cont, > CacheKey * from, CacheKey > linkArgs.from = from; > linkArgs.to = to; > linkArgs.frag_type = type; > - return CacheContinuation::do_op(cont, m, (void *) &linkArgs, CACHE_LINK, > msg, (flen + len)); > + Action *action = CacheContinuation::do_op(cont, session, (void *) > &linkArgs, CACHE_LINK, d, (flen + len)); > + if (action) > + return action; > } else { > ////////////////////////////////////////////////////////////// > // Create the specified down rev version of this message > @@ -311,18 +335,20 @@ Cluster_link(ClusterMachine * m, Continuation * cont, > CacheKey * from, CacheKey > } > > err_exit: > - Action a; > - a = cont; > - return CacheContinuation::callback_failure(&a, CACHE_EVENT_LINK_FAILED, 0); > + cont->handleEvent(CACHE_EVENT_LINK_FAILED, NULL); > + return ACTION_RESULT_DONE; > } > > inline Action * > Cluster_deref(ClusterMachine * m, Continuation * cont, CacheKey * key, > CacheFragType type, char *hostname, int host_len) > { > - if (clusterProcessor.disable_remote_cluster_ops(m)) { > - Action a; > - a = cont; > - return CacheContinuation::callback_failure(&a, CACHE_EVENT_DEREF_FAILED, > 0); > + ClusterSession session; > + Ptr<IOBufferData> d; > + char *msg = NULL; > + > + if (cluster_create_session(&session, m, NULL, 0)) { > + cont->handleEvent(CACHE_EVENT_DEREF_FAILED, NULL); > + return ACTION_RESULT_DONE ; > } > > int vers = CacheOpMsg_short::protoToVersion(m->msg_proto_major); > @@ -336,14 +362,17 @@ Cluster_deref(ClusterMachine * m, Continuation * cont, > CacheKey * key, CacheFrag > if ((flen + len) > DEFAULT_MAX_BUFFER_SIZE) // Bound marshalled data > goto err_exit; > > - char *msg = (char *) ALLOCA_DOUBLE(flen + len); > + d = new_IOBufferData(iobuffer_size_to_index(flen + len)); > + msg = (char *) d->data(); > memcpy((msg + flen), hostname, host_len); > > // Setup args for remote deref > CacheOpArgs_Deref drefArgs; > drefArgs.md5 = key; > drefArgs.frag_type = type; > - return CacheContinuation::do_op(cont, m, (void *) &drefArgs, > CACHE_DEREF, msg, (flen + len)); > + Action *action = CacheContinuation::do_op(cont, session, (void *) > &drefArgs, CACHE_DEREF, d, (flen + len)); > + if (action) > + return action; > } else { > ////////////////////////////////////////////////////////////// > // Create the specified down rev version of this message > @@ -353,19 +382,22 @@ Cluster_deref(ClusterMachine * m, Continuation * cont, > CacheKey * key, CacheFrag > } > > err_exit: > - Action a; > - a = cont; > - return CacheContinuation::callback_failure(&a, CACHE_EVENT_DEREF_FAILED, > 0); > + cont->handleEvent(CACHE_EVENT_DEREF_FAILED, NULL); > + return ACTION_RESULT_DONE ; > } > > inline Action * > Cluster_remove(ClusterMachine * m, Continuation * cont, CacheKey * key, > bool rm_user_agents, bool rm_link, CacheFragType frag_type, > char *hostname, int host_len) > { > - if (clusterProcessor.disable_remote_cluster_ops(m)) { > - Action a; > - a = cont; > - return CacheContinuation::callback_failure(&a, > CACHE_EVENT_REMOVE_FAILED, 0); > + ClusterSession session; > + Ptr<IOBufferData> d; > + char *msg = NULL; > + > + if (cluster_create_session(&session, m, NULL, 0)) { > + if (cont) > + cont->handleEvent(CACHE_EVENT_REMOVE_FAILED, NULL); > + return ACTION_RESULT_DONE; > } > > int vers = CacheOpMsg_short::protoToVersion(m->msg_proto_major); > @@ -379,7 +411,8 @@ Cluster_remove(ClusterMachine * m, Continuation * cont, > CacheKey * key, > if ((flen + len) > DEFAULT_MAX_BUFFER_SIZE) // Bound marshalled data > goto err_exit; > > - char *msg = (char *) ALLOCA_DOUBLE(flen + len); > + d = new_IOBufferData(iobuffer_size_to_index(flen + len)); > + msg = (char *) d->data(); > memcpy((msg + flen), hostname, host_len); > > // Setup args for remote update > @@ -388,7 +421,9 @@ Cluster_remove(ClusterMachine * m, Continuation * cont, > CacheKey * key, > updateArgs.cfl_flags |= (rm_user_agents ? CFL_REMOVE_USER_AGENTS : 0); > updateArgs.cfl_flags |= (rm_link ? CFL_REMOVE_LINK : 0); > updateArgs.frag_type = frag_type; > - return CacheContinuation::do_op(cont, m, (void *) &updateArgs, > CACHE_REMOVE, msg, (flen + len)); > + Action *action = CacheContinuation::do_op(cont, session, (void *) > &updateArgs, CACHE_REMOVE, d, (flen + len)); > + if (action) > + return action; > } else { > ////////////////////////////////////////////////////////////// > // Create the specified down rev version of this message > @@ -398,9 +433,8 @@ Cluster_remove(ClusterMachine * m, Continuation * cont, > CacheKey * key, > } > > err_exit: > - Action a; > - a = cont; > - return CacheContinuation::callback_failure(&a, CACHE_EVENT_REMOVE_FAILED, > 0); > + if (cont) > + cont->handleEvent(CACHE_EVENT_REMOVE_FAILED, NULL); > + return ACTION_RESULT_DONE; > } > - > #endif /* __CLUSTERINLINE_H__ */ > > http://git-wip-us.apache.org/repos/asf/trafficserver/blob/7ffc10a9/iocore/eventsystem/I_Event.h > ---------------------------------------------------------------------- > diff --git a/iocore/eventsystem/I_Event.h b/iocore/eventsystem/I_Event.h > index 7a37ea0..2659131 100644 > --- a/iocore/eventsystem/I_Event.h > +++ b/iocore/eventsystem/I_Event.h > @@ -85,6 +85,7 @@ > #define BLOCK_CACHE_EVENT_EVENTS_START 4000 > #define UTILS_EVENT_EVENTS_START 5000 > #define CONGESTION_EVENT_EVENTS_START 5100 > +#define CLUSTER_MSG_START 6000 > #define INK_API_EVENT_EVENTS_START 60000 > #define SRV_EVENT_EVENTS_START 62000 > #define REMAP_EVENT_EVENTS_START 63000 > > http://git-wip-us.apache.org/repos/asf/trafficserver/blob/7ffc10a9/iocore/eventsystem/P_IOBuffer.h > ---------------------------------------------------------------------- > diff --git a/iocore/eventsystem/P_IOBuffer.h b/iocore/eventsystem/P_IOBuffer.h > index 0842aff..261aa1f 100644 > --- a/iocore/eventsystem/P_IOBuffer.h > +++ b/iocore/eventsystem/P_IOBuffer.h > @@ -203,7 +203,7 @@ new_IOBufferData_internal( > void *b, int64_t size, int64_t asize_index) > { > (void) size; > - IOBufferData *d = THREAD_ALLOC(ioDataAllocator, this_ethread()); > + IOBufferData *d = ioDataAllocator.alloc(); > d->_size_index = asize_index; > ink_assert(BUFFER_SIZE_INDEX_IS_CONSTANT(asize_index) > || size <= d->block_size()); > @@ -263,7 +263,7 @@ new_IOBufferData_internal( > #endif > int64_t size_index, AllocType type) > { > - IOBufferData *d = THREAD_ALLOC(ioDataAllocator, this_ethread()); > + IOBufferData *d = ioDataAllocator.alloc(); > #ifdef TRACK_BUFFER_USER > d->_location = loc; > #endif > @@ -336,7 +336,7 @@ TS_INLINE void > IOBufferData::free() > { > dealloc(); > - THREAD_FREE(this, ioDataAllocator, this_ethread()); > + ioDataAllocator.free(this); > } > > ////////////////////////////////////////////////////////////////// > @@ -352,7 +352,7 @@ new_IOBufferBlock_internal( > #endif > ) > { > - IOBufferBlock *b = THREAD_ALLOC(ioBlockAllocator, this_ethread()); > + IOBufferBlock *b = ioBlockAllocator.alloc(); > #ifdef TRACK_BUFFER_USER > b->_location = location; > #endif > @@ -366,7 +366,7 @@ new_IOBufferBlock_internal( > #endif > IOBufferData * d, int64_t len, int64_t offset) > { > - IOBufferBlock *b = THREAD_ALLOC(ioBlockAllocator, this_ethread()); > + IOBufferBlock *b = ioBlockAllocator.alloc(); > #ifdef TRACK_BUFFER_USER > b->_location = location; > #endif > @@ -468,7 +468,7 @@ TS_INLINE void > IOBufferBlock::free() > { > dealloc(); > - THREAD_FREE(this, ioBlockAllocator, this_ethread()); > + ioBlockAllocator.free(this); > } > > TS_INLINE void > @@ -777,7 +777,7 @@ TS_INLINE MIOBuffer * new_MIOBuffer_internal( > #endif > int64_t size_index) > { > - MIOBuffer *b = THREAD_ALLOC(ioAllocator, this_ethread()); > + MIOBuffer *b = ioAllocator.alloc(); > #ifdef TRACK_BUFFER_USER > b->_location = location; > #endif > @@ -790,7 +790,7 @@ free_MIOBuffer(MIOBuffer * mio) > { > mio->_writer = NULL; > mio->dealloc_all_readers(); > - THREAD_FREE(mio, ioAllocator, this_ethread()); > + ioAllocator.free(mio); > } > > TS_INLINE MIOBuffer * new_empty_MIOBuffer_internal( > @@ -799,7 +799,7 @@ TS_INLINE MIOBuffer * new_empty_MIOBuffer_internal( > #endif > int64_t size_index) > { > - MIOBuffer *b = THREAD_ALLOC(ioAllocator, this_ethread()); > + MIOBuffer *b = ioAllocator.alloc(); > b->size_index = size_index; > #ifdef TRACK_BUFFER_USER > b->_location = location; > @@ -810,7 +810,7 @@ TS_INLINE MIOBuffer * new_empty_MIOBuffer_internal( > TS_INLINE void > free_empty_MIOBuffer(MIOBuffer * mio) > { > - THREAD_FREE(mio, ioAllocator, this_ethread()); > + ioAllocator.free(mio); > } > > TS_INLINE IOBufferReader * > > http://git-wip-us.apache.org/repos/asf/trafficserver/blob/7ffc10a9/mgmt/RecordsConfig.cc > ---------------------------------------------------------------------- > diff --git a/mgmt/RecordsConfig.cc b/mgmt/RecordsConfig.cc > index 4a73f19..7677471 100644 > --- a/mgmt/RecordsConfig.cc > +++ b/mgmt/RecordsConfig.cc > @@ -814,6 +814,24 @@ RecordElement RecordsConfig[] = { > , > {RECT_CONFIG, "proxy.config.cluster.cluster_port", RECD_INT, "8086", > RECU_RESTART_TS, RR_REQUIRED, RECC_NULL, NULL, RECA_NULL} > , > + {RECT_CONFIG, "proxy.config.cluster.flow_ctrl.min_bps", RECD_INT, > "804857600", RECU_RESTART_TS, RR_REQUIRED, RECC_NULL, NULL, RECA_NULL} > + , > + {RECT_CONFIG, "proxy.config.cluster.flow_ctrl.max_bps", RECD_INT, > "4194304000", RECU_RESTART_TS, RR_REQUIRED, RECC_NULL, NULL, RECA_NULL} > + , > + {RECT_CONFIG, "proxy.config.cluster.flow_ctrl.min_send_wait_time", > RECD_INT, "1000", RECU_RESTART_TS, RR_REQUIRED, RECC_NULL, NULL, RECA_NULL} > + , > + {RECT_CONFIG, "proxy.config.cluster.flow_ctrl.max_send_wait_time", > RECD_INT, "5000", RECU_RESTART_TS, RR_REQUIRED, RECC_NULL, NULL, RECA_NULL} > + , > + {RECT_CONFIG, "proxy.config.cluster.flow_ctrl.min_loop_interval", > RECD_INT, "0", RECU_RESTART_TS, RR_REQUIRED, RECC_NULL, NULL, RECA_NULL} > + , > + {RECT_CONFIG, "proxy.config.cluster.flow_ctrl.max_loop_interval", > RECD_INT, "1000", RECU_RESTART_TS, RR_REQUIRED, RECC_NULL, NULL, RECA_NULL} > + , > + {RECT_CONFIG, "proxy.config.cluster.max_sessions_per_machine", RECD_INT, > "1000000", RECU_RESTART_TS, RR_NULL, RECC_INT, "[1000-4000000]", RECA_NULL} > + , > + {RECT_CONFIG, "proxy.config.cluster.session_locks_per_machine", RECD_INT, > "10949", RECU_RESTART_TS, RR_NULL, RECC_INT, "[1-100000]", RECA_NULL} > + , > + {RECT_CONFIG, "proxy.config.cluster.read_buffer_size", RECD_INT, > "2097152", RECU_RESTART_TS, RR_NULL, RECC_INT, "[65536-2097152]", RECA_NULL} > + , > {RECT_CONFIG, "proxy.config.cluster.cluster_configuration", RECD_STRING, > "cluster.config", RECU_NULL, RR_NULL, RECC_NULL, NULL, RECA_NULL} > , > {RECT_CONFIG, "proxy.config.cluster.ethernet_interface", RECD_STRING, > TS_BUILD_DEFAULT_LOOPBACK_IFACE, RECU_RESTART_TS, RR_REQUIRED, RECC_STR, > "^[^[:space:]]*$", RECA_NULL} >