Skip to content

Commit 5609e74

Browse files
committed
Clean up InternalContractDataMap
1 parent a9b366a commit 5609e74

File tree

3 files changed

+75
-216
lines changed

3 files changed

+75
-216
lines changed

src/invariant/test/InvariantTests.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -691,13 +691,13 @@ TEST_CASE("BucketList state consistency invariant", "[invariant]")
691691
else
692692
{
693693
auto it = modifiedState.mContractDataEntries.begin();
694-
auto const& entryData = it->get();
694+
auto const& entryData = *it;
695695
LedgerEntry modifiedEntry = *entryData.ledgerEntry;
696696
modifiedEntry.lastModifiedLedgerSeq += 100;
697697
auto ttlData = entryData.ttlData;
698698
modifiedState.mContractDataEntries.erase(it);
699699
modifiedState.mContractDataEntries.emplace(
700-
InternalContractDataMapEntry(modifiedEntry, ttlData));
700+
std::make_shared<LedgerEntry const>(modifiedEntry), ttlData);
701701
}
702702

703703
auto result =
@@ -739,7 +739,7 @@ TEST_CASE("BucketList state consistency invariant", "[invariant]")
739739
createContractDataWithTTL(PERSISTENT, 1000);
740740
TTLData ttlData(extraTTL.data.ttl().liveUntilLedgerSeq, 1);
741741
modifiedState.mContractDataEntries.emplace(
742-
InternalContractDataMapEntry(extraEntry, ttlData));
742+
std::make_shared<LedgerEntry const>(extraEntry), ttlData);
743743
}
744744

745745
auto result =
@@ -765,13 +765,13 @@ TEST_CASE("BucketList state consistency invariant", "[invariant]")
765765

766766
// Corrupt TTL of an entry in the cache
767767
auto it = modifiedState.mContractDataEntries.begin();
768-
auto const& entryData = it->get();
768+
auto const& entryData = *it;
769769
LedgerEntry entryCopy = *entryData.ledgerEntry;
770770

771771
TTLData wrongTTL(42, 1);
772772
modifiedState.mContractDataEntries.erase(it);
773773
modifiedState.mContractDataEntries.emplace(
774-
InternalContractDataMapEntry(entryCopy, wrongTTL));
774+
std::make_shared<LedgerEntry const>(entryCopy), wrongTTL);
775775

776776
auto result =
777777
invariant.checkSnapshot(getLiveSnapshot(), getHotArchiveSnapshot(),

src/ledger/InMemorySorobanState.cpp

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,12 @@ TTLData::isDefault() const
5050

5151
void
5252
InMemorySorobanState::updateContractDataTTL(
53-
std::unordered_set<InternalContractDataMapEntry,
54-
InternalContractDataEntryHash>::iterator dataIt,
55-
TTLData newTtlData)
53+
InternalContractDataMap::iterator dataIt, TTLData newTtlData)
5654
{
5755
// Since entries are immutable, we must erase and re-insert
58-
auto ledgerEntryPtr = dataIt->get().ledgerEntry;
56+
auto ledgerEntryPtr = dataIt->ledgerEntry;
5957
mContractDataEntries.erase(dataIt);
60-
mContractDataEntries.emplace(
61-
InternalContractDataMapEntry(std::move(ledgerEntryPtr), newTtlData));
58+
mContractDataEntries.emplace(std::move(ledgerEntryPtr), newTtlData);
6259
}
6360

6461
void
@@ -72,7 +69,7 @@ InMemorySorobanState::updateTTL(LedgerEntry const& ttlEntry)
7269

7370
// TTL updates can apply to either ContractData or ContractCode entries.
7471
// First check if this TTL belongs to a stored ContractData entry.
75-
auto dataIt = mContractDataEntries.find(InternalContractDataMapEntry(lk));
72+
auto dataIt = mContractDataEntries.find(lk);
7673
if (dataIt != mContractDataEntries.end())
7774
{
7875
updateContractDataTTL(dataIt, newTtlData);
@@ -94,19 +91,19 @@ InMemorySorobanState::updateContractData(LedgerEntry const& ledgerEntry)
9491

9592
// Entry must already exist since this is an update
9693
auto lk = LedgerEntryKey(ledgerEntry);
97-
auto dataIt = mContractDataEntries.find(InternalContractDataMapEntry(lk));
94+
auto dataIt = mContractDataEntries.find(lk);
9895
releaseAssertOrThrow(dataIt != mContractDataEntries.end());
99-
releaseAssertOrThrow(dataIt->get().ledgerEntry != nullptr);
96+
releaseAssertOrThrow(dataIt->ledgerEntry != nullptr);
10097

101-
uint32_t oldSize = xdr::xdr_size(*dataIt->get().ledgerEntry);
98+
uint32_t oldSize = xdr::xdr_size(*dataIt->ledgerEntry);
10299
uint32_t newSize = xdr::xdr_size(ledgerEntry);
103100
updateStateSizeOnEntryUpdate(oldSize, newSize, /*isContractCode=*/false);
104101

105102
// Preserve the existing TTL while updating the data
106-
auto preservedTTL = dataIt->get().ttlData;
103+
auto preservedTTL = dataIt->ttlData;
107104
mContractDataEntries.erase(dataIt);
108105
mContractDataEntries.emplace(
109-
InternalContractDataMapEntry(ledgerEntry, preservedTTL));
106+
std::make_shared<LedgerEntry const>(ledgerEntry), preservedTTL);
110107
}
111108

