The unified diff between revisions [c0d2ea57..] and [e24ccc23..] is displayed below. It can also be downloaded as a raw diff.
#
#
# patch "ChangeLog"
# from [c67e914ab93d6471543cbcf4c493dbd7fc5bff88]
# to [1a92ac866998074c2b9d6e2795fe322656a4666b]
#
# patch "netcmd.cc"
# from [7308c12cecebbd725ddca9ebfa94bd9a6e1efdea]
# to [207caa3c268ad7e6a93eaff3f3298aa53f45fadd]
#
# patch "netcmd.hh"
# from [db259c3bbd1fdc984b3cae3fb90128f7b0e461e5]
# to [b010800c5f7c9cb23ac8f0ac069b7a4fbdd17774]
#
# patch "netsync.cc"
# from [e6da39e8b875004c1b0290a4fb274394d6bd1c6b]
# to [cba71cd069c2658e79568849fe0328c92695547d]
#
============================================================
--- ChangeLog c67e914ab93d6471543cbcf4c493dbd7fc5bff88
+++ ChangeLog 1a92ac866998074c2b9d6e2795fe322656a4666b
@@ -97,6 +97,16 @@ 2005-06-16 Matt Johnston <matt@ucc.asn
* ui.cc: increase the divisor as required so that we don't get spurious
screen updates when we're using the kilobyte/megabyte tickers
+2005-06-16 Matt Johnston <matt@ucc.asn.au>
+
+ * ui.cc: increase the divisor as required so that we don't get spurious
+ screen updates when we're using the kilobyte/megabyte tickers
+
+2005-06-16 Matt Johnston <matt@ucc.asn.au>
+
+ * netcmd.{cc,hh}, netsync.cc: only read a single command packet
+ worth of data at a time, to avoid having to shuffle buffers about.
+
2005-06-15 Matt Johnston <matt@ucc.asn.au>
* monotone.texi: clarify some netsync parts of the tutorial
============================================================
--- netcmd.cc 7308c12cecebbd725ddca9ebfa94bd9a6e1efdea
+++ netcmd.cc 207caa3c268ad7e6a93eaff3f3298aa53f45fadd
@@ -49,8 +49,10 @@ netcmd::netcmd() : version(constants::ne
}
netcmd::netcmd() : version(constants::netcmd_current_protocol_version),
- cmd_code(bye_cmd)
+ cmd_code(bye_cmd),
+ payload_len(0), length_len(0)
{}
+{}
size_t netcmd::encoded_size()
{
@@ -59,6 +61,17 @@ size_t netcmd::encoded_size()
return 1 + 1 + tmp.size() + payload.size() + 4;
}
+size_t netcmd::get_max_read()
+{
+ size_t ret = constants::netcmd_minsz + payload_len + length_len;
+ if (length_len > 0)
+ {
+ // netcmd_minsz already includes one byte for length_len
+ ret--;
+ }
+ return ret;
+}
+
bool
netcmd::operator==(netcmd const & other) const
{
@@ -132,10 +145,11 @@ netcmd::read(string & inbuf, netsync_ses
}
// check to see if we have even enough bytes for a complete uleb128
- size_t payload_len = 0;
+ size_t old_pos = pos;
if (!try_extract_datum_uleb128<size_t>(inbuf, pos, "netcmd payload length",
payload_len))
return false;
+ length_len = pos - old_pos;
// they might have given us a bogus size
if (payload_len > constants::netcmd_payload_limit)
@@ -151,16 +165,21 @@ netcmd::read(string & inbuf, netsync_ses
// out.payload = extract_substring(inbuf, pos, payload_len, "netcmd payload");
// Do this ourselves, so we can swap the strings instead of copying.
require_bytes(inbuf, pos, payload_len, "netcmd payload");
- payload = inbuf.substr(pos + payload_len);
- inbuf.erase(pos + payload_len, inbuf.npos);
+ inbuf.erase(0, pos);
+ pos = payload_len;
+ u32 checksum = extract_datum_lsb<u32>(inbuf, pos, "netcmd checksum");
+ inbuf.resize(payload_len);
inbuf.swap(payload);
- size_t payload_pos = pos;
+
+ // we're done with inbuf
+ inbuf.clear();
pos = 0;
+ payload_len = 0;
+ length_len = 0;
// they might have given us bogus data
string cmd_digest = extract_substring(inbuf, pos, CryptoPP::SHA::DIGESTSIZE,
"netcmd HMAC");
- inbuf.erase(0, pos);
I(key().size() == CryptoPP::SHA::DIGESTSIZE);
I(key().size() == hmac_val().size());
byte keybuf[CryptoPP::SHA::DIGESTSIZE];
@@ -178,7 +197,6 @@ netcmd::read(string & inbuf, netsync_ses
throw bad_decode(F("bad HMAC %s vs. %s") % encode_hexenc(cmd_digest)
% encode_hexenc(digest));
hmac_val = netsync_hmac_value(digest);
- payload.erase(0, payload_pos);
return true;
}
============================================================
--- netcmd.hh db259c3bbd1fdc984b3cae3fb90128f7b0e461e5
+++ netcmd.hh b010800c5f7c9cb23ac8f0ac069b7a4fbdd17774
@@ -52,12 +52,15 @@ private:
u8 version;
netcmd_code cmd_code;
std::string payload;
+ size_t payload_len;
+ size_t length_len;
public:
netcmd();
netcmd(u8 _version);
netcmd_code get_cmd_code() const {return cmd_code;}
u8 get_version() const {return version;}
size_t encoded_size();
+ size_t get_max_read();
bool operator==(netcmd const & other) const;
============================================================
--- netsync.cc e6da39e8b875004c1b0290a4fb274394d6bd1c6b
+++ netsync.cc cba71cd069c2658e79568849fe0328c92695547d
@@ -1313,7 +1313,11 @@ session::read_some()
{
I(inbuf.size() < constants::netcmd_maxsz);
char tmp[constants::bufsz];
- Netxx::signed_size_type count = str.read(tmp, sizeof(tmp));
+ size_t max_read = min(sizeof(tmp), cmd.get_max_read() - inbuf.size());
+ if (max_read == 0)
+ return true;
+
+ Netxx::signed_size_type count = str.read(tmp, max_read);
if (count > 0)
{
L(F("read %d bytes from fd %d (peer %s)\n") % count % fd % peer_id);