blob: 97b1435fcca6d91a4392f98d377acbd7e8220409 [file] [log] [blame]
#ifndef QPID_CLUSTER_WRITEESTIMATE_H
#define QPID_CLUSTER_WRITEESTIMATE_H
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
#include "qpid/sys/Mutex.h"
namespace qpid {
namespace cluster {
/**
* Estimate the amount of data that a connection can write between sending
* a doOutput notice and re-receiving it.
*
* The goal is to avoid ever write-idling the connection by sending
* the next doOutput request as soon as we've processed the previous
* one, such that data generated by the previous request will keep the
* writer busy till the next one is delivered.
*
*/
class WriteEstimate
{
public:
WriteEstimate(size_t initial=4096);
/** About to send a doOutput request.
* Update estimation state and return size for next request.
*/
size_t sending(size_t buffered);
/**
* doOutput request just delivered, not yet executed. Update the estimate.
* and estimate how much data to request in the next onOutput
* request. 0 means don't send an onOutput request.
*
* @param delivered value in doOutput control.
*/
void delivered(size_t delivered, size_t sent, size_t buffered);
/** Last estimate delivered, i.e. known to cluster */
size_t getLastEstimate() const { return estimate; }
private:
bool growing;
size_t estimate, lastEstimate;
};
}} // namespace qpid::cluster
#endif /*!QPID_CLUSTER_WRITEESTIMATE_H*/