112109
void
@@ -115,8 +112,7 @@ InMemorySorobanState::createContractDataEntry(LedgerEntry const& ledgerEntry)
115112
releaseAssertOrThrow(ledgerEntry.data.type() == CONTRACT_DATA);
116113

117114
// Verify entry doesn't already exist
118-
auto dataIt = mContractDataEntries.find(
119-
InternalContractDataMapEntry(LedgerEntryKey(ledgerEntry)));
115+
auto dataIt = mContractDataEntries.find(ledgerEntry);
120116
releaseAssertOrThrow(dataIt == mContractDataEntries.end());
121117

122118
// Check if we've already seen this entry's TTL (can happen during
@@ -137,7 +133,7 @@ InMemorySorobanState::createContractDataEntry(LedgerEntry const& ledgerEntry)
137133
updateStateSizeOnEntryUpdate(0, xdr::xdr_size(ledgerEntry),
138134
/*isContractCode=*/false);
139135
mContractDataEntries.emplace(
140-
InternalContractDataMapEntry(ledgerEntry, ttlData));
136+
std::make_shared<LedgerEntry const>(ledgerEntry), ttlData);
141137
}
142138

143139
bool
@@ -158,12 +154,12 @@ InMemorySorobanState::createTTL(LedgerEntry const& ttlEntry)
158154

159155
// Check if the corresponding ContractData entry already exists
160156
// (can happen during initialization when entries arrive out of order)
161-
auto dataIt = mContractDataEntries.find(InternalContractDataMapEntry(lk));
157+
auto dataIt = mContractDataEntries.find(lk);
162158
if (dataIt != mContractDataEntries.end())
163159
{
164160
// ContractData exists but has no TTL yet - update it
165161
// Verify TTL hasn't been set yet (should be default initialized)
166-
releaseAssertOrThrow(dataIt->get().ttlData.isDefault());
162+
releaseAssertOrThrow(dataIt->ttlData.isDefault());
167163
updateContractDataTTL(dataIt, newTtlData);
168164
}
169165
else
@@ -191,11 +187,10 @@ void
191187
InMemorySorobanState::deleteContractData(LedgerKey const& ledgerKey)
192188
{
193189
releaseAssertOrThrow(ledgerKey.type() == CONTRACT_DATA);
194-
auto it =
195-
mContractDataEntries.find(InternalContractDataMapEntry(ledgerKey));
190+
auto it = mContractDataEntries.find(ledgerKey);
196191
releaseAssertOrThrow(it != mContractDataEntries.end());
197-
releaseAssertOrThrow(it->get().ledgerEntry != nullptr);
198-
updateStateSizeOnEntryUpdate(xdr::xdr_size(*it->get().ledgerEntry), 0,
192+
releaseAssertOrThrow(it->ledgerEntry != nullptr);
193+
updateStateSizeOnEntryUpdate(xdr::xdr_size(*it->ledgerEntry), 0,
199194
/*isContractCode=*/false);
200195
mContractDataEntries.erase(it);
201196
}
@@ -207,13 +202,12 @@ InMemorySorobanState::get(LedgerKey const& ledgerKey) const
207202
{
208203
case CONTRACT_DATA:
209204
{
210-
auto it =
211-
mContractDataEntries.find(InternalContractDataMapEntry(ledgerKey));
205+
auto it = mContractDataEntries.find(ledgerKey);
212206
if (it == mContractDataEntries.end())
213207
{
214208
return nullptr;
215209
}
216-
return it->get().ledgerEntry;
210+
return it->ledgerEntry;
217211
}
218212
case CONTRACT_CODE:
219213
{
@@ -326,14 +320,13 @@ InMemorySorobanState::hasTTL(LedgerKey const& ledgerKey) const
326320
}
327321

328322
// Check if this is a ContractData TTL (stored with the data)
329-
auto dataIt =
330-
mContractDataEntries.find(InternalContractDataMapEntry(ledgerKey));
323+
auto dataIt = mContractDataEntries.find(ledgerKey);
331324
if (dataIt != mContractDataEntries.end())
332325
{
333326
// Only return true if TTL has been set (non-zero)
334327
// During initialization, entries may exist with default constructed
335328
// TTLs
336-
return !dataIt->get().ttlData.isDefault();
329+
return !dataIt->ttlData.isDefault();
337330
}
338331

339332
// Check if this is a ContractCode TTL (stored with the code)
@@ -426,11 +419,10 @@ InMemorySorobanState::getTTL(LedgerKey const& ledgerKey) const
426419

427420
// Since the TTL key is the hash of the associated LedgerKey, we don't know
428421
// which map it could belong in, so check both.
429-
auto dataIt =
430-
mContractDataEntries.find(InternalContractDataMapEntry(ledgerKey));
422+
auto dataIt = mContractDataEntries.find(ledgerKey);
431423
if (dataIt != mContractDataEntries.end())
432424
{
433-
return constructTTLEntry(dataIt->get().ttlData);
425+
return constructTTLEntry(dataIt->ttlData);
434426
}
435427

436428
auto codeIt = mContractCodeEntries.find(ledgerKey.ttl().keyHash);

0 commit comments

Comments
 (0)