116 org::xrpl::rpc::v1::GetLedgerRequest& request = context.
params;
117 org::xrpl::rpc::v1::GetLedgerResponse response;
118 grpc::Status status = grpc::Status::OK;
123 grpc::Status errorStatus;
126 errorStatus = grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, status.message());
130 errorStatus = grpc::Status(grpc::StatusCode::NOT_FOUND, status.message());
132 return {response, errorStatus};
136 addRaw(ledger->header(), s,
true);
140 if (request.transactions())
144 for (
auto& i : ledger->txs)
146 XRPL_ASSERT(i.first,
"xrpl::doLedgerGrpc : non-null transaction");
147 if (request.expand())
149 auto txn = response.mutable_transactions_list()->add_transactions();
160 auto const& hash = i.first->getTransactionID();
161 response.mutable_hashes_list()->add_hashes(hash.data(), hash.size());
167 JLOG(context.
j.
error()) << __func__ <<
" - Error deserializing transaction in ledger "
168 << ledger->header().seq
169 <<
" . skipping transaction and following transactions. You "
170 "should look into this further";
174 if (request.get_objects())
181 grpc::Status errorStatus{grpc::StatusCode::NOT_FOUND,
"parent ledger not validated"};
182 return {response, errorStatus};
188 grpc::Status errorStatus{grpc::StatusCode::NOT_FOUND,
"ledger not validated"};
189 return {response, errorStatus};
195 bool res = base->stateMap().compare(desired->stateMap(), differences, maxDifferences);
198 grpc::Status errorStatus{
199 grpc::StatusCode::RESOURCE_EXHAUSTED,
"too many differences between specified ledgers"};
200 return {response, errorStatus};
203 for (
auto& [k, v] : differences)
205 auto obj = response.mutable_ledger_objects()->add_objects();
206 auto inBase = v.first;
207 auto inDesired = v.second;
209 obj->set_key(k.data(), k.size());
212 XRPL_ASSERT(inDesired->size() > 0,
"xrpl::doLedgerGrpc : non-empty desired");
213 obj->set_data(inDesired->data(), inDesired->size());
215 if (inBase && inDesired)
216 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::MODIFIED);
217 else if (inBase && !inDesired)
218 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::DELETED);
220 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::CREATED);
221 auto const blob = inDesired ? inDesired->slice() : inBase->slice();
222 auto const objectType =
static_cast<LedgerEntryType>(blob[1] << 8 | blob[2]);
224 if (request.get_object_neighbors())
226 if (!(inBase && inDesired))
228 auto lb = desired->stateMap().lower_bound(k);
229 auto ub = desired->stateMap().upper_bound(k);
230 if (lb != desired->stateMap().end())
231 obj->set_predecessor(lb->key().data(), lb->key().size());
232 if (ub != desired->stateMap().end())
233 obj->set_successor(ub->key().data(), ub->key().size());
234 if (objectType == ltDIR_NODE)
237 if (!sle->isFieldPresent(sfOwner))
240 if (!inBase && inDesired)
242 auto firstBook = desired->stateMap().upper_bound(bookBase.key);
243 if (firstBook != desired->stateMap().end() &&
244 firstBook->key() <
getQualityNext(bookBase.key) && firstBook->key() == k)
246 auto succ = response.add_book_successors();
247 succ->set_book_base(bookBase.key.data(), bookBase.key.size());
248 succ->set_first_book(firstBook->key().data(), firstBook->key().size());
251 if (inBase && !inDesired)
253 auto oldFirstBook = base->stateMap().upper_bound(bookBase.key);
254 if (oldFirstBook != base->stateMap().end() &&
255 oldFirstBook->key() <
getQualityNext(bookBase.key) && oldFirstBook->key() == k)
257 auto succ = response.add_book_successors();
258 succ->set_book_base(bookBase.key.data(), bookBase.key.size());
259 auto newFirstBook = desired->stateMap().upper_bound(bookBase.key);
261 if (newFirstBook != desired->stateMap().end() &&
264 succ->set_first_book(newFirstBook->key().data(), newFirstBook->key().size());
273 response.set_objects_included(
true);
274 response.set_object_neighbors_included(request.get_object_neighbors());
275 response.set_skiplist_included(
true);
281 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count() * 1.0;
282 JLOG(context.
j.
warn()) << __func__ <<
" - Extract time = " << duration
283 <<
" - num objects = " << response.ledger_objects().objects_size()
284 <<
" - num txns = " << response.transactions_list().transactions_size() <<
" - ms per obj "
285 << duration / response.ledger_objects().objects_size() <<
" - ms per txn "
286 << duration / response.transactions_list().transactions_size();
288 return {response, status};
Resource::Charge & loadType