Skip to content

Commit ee9e79c

Browse files
committed
cs: Cs_Insert cleanup
1 parent ccaef5c commit ee9e79c

File tree

4 files changed

+56
-87
lines changed

4 files changed

+56
-87
lines changed

container/cs/test_test.go

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"github.com/usnistgov/ndn-dpdk/ndn/ndntestenv"
2525
"github.com/usnistgov/ndn-dpdk/ndni"
2626
"github.com/usnistgov/ndn-dpdk/ndni/ndnitestenv"
27-
"go4.org/must"
2827
)
2928

3029
func TestMain(m *testing.M) {
@@ -42,7 +41,8 @@ var (
4241
)
4342

4443
type Fixture struct {
45-
t testing.TB
44+
t testing.TB
45+
require *require.Assertions
4646

4747
Pcct *pcct.Pcct
4848
Cs *cs.Cs
@@ -58,7 +58,7 @@ type Fixture struct {
5858
}
5959

6060
func NewFixture(t testing.TB, cfg pcct.Config) (f *Fixture) {
61-
f = &Fixture{t: t}
61+
f = &Fixture{t: t, require: require.New(t)}
6262

6363
cfg.PcctCapacity = 4095
6464
if cfg.CsMemoryCapacity == 0 {
@@ -70,46 +70,40 @@ func NewFixture(t testing.TB, cfg pcct.Config) (f *Fixture) {
7070

7171
var e error
7272
f.Pcct, e = pcct.New(cfg, eal.NumaSocket{})
73-
if e != nil {
74-
panic(e)
75-
}
73+
f.require.NoError(e)
7674
f.Cs = cs.FromPcct(f.Pcct)
7775
f.Pit = pit.FromPcct(f.Pcct)
7876

7977
f.Fib, e = fib.New(fibdef.Config{Capacity: 1023}, []fib.LookupThread{&fibtestenv.LookupThread{}})
80-
f.noError(e)
78+
f.require.NoError(e)
8179
placeholderName := ndn.ParseName("/75f3c2eb-6147-4030-afbc-585b3ce876a9")
8280
e = f.Fib.Insert(makeFibEntry(placeholderName, nil, 9999))
83-
f.noError(e)
81+
f.require.NoError(e)
8482
f.FibReplica = f.Fib.Replica(eal.NumaSocket{})
8583
f.FibEntry = f.FibReplica.Lpm(placeholderName)
8684

8785
t.Cleanup(func() {
88-
must.Close(f.Fib)
89-
must.Close(f.Pcct)
86+
f.require.NoError(f.Fib.Close())
87+
f.require.NoError(f.Pcct.Close())
9088
ealthread.AllocClear()
9189
})
9290
return f
9391
}
9492

95-
func (f *Fixture) noError(e error) {
96-
require.NoError(f.t, e)
97-
}
98-
9993
// EnableDisk enables on-disk caching on a Malloc Bdev.
10094
func (f *Fixture) EnableDisk(nSlots int64) {
10195
var e error
10296
f.Bdev, e = bdev.NewMalloc((1 + nSlots) * 16)
103-
f.noError(e)
97+
f.require.NoError(e)
10498
f.t.Cleanup(func() { f.Bdev.Close() })
10599

106100
f.SpdkTh, e = spdkenv.NewThread()
107-
f.noError(e)
101+
f.require.NoError(e)
108102
f.t.Cleanup(func() { f.SpdkTh.Close() })
109-
f.noError(ealthread.AllocLaunch(f.SpdkTh))
103+
f.require.NoError(ealthread.AllocLaunch(f.SpdkTh))
110104

111105
f.DiskStore, e = disk.NewStore(f.Bdev, f.SpdkTh, 16, disk.StoreGetDataGo)
112-
f.noError(e)
106+
f.require.NoError(e)
113107

114108
min, max := f.DiskStore.SlotRange()
115109
f.DiskAlloc = disk.NewAlloc(min, max, eal.NumaSocket{})
@@ -119,7 +113,7 @@ func (f *Fixture) EnableDisk(nSlots int64) {
119113
})
120114

121115
e = f.Cs.SetDisk(f.DiskStore, f.DiskAlloc)
122-
f.noError(e)
116+
f.require.NoError(e)
123117
}
124118

125119
// CountMpInUse returns number of in-use entries in PCCT's underlying mempool.
@@ -138,15 +132,13 @@ func (f *Fixture) Insert(interest *ndni.Packet, data *ndni.Packet) (isReplacing
138132
data.Close()
139133
return false
140134
}
141-
if pitEntry == nil {
142-
panic("Pit.Insert failed")
143-
}
135+
f.require.NotNil(pitEntry, "Pit.Insert failed")
144136

145137
var pitFound pit.FindResult
146138
for {
147139
pitFound = f.Pit.FindByData(data, pitEntry.PitToken())
148140
if len(pitFound.ListEntries()) == 0 {
149-
panic("Pit.FindByData returned empty result")
141+
f.require.Fail("Pit.FindByData returned empty result")
150142
}
151143

152144
if pitFound.NeedDataDigest() {

csrc/pcct/cs-arc.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ const ptrdiff_t CsArc_ListOffsets_[] = {
3131
__attribute__((nonnull)) static void
3232
CsArc_MoveHandler(CsEntry* entry, CsListID src, CsListID dst, __rte_unused uintptr_t ctx) {
3333
switch (CsArc_MoveDir(src, dst)) {
34+
case CsArc_MoveDirC(T1, Del):
35+
case CsArc_MoveDirC(T2, Del):
3436
case CsArc_MoveDirC(T1, B1):
3537
case CsArc_MoveDirC(T2, B2):
3638
CsEntry_FreeData(entry);
@@ -40,7 +42,6 @@ CsArc_MoveHandler(CsEntry* entry, CsListID src, CsListID dst, __rte_unused uintp
4042
case CsArc_MoveDirC(B1, T2):
4143
case CsArc_MoveDirC(B2, T2):
4244
case CsArc_MoveDirC(B1, Del):
43-
case CsArc_MoveDirC(T1, Del):
4445
case CsArc_MoveDirC(B2, Del):
4546
break;
4647
default:
@@ -175,7 +176,8 @@ CsArc_Add(CsArc* arc, CsEntry* entry) {
175176

176177
void
177178
CsArc_Remove(CsArc* arc, CsEntry* entry) {
178-
N_LOGD("Remove arc=%p cs-entry=%p", arc, entry);
179+
N_LOGD("Remove arc=%p cs-entry=%p from=%d", arc, entry, (int)entry->arcList);
179180
CsList_Remove(CsArc_GetList(arc, entry->arcList), entry);
181+
arc->moveCb((entry), entry->arcList, CslDirectDel, arc->moveCtx);
180182
entry->arcList = 0;
181183
}

csrc/pcct/cs-disk.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ void
4949
CsDisk_ArcMove(CsEntry* entry, CsListID src, CsListID dst, uintptr_t ctx) {
5050
Cs* cs = (Cs*)ctx;
5151
switch (CsArc_MoveDir(src, dst)) {
52+
case CsArc_MoveDirC(T1, Del):
53+
case CsArc_MoveDirC(T2, Del):
5254
case CsArc_MoveDirC(T1, B1):
5355
CsEntry_FreeData(entry);
5456
break;
@@ -65,7 +67,7 @@ CsDisk_ArcMove(CsEntry* entry, CsListID src, CsListID dst, uintptr_t ctx) {
6567
case CsArc_MoveDirC(T1, T2):
6668
case CsArc_MoveDirC(B1, T2):
6769
case CsArc_MoveDirC(B1, Del):
68-
case CsArc_MoveDirC(T1, Del):
70+
NDNDPDK_ASSERT(entry->kind != CsEntryDisk);
6971
break;
7072
default:
7173
NDNDPDK_ASSERT(false);

csrc/pcct/cs.c

Lines changed: 34 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -37,35 +37,20 @@ CsEraseBatch_AddDirect(PcctEraseBatch* peb, CsEntry* entry) {
3737
CsEraseBatch_Append(peb, indirect, "indirect-dep");
3838
}
3939

40-
switch (entry->kind) {
41-
case CsEntryNone:
42-
break;
43-
case CsEntryMemory:
44-
CsEntry_FreeData(entry);
45-
break;
46-
default:
47-
NDNDPDK_ASSERT(false);
48-
}
40+
NDNDPDK_ASSERT(entry->kind == CsEntryNone);
4941
CsEraseBatch_Append(peb, entry, "direct");
5042
}
5143

5244
/** @brief Erase a CS entry including dependents. */
5345
__attribute__((nonnull)) static void
5446
Cs_EraseEntry(Cs* cs, CsEntry* entry) {
5547
PcctEraseBatch peb = PcctEraseBatch_New(Pcct_FromCs(cs));
56-
switch (entry->kind) {
57-
case CsEntryIndirect:
58-
CsList_Remove(&cs->indirect, entry);
59-
CsEraseBatch_AddIndirect(&peb, entry);
60-
break;
61-
case CsEntryDisk:
62-
CsDisk_Delete(cs, entry);
63-
// fallthrough
64-
case CsEntryNone:
65-
case CsEntryMemory:
66-
CsArc_Remove(&cs->direct, entry);
67-
CsEraseBatch_AddDirect(&peb, entry);
68-
break;
48+
if (entry->kind == CsEntryIndirect) {
49+
CsList_Remove(&cs->indirect, entry);
50+
CsEraseBatch_AddIndirect(&peb, entry);
51+
} else {
52+
CsArc_Remove(&cs->direct, entry);
53+
CsEraseBatch_AddDirect(&peb, entry);
6954
}
7055
PcctEraseBatch_Finish(&peb);
7156
}
@@ -147,14 +132,15 @@ Cs_PutDirect(Cs* cs, Packet* npkt, PccEntry* pccEntry) {
147132
case CsEntryMemory:
148133
CsEntry_FreeData(entry);
149134
// fallthrough
135+
case CsEntryDisk:
136+
// diskSlot will be released by CsArc_Add that invokes CsDisk_ArcMove
137+
// fallthrough
150138
case CsEntryNone:
151139
Cs_EraseImplicitDigestIndirect(cs, entry, data->name.length);
152140
break;
153141
case CsEntryIndirect:
154142
CsEntry_Disassoc(entry);
155143
break;
156-
case CsEntryDisk: // TODO would this happen?
157-
NDNDPDK_ASSERT(false);
158144
}
159145
} else {
160146
// insert direct entry
@@ -213,17 +199,6 @@ Cs_PutIndirect(Cs* cs, CsEntry* direct, PccEntry* pccEntry) {
213199
} else {
214200
// change direct entry to indirect entry
215201
CsArc_Remove(&cs->direct, entry);
216-
switch (entry->kind) {
217-
case CsEntryNone:
218-
break;
219-
case CsEntryMemory:
220-
rte_pktmbuf_free(Packet_ToMbuf(entry->data));
221-
entry->kind = CsEntryNone;
222-
break;
223-
case CsEntryDisk: // TODO would this happen?
224-
default:
225-
NDNDPDK_ASSERT(false);
226-
}
227202
}
228203
N_LOGD("PutIndirect refresh cs=%p npkt=%p pcc-entry=%p cs-entry=%p", cs, direct, pccEntry,
229204
entry);
@@ -261,36 +236,27 @@ Cs_Insert(Cs* cs, Packet* npkt, PitFindResult pitFound) {
261236
PData* data = Packet_GetDataHdr(npkt);
262237
PccEntry* pccEntry = pitFound.entry;
263238
PInterest* interest = PitFindResult_GetInterest(pitFound);
264-
CsEntry* direct = NULL;
265-
266-
// if Interest name differs from Data name, insert a direct entry elsewhere
267-
if (unlikely(interest->name.nComps != data->name.nComps)) {
268-
direct = Cs_InsertDirect(cs, npkt, interest);
269-
if (unlikely(direct == NULL)) { // direct entry insertion failed
270-
Pit_EraseSatisfied(&pcct->pit, pitFound);
271-
rte_pktmbuf_free(pkt);
272-
if (likely(!pccEntry->hasCsEntry)) {
273-
Pcct_Erase(pcct, pccEntry);
274-
}
275-
return;
276-
}
277-
NULLize(npkt);
278-
NULLize(pkt); // owned by direct entry
279-
}
280239

281-
// delete PIT entries
282-
Pit_EraseSatisfied(&pcct->pit, pitFound);
283-
NULLize(interest);
240+
if (interest->name.nComps == data->name.nComps) { // exact match, direct entry here
241+
Pit_EraseSatisfied(&pcct->pit, pitFound);
242+
NULLize(interest);
284243

285-
if (likely(direct == NULL)) {
286-
// put direct CS entry at pccEntry
287-
direct = Cs_PutDirect(cs, npkt, pccEntry);
288-
// alloc-err cannot happen because PccSlots are freed from PIT entries
289-
NDNDPDK_ASSERT(direct != NULL); // TODO this may happen now
290-
} else {
291-
// put indirect CS entry at pccEntry
244+
CsEntry* direct = Cs_PutDirect(cs, npkt, pccEntry);
245+
if (unlikely(direct == NULL)) {
246+
goto FAIL_DIRECT;
247+
}
248+
} else { // prefix match, indirect entry here, direct entry elsewhere
249+
CsEntry* direct = Cs_InsertDirect(cs, npkt, interest);
250+
Pit_EraseSatisfied(&pcct->pit, pitFound);
251+
NULLize(interest);
252+
253+
if (unlikely(direct == NULL)) {
254+
goto FAIL_DIRECT;
255+
}
292256
Cs_PutIndirect(cs, direct, pccEntry);
293257
}
258+
NULLize(npkt); // owned by direct entry
259+
NULLize(pkt);
294260

295261
// evict if over capacity
296262
if (unlikely(cs->indirect.count > cs->indirect.capacity)) {
@@ -299,6 +265,13 @@ Cs_Insert(Cs* cs, Packet* npkt, PitFindResult pitFound) {
299265
if (unlikely(cs->direct.Del.count >= CsEvictBulk)) {
300266
Cs_Evict(cs, &cs->direct.Del, "direct", Cs_EvictEntryDirect);
301267
}
268+
269+
return;
270+
FAIL_DIRECT:
271+
rte_pktmbuf_free(pkt);
272+
if (likely(!pccEntry->hasEntries)) {
273+
Pcct_Erase(pcct, pccEntry);
274+
}
302275
}
303276

304277
CsEntry*

0 commit comments

Comments
 (0)