From a7198298e76874a70fbc58cdb2b581ba8f4d5b7d Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Fri, 17 Apr 2015 10:44:36 -0700 Subject: [PATCH 01/18] Fix beast::ci_equal --- src/beast/beast/utility/ci_char_traits.h | 46 +++++++++++++++++++----- src/ripple/overlay/impl/OverlayImpl.cpp | 3 +- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/beast/beast/utility/ci_char_traits.h b/src/beast/beast/utility/ci_char_traits.h index 056e08c9b8..69f8736fc7 100644 --- a/src/beast/beast/utility/ci_char_traits.h +++ b/src/beast/beast/utility/ci_char_traits.h @@ -24,8 +24,8 @@ #include // #include #include -#include #include +#include namespace beast { @@ -51,15 +51,15 @@ struct ci_less } }; -/** Returns `true` if strings are case-insensitive equal. */ -template -std::enable_if_t::value && - std::is_same::value, bool> -ci_equal(Lhs const& lhs, Rhs const& rhs) +namespace detail { + +inline +bool +ci_equal(std::pair lhs, + std::pair rhs) { - using std::begin; - using std::end; - return std::equal (begin(lhs), end(lhs), begin(rhs), end(rhs), + return std::equal (lhs.first, lhs.first + lhs.second, + rhs.first, rhs.first + rhs.second, [] (char lhs, char rhs) { return std::tolower(lhs) == std::tolower(rhs); @@ -67,6 +67,34 @@ ci_equal(Lhs const& lhs, Rhs const& rhs) ); } +template +inline +std::pair +view(const char (&s)[N]) +{ + return {s, N-1}; +} + +inline +std::pair +view(std::string const& s) +{ + return {s.data(), s.size()}; +} + +} + +/** Returns `true` if strings are case-insensitive equal. */ +template +inline +bool +ci_equal(String1 const& lhs, String2 const& rhs) +{ + using detail::view; + using detail::ci_equal; + return ci_equal(view(lhs), view(rhs)); +} + } #endif diff --git a/src/ripple/overlay/impl/OverlayImpl.cpp b/src/ripple/overlay/impl/OverlayImpl.cpp index b7b4929485..7d7e51e6e3 100644 --- a/src/ripple/overlay/impl/OverlayImpl.cpp +++ b/src/ripple/overlay/impl/OverlayImpl.cpp @@ -210,8 +210,7 @@ OverlayImpl::onHandoff (std::unique_ptr && ssl_bundle, if (std::find_if(types.begin(), types.end(), [](std::string const& s) { - return beast::ci_equal(s, - std::string("peer")); + return beast::ci_equal(s, "peer"); }) == types.end()) { handoff.moved = false; From 3b20dc299442cc98a68ca804e11ff72797811fe3 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Thu, 16 Apr 2015 18:20:54 -0700 Subject: [PATCH 02/18] Fix Crawl handshake header parsing in Overlay --- src/ripple/overlay/impl/ConnectAttempt.cpp | 4 ++-- src/ripple/overlay/impl/PeerImp.h | 15 +++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/ripple/overlay/impl/ConnectAttempt.cpp b/src/ripple/overlay/impl/ConnectAttempt.cpp index d1aaaaaea6..7ca3da47f7 100644 --- a/src/ripple/overlay/impl/ConnectAttempt.cpp +++ b/src/ripple/overlay/impl/ConnectAttempt.cpp @@ -423,8 +423,8 @@ ConnectAttempt::processResponse (beast::http::message const& m, auto const peer = std::make_shared( std::move(ssl_bundle_), read_buf_.data(), - std::move(slot_), usage_, std::move(hello), - publicKey, id_, overlay_); + std::move(slot_), std::move(response_), + usage_, std::move(hello), publicKey, id_, overlay_); overlay_.add_active (peer); } diff --git a/src/ripple/overlay/impl/PeerImp.h b/src/ripple/overlay/impl/PeerImp.h index 533d2aa936..632fd000ed 100644 --- a/src/ripple/overlay/impl/PeerImp.h +++ b/src/ripple/overlay/impl/PeerImp.h @@ -173,9 +173,10 @@ public: template PeerImp (std::unique_ptr&& ssl_bundle, Buffers const& buffers, PeerFinder::Slot::ptr&& slot, - Resource::Consumer usage, protocol::TMHello&& hello, - RippleAddress const& legacyPublicKey, id_t id, - OverlayImpl& overlay); + beast::http::message&& response, Resource::Consumer usage, + protocol::TMHello&& hello, + RippleAddress const& legacyPublicKey, id_t id, + OverlayImpl& overlay); virtual ~PeerImp(); @@ -448,9 +449,10 @@ private: template PeerImp::PeerImp (std::unique_ptr&& ssl_bundle, Buffers const& buffers, PeerFinder::Slot::ptr&& slot, - Resource::Consumer usage, protocol::TMHello&& hello, - RippleAddress const& legacyPublicKey, id_t id, - OverlayImpl& overlay) + beast::http::message&& response, Resource::Consumer usage, + protocol::TMHello&& hello, + RippleAddress const& legacyPublicKey, id_t id, + OverlayImpl& overlay) : Child (overlay) , id_ (id) , sink_ (deprecatedLogs().journal("Peer"), makePrefix(id)) @@ -473,6 +475,7 @@ PeerImp::PeerImp (std::unique_ptr&& ssl_bundle, , usage_ (usage) , fee_ (Resource::feeLightPeer) , slot_ (std::move(slot)) + , http_message_(std::move(response)) , validatorsConnection_(getApp().getValidators().newConnection(id)) { read_buffer_.commit (boost::asio::buffer_copy(read_buffer_.prepare( From 83003e43d75d5ff8216616ab6c76ad6795c67be7 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Sun, 19 Apr 2015 18:05:58 -0700 Subject: [PATCH 03/18] Lower the severity of some PeerFinder logging --- src/ripple/peerfinder/impl/Logic.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ripple/peerfinder/impl/Logic.h b/src/ripple/peerfinder/impl/Logic.h index 5c7b7f5982..7c446b9460 100644 --- a/src/ripple/peerfinder/impl/Logic.h +++ b/src/ripple/peerfinder/impl/Logic.h @@ -282,7 +282,7 @@ public: auto const iter = state->connected_addresses.find (remote_endpoint); if (iter != state->connected_addresses.end()) { - if (m_journal.warning) m_journal.warning << beast::leftw (18) << + if (m_journal.debug) m_journal.debug << beast::leftw (18) << "Logic dropping inbound " << remote_endpoint << " as duplicate"; return SlotImp::ptr(); @@ -353,7 +353,7 @@ public: if (state->slots.find (remote_endpoint) != state->slots.end ()) { - if (m_journal.warning) m_journal.warning << beast::leftw (18) << + if (m_journal.debug) m_journal.debug << beast::leftw (18) << "Logic dropping " << remote_endpoint << " as duplicate connect"; return SlotImp::ptr (); @@ -768,7 +768,7 @@ public: return ep.address == other.address; })) { - if (m_journal.warning) m_journal.warning << beast::leftw (18) << + if (m_journal.debug) m_journal.debug << beast::leftw (18) << "Endpoints drop " << ep.address << " as duplicate"; iter = list.erase (iter); From ec190bae33c9974b043eef48d34030af6ffcbeb6 Mon Sep 17 00:00:00 2001 From: Tom Ritchford Date: Mon, 20 Apr 2015 13:50:29 -0400 Subject: [PATCH 04/18] Revert "Checkpoint SOCI exactly every 1000 pages." This reverts commit e874a2624f32782434be5d8f35b0a8096a20efaf. --- src/ripple/app/data/SociDB.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ripple/app/data/SociDB.cpp b/src/ripple/app/data/SociDB.cpp index 12f7b1c13d..f400a0f23e 100644 --- a/src/ripple/app/data/SociDB.cpp +++ b/src/ripple/app/data/SociDB.cpp @@ -224,9 +224,13 @@ WALCheckpointer::~WALCheckpointer () void WALCheckpointer::runCheckpoint (const char* db, int pages) { - if ((pages + 1) % checkpointPageCount) + if (pages < checkpointPageCount) return; + // TODO: after it reaches 1000 pages, won't it checkpoint on every + // page after that? + // Should the line above be if ((1 + pages) % checkpointPageCount)? + { ScopedLockType sl (mutex_); if (running_) From 72a1a86886bfcebe97abe20511b09f7c57f22a5e Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Mon, 20 Apr 2015 13:41:48 -0700 Subject: [PATCH 05/18] Disable redundant ping timer --- src/ripple/websocket/WebSocket02.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ripple/websocket/WebSocket02.cpp b/src/ripple/websocket/WebSocket02.cpp index 1c49fe573a..da9c20b0b4 100644 --- a/src/ripple/websocket/WebSocket02.cpp +++ b/src/ripple/websocket/WebSocket02.cpp @@ -72,6 +72,7 @@ boost::asio::io_service::strand& WebSocket02::getStrand (Connection& con) template <> void ConnectionImpl ::setPingTimer () { +#if 0 connection_ptr ptr = m_connection.lock (); if (ptr) @@ -86,6 +87,7 @@ void ConnectionImpl ::setPingTimer () this->m_pingTimer.async_wait (ptr->get_strand ().wrap (pt)); } +#endif } template <> From 2805e9eb3bed66db75fdb6eb8fedf3956399b1d2 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Mon, 20 Apr 2015 15:19:07 -0700 Subject: [PATCH 06/18] Set version to 0.28.0-rc2 --- Builds/rpm/rippled.spec | 2 +- src/ripple/protocol/impl/BuildInfo.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Builds/rpm/rippled.spec b/Builds/rpm/rippled.spec index 66a5c71b19..be775cd043 100644 --- a/Builds/rpm/rippled.spec +++ b/Builds/rpm/rippled.spec @@ -1,5 +1,5 @@ Name: rippled -Version: 0.28.0-rc1 +Version: 0.28.0-rc2 Release: 1%{?dist} Summary: Ripple peer-to-peer network daemon diff --git a/src/ripple/protocol/impl/BuildInfo.cpp b/src/ripple/protocol/impl/BuildInfo.cpp index 6b00190435..96105c099b 100644 --- a/src/ripple/protocol/impl/BuildInfo.cpp +++ b/src/ripple/protocol/impl/BuildInfo.cpp @@ -35,7 +35,7 @@ char const* getRawVersionString () // // The build version number (edit this for each release) // - "0.28.0-rc1" + "0.28.0-rc2" // // Must follow the format described here: // From d5b460a85c03d0747927f1674e9e667210600a14 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 20 Apr 2015 11:52:28 -0700 Subject: [PATCH 07/18] Give ledger data requests their own job type: This gives requests for ledger data (and transaction set data) from peers a separate job type and prioritizes it appropriately. Previously it was lumped in with fetch packs which have a low concurrency limit. This should improve the performance of retrieving historical information. --- src/ripple/core/Job.h | 2 +- src/ripple/core/JobTypes.h | 17 ++++++++--------- src/ripple/overlay/impl/PeerImp.cpp | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/ripple/core/Job.h b/src/ripple/core/Job.h index 2ec2039d81..9ebb4998e9 100644 --- a/src/ripple/core/Job.h +++ b/src/ripple/core/Job.h @@ -40,8 +40,8 @@ enum JobType jtPACK, // Make a fetch pack for a peer jtPUBOLDLEDGER, // An old ledger has been accepted jtVALIDATION_ut, // A validation from an untrusted source - jtPROOFWORK, // A proof of work demand from another server jtTRANSACTION_l, // A local transaction + jtLEDGER_REQ, // Peer request ledger/txnset data jtPROPOSAL_ut, // A proposal from an untrusted source jtLEDGER_DATA, // Received data for a ledger we're acquiring jtCLIENT, // A websocket command from the client diff --git a/src/ripple/core/JobTypes.h b/src/ripple/core/JobTypes.h index b3a2710e67..174e7a0c87 100644 --- a/src/ripple/core/JobTypes.h +++ b/src/ripple/core/JobTypes.h @@ -33,7 +33,6 @@ public: typedef std::map Map; typedef Map::const_iterator const_iterator; - JobTypes () : m_unknown (jtINVALID, "invalid", 0, true, true, 0, 0) { @@ -51,14 +50,14 @@ public: add (jtVALIDATION_ut, "untrustedValidation", maxLimit, true, false, 2000, 5000); - // A proof of work demand from another server - add (jtPROOFWORK, "proofOfWork", - maxLimit, true, false, 2000, 5000); - // A local transaction add (jtTRANSACTION_l, "localTransaction", maxLimit, true, false, 100, 500); + // A request for ledger/txnset data from another server + add (jtLEDGER_REQ, "ledgerRequest", + 2, true, false, 0, 0); + // A proposal from an untrusted source add (jtPROPOSAL_ut, "untrustedProposal", maxLimit, true, false, 500, 1250); @@ -67,10 +66,6 @@ public: add (jtLEDGER_DATA, "ledgerData", 2, true, false, 0, 0); - // Update pathfinding requests - add (jtUPDATE_PF, "updatePaths", - maxLimit, true, false, 0, 0); - // A websocket command from the client add (jtCLIENT, "clientCommand", maxLimit, true, false, 2000, 5000); @@ -79,6 +74,10 @@ public: add (jtRPC, "RPC", maxLimit, false, false, 0, 0); + // Update pathfinding requests + add (jtUPDATE_PF, "updatePaths", + maxLimit, true, false, 0, 0); + // A transaction received from the network add (jtTRANSACTION, "transaction", maxLimit, true, false, 250, 1000); diff --git a/src/ripple/overlay/impl/PeerImp.cpp b/src/ripple/overlay/impl/PeerImp.cpp index 8b5e7aaf4d..5e414c7fd3 100644 --- a/src/ripple/overlay/impl/PeerImp.cpp +++ b/src/ripple/overlay/impl/PeerImp.cpp @@ -943,7 +943,7 @@ void PeerImp::onMessage (std::shared_ptr const& m) { fee_ = Resource::feeMediumBurdenPeer; - getApp().getJobQueue().addJob (jtPACK, "recvGetLedger", std::bind( + getApp().getJobQueue().addJob (jtLEDGER_REQ, "recvGetLedger", std::bind( beast::weak_fn(&PeerImp::getLedger, shared_from_this()), m)); } From 7788aa25b5551011106d2043d72848577d9564c9 Mon Sep 17 00:00:00 2001 From: seelabs Date: Tue, 21 Apr 2015 09:42:05 -0700 Subject: [PATCH 08/18] Fix return value when looking up non existent transactions --- src/ripple/app/tx/Transaction.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ripple/app/tx/Transaction.cpp b/src/ripple/app/tx/Transaction.cpp index 723bed1f8c..8b79842401 100644 --- a/src/ripple/app/tx/Transaction.cpp +++ b/src/ripple/app/tx/Transaction.cpp @@ -161,8 +161,10 @@ Transaction::pointer Transaction::load (uint256 const& id) *db << sql, soci::into (ledgerSeq), soci::into (status), soci::into (sociRawTxnBlob, rti); - if (db->got_data () && soci::i_ok == rti) - convert(sociRawTxnBlob, rawTxn); + if (!db->got_data () || rti != soci::i_ok) + return {}; + + convert(sociRawTxnBlob, rawTxn); } return Transaction::transactionFromSQL ( From 1f1c0618e141dc6ac6afaf13c9ad2842180f233f Mon Sep 17 00:00:00 2001 From: seelabs Date: Tue, 21 Apr 2015 10:40:40 -0700 Subject: [PATCH 09/18] Tidy up SQLite table creation: * Check if tables and indexes exist * Remove commands for unused table --- src/ripple/app/data/DBInit.cpp | 50 +++++++++++++++------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/src/ripple/app/data/DBInit.cpp b/src/ripple/app/data/DBInit.cpp index d611a6afc6..c7c43e05f7 100644 --- a/src/ripple/app/data/DBInit.cpp +++ b/src/ripple/app/data/DBInit.cpp @@ -36,7 +36,7 @@ const char* TxnDBInit[] = "BEGIN TRANSACTION;", - "CREATE TABLE Transactions ( \ + "CREATE TABLE IF NOT EXISTS Transactions ( \ TransID CHARACTER(64) PRIMARY KEY, \ TransType CHARACTER(24), \ FromAcct CHARACTER(35), \ @@ -46,20 +46,20 @@ const char* TxnDBInit[] = RawTxn BLOB, \ TxnMeta BLOB \ );", - "CREATE INDEX TxLgrIndex ON \ + "CREATE INDEX IF NOT EXISTS TxLgrIndex ON \ Transactions(LedgerSeq);", - "CREATE TABLE AccountTransactions ( \ + "CREATE TABLE IF NOT EXISTS AccountTransactions ( \ TransID CHARACTER(64), \ Account CHARACTER(64), \ LedgerSeq BIGINT UNSIGNED, \ TxnSeq INTEGER \ );", - "CREATE INDEX AcctTxIDIndex ON \ + "CREATE INDEX IF NOT EXISTS AcctTxIDIndex ON \ AccountTransactions(TransID);", - "CREATE INDEX AcctTxIndex ON \ + "CREATE INDEX IF NOT EXISTS AcctTxIndex ON \ AccountTransactions(Account, LedgerSeq, TxnSeq, TransID);", - "CREATE INDEX AcctLgrIndex ON \ + "CREATE INDEX IF NOT EXISTS AcctLgrIndex ON \ AccountTransactions(LedgerSeq, Account, TransID);", "END TRANSACTION;" @@ -76,7 +76,7 @@ const char* LedgerDBInit[] = "BEGIN TRANSACTION;", - "CREATE TABLE Ledgers ( \ + "CREATE TABLE IF NOT EXISTS Ledgers ( \ LedgerHash CHARACTER(64) PRIMARY KEY, \ LedgerSeq BIGINT UNSIGNED, \ PrevHash CHARACTER(64), \ @@ -88,17 +88,17 @@ const char* LedgerDBInit[] = AccountSetHash CHARACTER(64), \ TransSetHash CHARACTER(64) \ );", - "CREATE INDEX SeqLedger ON Ledgers(LedgerSeq);", + "CREATE INDEX IF NOT EXISTS SeqLedger ON Ledgers(LedgerSeq);", - "CREATE TABLE Validations ( \ + "CREATE TABLE IF NOT EXISTS Validations ( \ LedgerHash CHARACTER(64), \ NodePubKey CHARACTER(56), \ SignTime BIGINT UNSIGNED, \ RawData BLOB \ );", - "CREATE INDEX ValidationsByHash ON \ + "CREATE INDEX IF NOT EXISTS ValidationsByHash ON \ Validations(LedgerHash);", - "CREATE INDEX ValidationsByTime ON \ + "CREATE INDEX IF NOT EXISTS ValidationsByTime ON \ Validations(SignTime);", "END TRANSACTION;" @@ -111,7 +111,7 @@ const char* RpcDBInit[] = { // Local persistence of the RPC client - "CREATE TABLE RPCData ( \ + "CREATE TABLE IF NOT EXISTS RPCData ( \ Key TEXT PRIMARY Key, \ Value TEXT \ );", @@ -127,7 +127,7 @@ const char* WalletDBInit[] = // Node identity must be persisted for CAS routing and responsibilities. "BEGIN TRANSACTION;", - "CREATE TABLE NodeIdentity ( \ + "CREATE TABLE IF NOT EXISTS NodeIdentity ( \ PublicKey CHARACTER(53), \ PrivateKey CHARACTER(52), \ Dh512 TEXT, \ @@ -138,7 +138,7 @@ const char* WalletDBInit[] = // Integer: 1 : Used to simplify SQL. // ScoreUpdated: when scores was last updated. // FetchUpdated: when last fetch succeeded. - "CREATE TABLE Misc ( \ + "CREATE TABLE IF NOT EXISTS Misc ( \ Magic INTEGER UNIQUE NOT NULL, \ ScoreUpdated DATETIME, \ FetchUpdated DATETIME \ @@ -167,7 +167,7 @@ const char* WalletDBInit[] = // Comment: // User supplied comment. // Table of Domains user has asked to trust. - "CREATE TABLE SeedDomains ( \ + "CREATE TABLE IF NOT EXISTS SeedDomains ( \ Domain TEXT PRIMARY KEY NOT NULL, \ PublicKey CHARACTER(53), \ Source CHARACTER(1) NOT NULL, \ @@ -179,7 +179,7 @@ const char* WalletDBInit[] = );", // Allow us to easily find the next SeedDomain to fetch. - "CREATE INDEX SeedDomainNext ON SeedDomains (Next);", + "CREATE INDEX IF NOT EXISTS SeedDomainNext ON SeedDomains (Next);", // Table of PublicKeys user has asked to trust. // Fetches are made to the CAS. This gets the ripple.txt so even validators @@ -199,7 +199,7 @@ const char* WalletDBInit[] = // Checksum of last fetch. // Comment: // User supplied comment. - "CREATE TABLE SeedNodes ( \ + "CREATE TABLE IF NOT EXISTS SeedNodes ( \ PublicKey CHARACTER(53) PRIMARY KEY NOT NULL, \ Source CHARACTER(1) NOT NULL, \ Next DATETIME, \ @@ -210,7 +210,7 @@ const char* WalletDBInit[] = );", // Allow us to easily find the next SeedNode to fetch. - "CREATE INDEX SeedNodeNext ON SeedNodes (Next);", + "CREATE INDEX IF NOT EXISTS SeedNodeNext ON SeedNodes (Next);", // Nodes we trust to not grossly collude against us. Derived from // SeedDomains, SeedNodes, and ValidatorReferrals. @@ -219,7 +219,7 @@ const char* WalletDBInit[] = // Computed trust score. Higher is better. // Seen: // Last validation received. - "CREATE TABLE TrustedNodes ( \ + "CREATE TABLE IF NOT EXISTS TrustedNodes ( \ PublicKey CHARACTER(53) PRIMARY KEY NOT NULL, \ Score INTEGER DEFAULT 0 NOT NULL, \ Seen DATETIME, \ @@ -237,7 +237,7 @@ const char* WalletDBInit[] = // - Public key for CAS based referral. // - Domain for domain based referral. // XXX Do garbage collection when validators have no references. - "CREATE TABLE ValidatorReferrals ( \ + "CREATE TABLE IF NOT EXISTS ValidatorReferrals (\ Validator CHARACTER(53) NOT NULL, \ Entry INTEGER NOT NULL, \ Referral TEXT NOT NULL, \ @@ -254,7 +254,7 @@ const char* WalletDBInit[] = // Port: // -1 = Default // XXX Do garbage collection when ips have no references. - "CREATE TABLE IpReferrals ( \ + "CREATE TABLE IF NOT EXISTS IpReferrals ( \ Validator CHARACTER(53) NOT NULL, \ Entry INTEGER NOT NULL, \ IP TEXT NOT NULL, \ @@ -262,18 +262,12 @@ const char* WalletDBInit[] = PRIMARY KEY (Validator,Entry) \ );", - "CREATE TABLE Features ( \ + "CREATE TABLE IF NOT EXISTS Features ( \ Hash CHARACTER(64) PRIMARY KEY, \ FirstMajority BIGINT UNSIGNED, \ LastMajority BIGINT UNSIGNED \ );", - // This removes an old table and its index which are now redundant. This - // code will eventually go away. It's only here to clean up the wallet.db - "DROP TABLE IF EXISTS PeerIps;", - "DROP INDEX IF EXISTS;", - - "END TRANSACTION;" }; From 3aa39ced60ca524fe5a4b940ddb36c606bc37798 Mon Sep 17 00:00:00 2001 From: Torrie Fischer Date: Mon, 20 Apr 2015 16:23:01 -0700 Subject: [PATCH 10/18] Fix circleci --- circle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index 3426bab2f1..8cc4d22feb 100644 --- a/circle.yml +++ b/circle.yml @@ -10,7 +10,7 @@ dependencies: - sudo apt-get update -qq - sudo apt-get purge -qq libboost1.48-dev - sudo apt-get install -qq libboost1.57-all-dev - - sudo apt-get install -qq clang-3.4 gcc-4.8 scons protobuf-compiler libprotobuf-dev libssl-dev exuberant-ctags + - sudo apt-get install -qq clang-3.4 gcc-4.8 libobjc-4.8-dev libgcc-4.8-dev libstdc++-4.8-dev libclang1-3.4 libgcc1 libgomp1 libstdc++6 scons protobuf-compiler libprotobuf-dev libssl-dev exuberant-ctags - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 99 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8 - sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.4 99 --slave /usr/bin/clang++ clang++ /usr/bin/clang++-3.4 - gcc --version From e0d96ae807beadc2de839fb53f463995c14b27f4 Mon Sep 17 00:00:00 2001 From: Tom Ritchford Date: Mon, 20 Apr 2015 15:37:39 -0400 Subject: [PATCH 11/18] Fix WebSockets treatment of ping timer: This solves a problem that caused a hang on shutdown related to the lifetime of the ping timer completion handlers used in WebSockets. * Turn the ping timer back on * Use std::weak_ptr for WebSockets timer callbacks. * Disable WebSocket pings if frequency in the .cfg is non-positive. --- src/ripple/websocket/Connection.h | 1 - src/ripple/websocket/Handler.h | 1 + src/ripple/websocket/WebSocket02.cpp | 21 +++++++++++---------- src/ripple/websocket/WebSocket04.cpp | 14 +++++++++----- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/ripple/websocket/Connection.h b/src/ripple/websocket/Connection.h index 0346ace01c..390bd7b781 100644 --- a/src/ripple/websocket/Connection.h +++ b/src/ripple/websocket/Connection.h @@ -139,7 +139,6 @@ ConnectionImpl ::ConnectionImpl ( , m_handler (handler) , m_connection (cpConnection) { - setPingTimer (); } template diff --git a/src/ripple/websocket/Handler.h b/src/ripple/websocket/Handler.h index d18cfb37bc..687a739761 100644 --- a/src/ripple/websocket/Handler.h +++ b/src/ripple/websocket/Handler.h @@ -208,6 +208,7 @@ public: cpClient, makeBeastEndpoint (remoteEndpoint), WebSocket::getStrand (*cpClient).get_io_service ()); + connection->setPingTimer (); auto result = mMap.emplace (cpClient, std::move (connection)); assert (result.second); diff --git a/src/ripple/websocket/WebSocket02.cpp b/src/ripple/websocket/WebSocket02.cpp index da9c20b0b4..b194a467bd 100644 --- a/src/ripple/websocket/WebSocket02.cpp +++ b/src/ripple/websocket/WebSocket02.cpp @@ -20,6 +20,7 @@ #include #include #include +#include // This file contains websocket::WebSocket02 implementations for the WebSocket // generic functions as well as methods on Server and ConnectionImpl. @@ -72,22 +73,22 @@ boost::asio::io_service::strand& WebSocket02::getStrand (Connection& con) template <> void ConnectionImpl ::setPingTimer () { -#if 0 + auto freq = getConfig ().WEBSOCKET_PING_FREQ; + if (freq <= 0) + return; connection_ptr ptr = m_connection.lock (); if (ptr) { - this->m_pingTimer.expires_from_now (boost::posix_time::seconds - (getConfig ().WEBSOCKET_PING_FREQ)); + this->m_pingTimer.expires_from_now (boost::posix_time::seconds (freq)); - auto pt = [this] (boost::system::error_code const& e) - { - this->pingTimer (e); - }; - - this->m_pingTimer.async_wait (ptr->get_strand ().wrap (pt)); + this->m_pingTimer.async_wait ( + ptr->get_strand ().wrap ( + std::bind ( + beast::weak_fn (&ConnectionImpl ::pingTimer, + shared_from_this()), + beast::asio::placeholders::error))); } -#endif } template <> diff --git a/src/ripple/websocket/WebSocket04.cpp b/src/ripple/websocket/WebSocket04.cpp index cce1b4b2f0..287f5a9f5a 100644 --- a/src/ripple/websocket/WebSocket04.cpp +++ b/src/ripple/websocket/WebSocket04.cpp @@ -22,6 +22,7 @@ #include #include +#include namespace ripple { namespace websocket { @@ -114,16 +115,19 @@ EndpointPtr04 WebSocket04::makeEndpoint (HandlerPtr&& handler) template <> void ConnectionImpl ::setPingTimer () { + auto freq = getConfig ().WEBSOCKET_PING_FREQ; + if (freq <= 0) + return; if (auto con = m_connection.lock ()) { - auto t = boost::posix_time::seconds (getConfig ().WEBSOCKET_PING_FREQ); + auto t = boost::posix_time::seconds (freq); auto ms = t.total_milliseconds(); con->set_timer ( ms, - [this] (WebSocket04::ErrorCode const& e) - { - this->pingTimer (e); - }); + std::bind ( + beast::weak_fn (&ConnectionImpl ::pingTimer, + shared_from_this()), + beast::asio::placeholders::error)); } } From 15d68649d58b88f15d6ab9812c82e32f0e8fa4dc Mon Sep 17 00:00:00 2001 From: Miguel Portilla Date: Tue, 21 Apr 2015 15:52:56 -0400 Subject: [PATCH 12/18] Fix check for current ledger ID in RPC --- src/ripple/rpc/impl/RPCHandler.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/ripple/rpc/impl/RPCHandler.cpp b/src/ripple/rpc/impl/RPCHandler.cpp index 6577c87880..24c4b26b4f 100644 --- a/src/ripple/rpc/impl/RPCHandler.cpp +++ b/src/ripple/rpc/impl/RPCHandler.cpp @@ -146,14 +146,24 @@ error_code_i fillHandler (Context& context, return rpcNO_NETWORK; } - if (!getConfig ().RUN_STANDALONE - && (handler->condition_ & NEEDS_CURRENT_LEDGER) - && (getApp().getLedgerMaster().getValidatedLedgerAge() > - Tuning::maxValidatedLedgerAge - || context.netOps.getCurrentLedgerID() <= - context.netOps.getValidatedLedger ()->getLedgerSeq ())) + if (! getConfig ().RUN_STANDALONE && + handler->condition_ & NEEDS_CURRENT_LEDGER) { - return rpcNO_CURRENT; + if (getApp ().getLedgerMaster ().getValidatedLedgerAge () > + Tuning::maxValidatedLedgerAge) + { + return rpcNO_CURRENT; + } + + auto const cID = context.netOps.getCurrentLedgerID (); + auto const vID = context.netOps.getValidatedSeq (); + + if (cID + 10 < vID) + { + WriteLog (lsDEBUG, RPCHandler) << "Current ledger ID(" << cID << + ") is less than validated ledger ID(" << vID << ")"; + return rpcNO_CURRENT; + } } if ((handler->condition_ & NEEDS_CLOSED_LEDGER) && From bc85a8b24f86e04bec619fda0bd0256f5e2091de Mon Sep 17 00:00:00 2001 From: Nik Bougalis Date: Tue, 21 Apr 2015 13:33:24 -0700 Subject: [PATCH 13/18] Set TX processing change date to 2015-05-12 13:00:00PDT --- src/ripple/legacy/0.27/Emulate027.cpp | 4 ++-- src/ripple/protocol/impl/STTx.cpp | 11 ----------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/ripple/legacy/0.27/Emulate027.cpp b/src/ripple/legacy/0.27/Emulate027.cpp index c64b9b57b1..73e30209ee 100644 --- a/src/ripple/legacy/0.27/Emulate027.cpp +++ b/src/ripple/legacy/0.27/Emulate027.cpp @@ -34,8 +34,8 @@ emulate027 (Ledger::ref ledger) return false; // The server also uses 0.28 semantics for all ledgers whose parent - // closed after 2015-04-28 13:00:00 PDT. - static std::uint32_t const legacy_cutoff = 483566400; + // closed after 2015-05-12 13:00:00 PDT. + static std::uint32_t const legacy_cutoff = 484776000; if (ledger->getParentCloseTimeNC () > legacy_cutoff) return false; diff --git a/src/ripple/protocol/impl/STTx.cpp b/src/ripple/protocol/impl/STTx.cpp index a6185918b5..fcec6a0f2f 100644 --- a/src/ripple/protocol/impl/STTx.cpp +++ b/src/ripple/protocol/impl/STTx.cpp @@ -32,7 +32,6 @@ #include #include #include -#include "boost/date_time/posix_time/posix_time.hpp" #include namespace ripple { @@ -292,13 +291,6 @@ isMemoOkay (STObject const& st, std::string& reason) if (!st.isFieldPresent (sfMemos)) return true; - // We switch to new semantics on April 15, 2015 at 1:00pm PDT: - static boost::posix_time::ptime const cutoff ( - boost::posix_time::time_from_string ("2015-04-15 20:00:00")); - - bool const emulate027 = - boost::posix_time::second_clock::universal_time () < cutoff; - auto const& memos = st.getFieldArray (sfMemos); // The number 2048 is a preallocation hint, not a hard limit @@ -336,9 +328,6 @@ isMemoOkay (STObject const& st, std::string& reason) return false; } - if (emulate027) - continue; - // The raw data is stored as hex-octets, which we want to decode. auto data = strUnHex (memoElement.getText ()); From 837b0799ac51258c5d1bebde327d974997f11dc8 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Tue, 21 Apr 2015 12:27:25 -0700 Subject: [PATCH 14/18] Set version to 0.28.0-rc3 --- Builds/rpm/rippled.spec | 2 +- src/ripple/protocol/impl/BuildInfo.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Builds/rpm/rippled.spec b/Builds/rpm/rippled.spec index be775cd043..9c53eda7f6 100644 --- a/Builds/rpm/rippled.spec +++ b/Builds/rpm/rippled.spec @@ -1,5 +1,5 @@ Name: rippled -Version: 0.28.0-rc2 +Version: 0.28.0-rc3 Release: 1%{?dist} Summary: Ripple peer-to-peer network daemon diff --git a/src/ripple/protocol/impl/BuildInfo.cpp b/src/ripple/protocol/impl/BuildInfo.cpp index 96105c099b..3c6c1b8edc 100644 --- a/src/ripple/protocol/impl/BuildInfo.cpp +++ b/src/ripple/protocol/impl/BuildInfo.cpp @@ -35,7 +35,7 @@ char const* getRawVersionString () // // The build version number (edit this for each release) // - "0.28.0-rc2" + "0.28.0-rc3" // // Must follow the format described here: // From aa5d16b3d82aacfbfba16236b02278be7f473b7d Mon Sep 17 00:00:00 2001 From: Mark Travis Date: Thu, 23 Apr 2015 13:01:07 -0700 Subject: [PATCH 15/18] Skip inefficent SQL query (RIPD-870): For large data sets the JOIN may not make forward progress in time. This prevents the deletion of those entries in the database during online delete. The number of such entries is very small compared to the total size of the data anyway. A future version will address this more thoroughly. --- Builds/VisualStudio2013/RippleD.vcxproj | 2 ++ Builds/VisualStudio2013/RippleD.vcxproj.filters | 3 +++ src/ripple/app/data/tests/SociDB.test.cpp | 16 ---------------- src/ripple/app/misc/SHAMapStoreImp.cpp | 8 +++++++- 4 files changed, 12 insertions(+), 17 deletions(-) diff --git a/Builds/VisualStudio2013/RippleD.vcxproj b/Builds/VisualStudio2013/RippleD.vcxproj index 1f54b0d61e..5f7db0b876 100644 --- a/Builds/VisualStudio2013/RippleD.vcxproj +++ b/Builds/VisualStudio2013/RippleD.vcxproj @@ -4509,6 +4509,8 @@ + + diff --git a/Builds/VisualStudio2013/RippleD.vcxproj.filters b/Builds/VisualStudio2013/RippleD.vcxproj.filters index 595655c867..f536e46011 100644 --- a/Builds/VisualStudio2013/RippleD.vcxproj.filters +++ b/Builds/VisualStudio2013/RippleD.vcxproj.filters @@ -5280,6 +5280,9 @@ soci\src\core + + soci\src\core + sqlite diff --git a/src/ripple/app/data/tests/SociDB.test.cpp b/src/ripple/app/data/tests/SociDB.test.cpp index c3f9da8288..af8c29fbc0 100644 --- a/src/ripple/app/data/tests/SociDB.test.cpp +++ b/src/ripple/app/data/tests/SociDB.test.cpp @@ -354,22 +354,6 @@ public: soci::into (validationsLH); expect (ledgersLS.size () == numRows && validationsLH.size () == numRows); - s << "DELETE FROM Validations WHERE LedgerHash IN " - "(SELECT Ledgers.LedgerHash FROM Validations JOIN Ledgers ON " - "Validations.LedgerHash=Ledgers.LedgerHash WHERE " - "Ledgers.LedgerSeq < :num);", - soci::use (numRows / 2); - validationsLH.resize (numRows * 2); - s << "SELECT LedgerHash FROM Validations;", - soci::into (validationsLH); - expect (validationsLH.size () == numRows / 2); - for (auto i = ledgerHashes.begin () + numRows / 2; - i != ledgerHashes.end (); - ++i) - { - expect (find (validationsLH.begin (), validationsLH.end (), *i) - != validationsLH.end ()); - } } using namespace boost::filesystem; // Remove the database diff --git a/src/ripple/app/misc/SHAMapStoreImp.cpp b/src/ripple/app/misc/SHAMapStoreImp.cpp index 837aa47e00..4ed922e286 100644 --- a/src/ripple/app/misc/SHAMapStoreImp.cpp +++ b/src/ripple/app/misc/SHAMapStoreImp.cpp @@ -570,12 +570,18 @@ SHAMapStoreImp::clearPrior (LedgerIndex lastRotated) // TODO This won't remove validations for ledgers that do not get // validated. That will likely require inserting LedgerSeq into - // the validations table + // the validations table. + // + // This query has poor performance with large data sets. + // The schema needs to be redesigned to avoid the JOIN, or an + // RDBMS that supports concurrency should be used. + /* clearSql (*ledgerDb_, lastRotated, "SELECT MIN(LedgerSeq) FROM Ledgers;", "DELETE FROM Validations WHERE LedgerHash IN " "(SELECT Ledgers.LedgerHash FROM Validations JOIN Ledgers ON " "Validations.LedgerHash=Ledgers.LedgerHash WHERE Ledgers.LedgerSeq < %u);"); + */ if (health()) return; From c8447c190ca3bed0528ad421050a692f2da978be Mon Sep 17 00:00:00 2001 From: seelabs Date: Thu, 23 Apr 2015 10:55:38 -0700 Subject: [PATCH 16/18] Report the inbound listening port during crawl (RIPD-866) --- src/ripple/overlay/impl/OverlayImpl.cpp | 13 +++++++++++-- src/ripple/peerfinder/Slot.h | 2 ++ src/ripple/peerfinder/impl/Logic.h | 1 + src/ripple/peerfinder/impl/SlotImp.cpp | 2 ++ src/ripple/peerfinder/impl/SlotImp.h | 18 ++++++++++++++++++ 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/ripple/overlay/impl/OverlayImpl.cpp b/src/ripple/overlay/impl/OverlayImpl.cpp index 7d7e51e6e3..d7361cd06c 100644 --- a/src/ripple/overlay/impl/OverlayImpl.cpp +++ b/src/ripple/overlay/impl/OverlayImpl.cpp @@ -595,12 +595,21 @@ OverlayImpl::crawl() pv[jss::public_key] = beast::base64_encode( sp->getNodePublic().getNodePublic().data(), sp->getNodePublic().getNodePublic().size()); + pv[jss::type] = sp->slot()->inbound() ? + "in" : "out"; if (sp->crawl()) { + pv[jss::ip] = sp->getRemoteAddress().address().to_string(); if (sp->slot()->inbound()) - pv[jss::ip] = sp->getRemoteAddress().address().to_string(); + { + if (auto port = sp->slot()->listening_port()) + pv[jss::port] = *port; + } else - pv[jss::ip] = sp->getRemoteAddress().to_string(); + { + pv[jss::port] = std::to_string( + sp->getRemoteAddress().port()); + } } auto version = sp->getVersion (); if (!version.empty ()) diff --git a/src/ripple/peerfinder/Slot.h b/src/ripple/peerfinder/Slot.h index cc19f26ddb..bd3bb590d6 100644 --- a/src/ripple/peerfinder/Slot.h +++ b/src/ripple/peerfinder/Slot.h @@ -68,6 +68,8 @@ public: /** The local endpoint of the socket, when known. */ virtual boost::optional const& local_endpoint () const = 0; + virtual boost::optional listening_port () const = 0; + /** The peer's public key, when known. The public key is established when the handshake is complete. */ diff --git a/src/ripple/peerfinder/impl/Logic.h b/src/ripple/peerfinder/impl/Logic.h index 7c446b9460..0977245271 100644 --- a/src/ripple/peerfinder/impl/Logic.h +++ b/src/ripple/peerfinder/impl/Logic.h @@ -262,6 +262,7 @@ public: } slot.canAccept = true; + slot.set_listening_port (checkedAddress.port ()); if (m_journal.debug) m_journal.debug << beast::leftw (18) << "Logic testing " << checkedAddress << " succeeded"; } diff --git a/src/ripple/peerfinder/impl/SlotImp.cpp b/src/ripple/peerfinder/impl/SlotImp.cpp index 32f9cbca60..a116a51601 100644 --- a/src/ripple/peerfinder/impl/SlotImp.cpp +++ b/src/ripple/peerfinder/impl/SlotImp.cpp @@ -35,6 +35,7 @@ SlotImp::SlotImp (beast::IP::Endpoint const& local_endpoint, , m_state (accept) , m_remote_endpoint (remote_endpoint) , m_local_endpoint (local_endpoint) + , m_listening_port (unknownPort) , checked (false) , canAccept (false) , connectivityCheckInProgress (false) @@ -49,6 +50,7 @@ SlotImp::SlotImp (beast::IP::Endpoint const& remote_endpoint, , m_cluster (false) , m_state (connect) , m_remote_endpoint (remote_endpoint) + , m_listening_port (unknownPort) , checked (true) , canAccept (true) , connectivityCheckInProgress (false) diff --git a/src/ripple/peerfinder/impl/SlotImp.h b/src/ripple/peerfinder/impl/SlotImp.h index fcffb9ad8a..b10bde4745 100644 --- a/src/ripple/peerfinder/impl/SlotImp.h +++ b/src/ripple/peerfinder/impl/SlotImp.h @@ -22,9 +22,11 @@ #include #include +#include #include #include #include +#include namespace ripple { namespace PeerFinder { @@ -81,6 +83,19 @@ public: return m_public_key; } + boost::optional listening_port () const + { + std::uint32_t const value = m_listening_port; + if (value == unknownPort) + return boost::none; + return value; + } + + void set_listening_port (std::uint16_t port) + { + m_listening_port = port; + } + void local_endpoint (beast::IP::Endpoint const& endpoint) { m_local_endpoint = endpoint; @@ -147,6 +162,9 @@ private: boost::optional m_local_endpoint; boost::optional m_public_key; + static std::int32_t BEAST_CONSTEXPR unknownPort = -1; + std::atomic m_listening_port; + public: // DEPRECATED public data members From 14d38a1a8d8c2880ae3db2e859c35e8b7777ff8b Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Fri, 24 Apr 2015 17:27:06 -0700 Subject: [PATCH 17/18] Fix --rpc_ip and --rpc_port (RIPD-679) This reverts commit 2b040569e79280a2b5071de540601f71bf06fe18. --- .gitignore | 1 + src/ripple/app/main/Main.cpp | 37 +++++++++++++++++++++++++++++++ src/ripple/core/Config.h | 8 ++++++- src/ripple/net/impl/RPCCall.cpp | 17 +++++++++++++- src/ripple/server/ServerHandler.h | 4 ++-- 5 files changed, 63 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index f521ddee45..f20e141821 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,7 @@ Release/*.* tmp # Ignore database directory. +db/ db/*.db db/*.db-* diff --git a/src/ripple/app/main/Main.cpp b/src/ripple/app/main/Main.cpp index 512e2609a7..01d2189dda 100644 --- a/src/ripple/app/main/Main.cpp +++ b/src/ripple/app/main/Main.cpp @@ -245,6 +245,8 @@ int run (int argc, char** argv) ("help,h", "Display this message.") ("conf", po::value (), "Specify the configuration file.") ("rpc", "Perform rpc command (default).") + ("rpc_ip", po::value (), "Specify the IP address for RPC command. Format: [':']") + ("rpc_port", po::value (), "Specify the port number for RPC command.") ("standalone,a", "Run with no peers.") ("shutdowntest", po::value ()->implicit_value (""), "Perform shutdown tests.") ("unittest,u", po::value ()->implicit_value (""), "Perform unit tests.") @@ -419,6 +421,41 @@ int run (int argc, char** argv) if (iResult == 0) { // These overrides must happen after the config file is loaded. + + // Override the RPC destination IP address + // + if (vm.count ("rpc_ip")) + { + try + { + getConfig().rpc_ip = + boost::asio::ip::address_v4::from_string( + vm["rpc_ip"].as()); + } + catch(...) + { + std::cerr << + "Invalid rpc_ip = " << vm["rpc_ip"].as(); + return -1; + } + } + + // Override the RPC destination port number + // + if (vm.count ("rpc_port")) + { + try + { + getConfig().rpc_port = vm["rpc_port"].as(); + } + catch(...) + { + std::cerr << + "Invalid rpc_port = " << vm["rpc_port"].as(); + return -1; + } + } + if (vm.count ("quorum")) { getConfig ().VALIDATION_QUORUM = vm["quorum"].as (); diff --git a/src/ripple/core/Config.h b/src/ripple/core/Config.h index 44bc9a349e..9b1fa99b89 100644 --- a/src/ripple/core/Config.h +++ b/src/ripple/core/Config.h @@ -28,8 +28,10 @@ #include #include #include -#include +#include // VFALCO FIX: This include should not be here +#include // VFALCO FIX: This include should not be here #include +#include #include #include #include @@ -251,6 +253,10 @@ public: std::string SSL_VERIFY_FILE; std::string SSL_VERIFY_DIR; + // These override the command line client settings + boost::optional rpc_ip; + boost::optional rpc_port; + public: Config (); diff --git a/src/ripple/net/impl/RPCCall.cpp b/src/ripple/net/impl/RPCCall.cpp index 3eb905d910..c55e549623 100644 --- a/src/ripple/net/impl/RPCCall.cpp +++ b/src/ripple/net/impl/RPCCall.cpp @@ -1018,7 +1018,22 @@ int RPCCall::fromCommandLine (const std::vector& vCmd) } else { - auto const setup = setup_ServerHandler(getConfig(), std::cerr); + ServerHandler::Setup setup; + try + { + std::stringstream ss; + setup = setup_ServerHandler(getConfig(), ss); + } + catch(...) + { + // ignore any exceptions, so the command + // line client works without a config file + } + + if (getConfig().rpc_ip) + setup.client.ip = getConfig().rpc_ip->to_string(); + if (getConfig().rpc_port) + setup.client.port = *getConfig().rpc_port; Json::Value jvParams (Json::arrayValue); diff --git a/src/ripple/server/ServerHandler.h b/src/ripple/server/ServerHandler.h index de394954de..784731c437 100644 --- a/src/ripple/server/ServerHandler.h +++ b/src/ripple/server/ServerHandler.h @@ -47,9 +47,9 @@ public: // Memberspace struct client_t { - bool secure; + bool secure = false; std::string ip; - std::uint16_t port; + std::uint16_t port = 0; std::string user; std::string password; std::string admin_user; From 7efd0ab0d6ef017331a0e214a3053893c88f38a9 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Fri, 24 Apr 2015 18:57:36 -0700 Subject: [PATCH 18/18] Set version to 0.28.0 --- Builds/rpm/rippled.spec | 2 +- src/ripple/protocol/impl/BuildInfo.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Builds/rpm/rippled.spec b/Builds/rpm/rippled.spec index 9c53eda7f6..f2f1715b9a 100644 --- a/Builds/rpm/rippled.spec +++ b/Builds/rpm/rippled.spec @@ -1,5 +1,5 @@ Name: rippled -Version: 0.28.0-rc3 +Version: 0.28.0 Release: 1%{?dist} Summary: Ripple peer-to-peer network daemon diff --git a/src/ripple/protocol/impl/BuildInfo.cpp b/src/ripple/protocol/impl/BuildInfo.cpp index 3c6c1b8edc..f878984ae5 100644 --- a/src/ripple/protocol/impl/BuildInfo.cpp +++ b/src/ripple/protocol/impl/BuildInfo.cpp @@ -35,7 +35,7 @@ char const* getRawVersionString () // // The build version number (edit this for each release) // - "0.28.0-rc3" + "0.28.0" // // Must follow the format described here: //