Skip to content

Commit a6eb757

Browse files
committed
cs: CsArc_MoveCb
This function provides a hook for upcoming DiskStore integration.
1 parent 41c53bc commit a6eb757

21 files changed

+121
-140
lines changed

container/cs/evict_test.go

+12-15
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,10 @@ import (
1111
// Direct entries use ARC algorithm, but this only tests its LRU behavior.
1212
func TestDirectLru(t *testing.T) {
1313
assert, _ := makeAR(t)
14-
var cfg pcct.Config
15-
cfg.CsDirectCapacity = 400
16-
cfg.CsIndirectCapacity = 100
17-
fixture := NewFixture(cfg)
18-
defer fixture.Close()
14+
fixture := NewFixture(t, pcct.Config{
15+
CsDirectCapacity: 400,
16+
CsIndirectCapacity: 100,
17+
})
1918
assert.Equal(400, fixture.Cs.Capacity(cs.ListDirect))
2019

2120
// insert 1-2000, should keep (most of) 1601-2000 direct entries
@@ -36,11 +35,10 @@ func TestDirectLru(t *testing.T) {
3635
// This test partially verifies ARC list size updates.
3736
func TestDirectArc(t *testing.T) {
3837
assert, _ := makeAR(t)
39-
var cfg pcct.Config
40-
cfg.CsDirectCapacity = 100
41-
cfg.CsIndirectCapacity = 100
42-
fixture := NewFixture(cfg)
43-
defer fixture.Close()
38+
fixture := NewFixture(t, pcct.Config{
39+
CsDirectCapacity: 100,
40+
CsIndirectCapacity: 100,
41+
})
4442

4543
// insert 1-100 (NEW), p=0, T1=[1..100]
4644
fixture.InsertBulk(1, 100, "/N/%d", "/N/%d")
@@ -101,11 +99,10 @@ func TestDirectArc(t *testing.T) {
10199

102100
func TestIndirectLru(t *testing.T) {
103101
assert, _ := makeAR(t)
104-
var cfg pcct.Config
105-
cfg.CsDirectCapacity = 600
106-
cfg.CsIndirectCapacity = 400
107-
fixture := NewFixture(cfg)
108-
defer fixture.Close()
102+
fixture := NewFixture(t, pcct.Config{
103+
CsDirectCapacity: 600,
104+
CsIndirectCapacity: 400,
105+
})
109106
assert.Equal(400, fixture.Cs.Capacity(cs.ListIndirect))
110107

111108
// insert 1-2000, should keep (most of) 1601-2000 indirect entries

container/cs/match_test.go

+3-9
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ import (
1212

1313
func TestInsertErase(t *testing.T) {
1414
assert, require := makeAR(t)
15-
var cfg pcct.Config
16-
fixture := NewFixture(cfg)
17-
defer fixture.Close()
15+
fixture := NewFixture(t, pcct.Config{})
1816

1917
ok := fixture.Insert(makeInterest("/A/B"),
2018
makeData("/A/B"))
@@ -65,9 +63,7 @@ func TestInsertErase(t *testing.T) {
6563

6664
func TestPrefixMatch(t *testing.T) {
6765
assert, require := makeAR(t)
68-
var cfg pcct.Config
69-
fixture := NewFixture(cfg)
70-
defer fixture.Close()
66+
fixture := NewFixture(t, pcct.Config{})
7167

7268
// /A/B/C/D <- [/A/B]
7369
ok := fixture.Insert(makeInterest("/A/B", ndn.CanBePrefixFlag), makeData("/A/B/C/D"))
@@ -125,9 +121,7 @@ func TestPrefixMatch(t *testing.T) {
125121

126122
func TestImplicitDigestMatch(t *testing.T) {
127123
assert, _ := makeAR(t)
128-
var cfg pcct.Config
129-
fixture := NewFixture(cfg)
130-
defer fixture.Close()
124+
fixture := NewFixture(t, pcct.Config{})
131125

132126
// /A/B/C/D {0x01} <- [/A/B]
133127
data01 := makeData("/A/B/C/D", []byte{0x01})

container/cs/test_test.go

+5-7
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ type Fixture struct {
4545
FibEntry *fibreplica.Entry
4646
}
4747

48-
func NewFixture(cfg pcct.Config) (fixture *Fixture) {
48+
func NewFixture(t testing.TB, cfg pcct.Config) (fixture *Fixture) {
4949
cfg.PcctCapacity = 4095
5050
if cfg.CsDirectCapacity == 0 {
5151
cfg.CsDirectCapacity = 200
@@ -74,15 +74,13 @@ func NewFixture(cfg pcct.Config) (fixture *Fixture) {
7474
fixture.FibReplica = fixture.Fib.Replica(eal.NumaSocket{})
7575
fixture.FibEntry = fixture.FibReplica.Lpm(placeholderName)
7676

77+
t.Cleanup(func() {
78+
must.Close(fixture.Fib)
79+
must.Close(fixture.Pcct)
80+
})
7781
return fixture
7882
}
7983

80-
func (fixture *Fixture) Close() error {
81-
must.Close(fixture.Fib)
82-
must.Close(fixture.Pcct)
83-
return nil
84-
}
85-
8684
// Return number of in-use entries in PCCT's underlying mempool.
8785
func (fixture *Fixture) CountMpInUse() int {
8886
return fixture.Pcct.AsMempool().CountInUse()

container/pcct/pcct.go

+2-6
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,9 @@ func (pcct *Pcct) Ptr() unsafe.Pointer {
4747
return unsafe.Pointer(pcct)
4848
}
4949

50-
func (pcct *Pcct) ptr() *C.Pcct {
51-
return (*C.Pcct)(pcct)
52-
}
53-
5450
// AsMempool returns underlying mempool of the PCCT.
5551
func (pcct *Pcct) AsMempool() *mempool.Mempool {
56-
return mempool.FromPtr(unsafe.Pointer(pcct.ptr().mp))
52+
return mempool.FromPtr(unsafe.Pointer(pcct.mp))
5753
}
5854

5955
func (pcct *Pcct) String() string {
@@ -62,7 +58,7 @@ func (pcct *Pcct) String() string {
6258

6359
// Close destroys the PCCT.
6460
func (pcct *Pcct) Close() error {
65-
C.Pcct_Clear(pcct.ptr())
61+
C.Pcct_Clear((*C.Pcct)(pcct))
6662
return pcct.AsMempool().Close()
6763
}
6864

container/pit/entry_test.go

+4-8
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ import (
1212

1313
func TestEntryExpiry(t *testing.T) {
1414
assert, require := makeAR(t)
15-
fixture := NewFixture(255)
16-
defer fixture.Close()
15+
fixture := NewFixture(t, 255)
1716

1817
nonce1 := ndn.Nonce{0xA0, 0xA1, 0xA2, 0xA3}
1918
token1 := []byte{0xB0}
@@ -51,8 +50,7 @@ func TestEntryExpiry(t *testing.T) {
5150

5251
func TestEntryExtend(t *testing.T) {
5352
assert, require := makeAR(t)
54-
fixture := NewFixture(255)
55-
defer fixture.Close()
53+
fixture := NewFixture(t, 255)
5654

5755
var entry *pit.Entry
5856

@@ -74,8 +72,7 @@ func TestEntryExtend(t *testing.T) {
7472

7573
func TestEntryLongName(t *testing.T) {
7674
assert, require := makeAR(t)
77-
fixture := NewFixture(255)
78-
defer fixture.Close()
75+
fixture := NewFixture(t, 255)
7976

8077
names := []struct {
8178
Name string
@@ -108,8 +105,7 @@ func TestEntryLongName(t *testing.T) {
108105

109106
func TestEntryFibRef(t *testing.T) {
110107
assert, require := makeAR(t)
111-
fixture := NewFixture(255)
112-
defer fixture.Close()
108+
fixture := NewFixture(t, 255)
113109

114110
fibEntry1 := fixture.InsertFibEntry("/A", 1001)
115111
interest1 := makeInterest("/A/B")

container/pit/pit.go

+10-14
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ package pit
55
#include "../../csrc/pcct/pit.h"
66
77
static_assert(offsetof(PitInsertResult, pitEntry) == offsetof(PitInsertResult, csEntry), "");
8-
void* c_PitInsertResult_GetEntry(PitInsertResult r) { return r.pitEntry; }
8+
const ptrdiff_t c_PitInsertResult_EntryOffset = offsetof(PitInsertResult, pitEntry);
99
*/
1010
import "C"
1111
import (
@@ -32,23 +32,24 @@ func (pit *Pit) ptr() *C.Pit {
3232

3333
// Len returns number of PIT entries.
3434
func (pit *Pit) Len() int {
35-
return int(pit.ptr().nEntries)
35+
return int(pit.nEntries)
3636
}
3737

3838
// TriggerTimeoutSched triggers the internal timeout scheduler.
3939
func (pit *Pit) TriggerTimeoutSched() {
40-
C.MinSched_Trigger(pit.ptr().timeoutSched)
40+
C.MinSched_Trigger(pit.timeoutSched)
4141
}
4242

4343
// Insert attempts to insert a PIT entry for the given Interest.
4444
// It returns either a new or existing PIT entry, or a CS entry that satisfies the Interest.
4545
func (pit *Pit) Insert(interest *ndni.Packet, fibEntry *fibreplica.Entry) (pitEntry *Entry, csEntry *cs.Entry) {
46-
res := C.Pit_Insert(pit.ptr(), (*C.Packet)(interest.Ptr()), (*C.FibEntry)(fibEntry.Ptr()))
47-
switch res.kind {
46+
ir := C.Pit_Insert(pit.ptr(), (*C.Packet)(interest.Ptr()), (*C.FibEntry)(fibEntry.Ptr()))
47+
entryPtr := *(*unsafe.Pointer)(unsafe.Add(unsafe.Pointer(&ir), C.c_PitInsertResult_EntryOffset))
48+
switch ir.kind {
4849
case C.PIT_INSERT_PIT:
49-
pitEntry = (*Entry)(C.c_PitInsertResult_GetEntry(res))
50+
pitEntry = (*Entry)(entryPtr)
5051
case C.PIT_INSERT_CS:
51-
csEntry = cs.EntryFromPtr(C.c_PitInsertResult_GetEntry(res))
52+
csEntry = cs.EntryFromPtr(entryPtr)
5253
}
5354
return
5455
}
@@ -60,17 +61,12 @@ func (pit *Pit) Erase(entry *Entry) {
6061

6162
// FindByData searches for PIT entries matching a Data.
6263
func (pit *Pit) FindByData(data *ndni.Packet, token uint64) FindResult {
63-
resC := C.Pit_FindByData(pit.ptr(), (*C.Packet)(data.Ptr()), C.uint64_t(token))
64-
return FindResult(resC)
64+
return FindResult(C.Pit_FindByData(pit.ptr(), (*C.Packet)(data.Ptr()), C.uint64_t(token)))
6565
}
6666

6767
// FindByNack searches for PIT entries matching a Nack.
6868
func (pit *Pit) FindByNack(nack *ndni.Packet, token uint64) *Entry {
69-
entryC := C.Pit_FindByNack(pit.ptr(), (*C.Packet)(nack.Ptr()), C.uint64_t(token))
70-
if entryC == nil {
71-
return nil
72-
}
73-
return (*Entry)(entryC)
69+
return (*Entry)(C.Pit_FindByNack(pit.ptr(), (*C.Packet)(nack.Ptr()), C.uint64_t(token)))
7470
}
7571

7672
// FindResult represents the result of Pit.FindByData.

container/pit/pit_test.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ import (
1313

1414
func TestInsertErase(t *testing.T) {
1515
assert, _ := makeAR(t)
16-
fixture := NewFixture(255)
17-
defer fixture.Close()
16+
fixture := NewFixture(t, 255)
1817

1918
assert.Zero(fixture.Pit.Len())
2019
assert.Zero(fixture.CountMpInUse())
@@ -78,8 +77,7 @@ func TestToken(t *testing.T) {
7877
records := make([]testTokenRecord, 255)
7978
nImplicitDigest := 32
8079
nAllocErr := 2
81-
fixture := NewFixture(len(records))
82-
defer fixture.Close()
80+
fixture := NewFixture(t, len(records))
8381
pit := fixture.Pit
8482

8583
for i := 0; i < len(records)+nAllocErr; i++ {

container/pit/suppress-config.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ func (sc SuppressConfig) CopyToC(ptr unsafe.Pointer) {
2323
c := (*C.PitSuppressConfig)(ptr)
2424
c.min = C.TscDuration(eal.ToTscDuration(sc.Min.DurationOr(10e6)))
2525
c.max = C.TscDuration(eal.ToTscDuration(sc.Max.DurationOr(100e6)))
26-
if sc.Multiplier < 1.0 {
27-
c.multiplier = 2.0
28-
} else {
26+
if sc.Multiplier >= 1.0 {
2927
c.multiplier = C.double(sc.Multiplier)
28+
} else {
29+
c.multiplier = 2.0
3030
}
3131
}

container/pit/test_test.go

+6-8
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ type Fixture struct {
4444
FibEntry *fibreplica.Entry
4545
}
4646

47-
func NewFixture(pcctCapacity int) *Fixture {
48-
fixture := new(Fixture)
47+
func NewFixture(t testing.TB, pcctCapacity int) *Fixture {
48+
fixture := &Fixture{}
4949
var e error
5050
fixture.Pcct, e = pcct.New(pcct.Config{PcctCapacity: pcctCapacity}, eal.NumaSocket{})
5151
if e != nil {
@@ -64,15 +64,13 @@ func NewFixture(pcctCapacity int) *Fixture {
6464
fixture.FibReplica = fixture.Fib.Replica(eal.NumaSocket{})
6565
fixture.FibEntry = fixture.FibReplica.Lpm(placeholderName)
6666

67+
t.Cleanup(func() {
68+
must.Close(fixture.Fib)
69+
must.Close(fixture.Pcct)
70+
})
6771
return fixture
6872
}
6973

70-
func (fixture *Fixture) Close() error {
71-
must.Close(fixture.Fib)
72-
must.Close(fixture.Pcct)
73-
return nil
74-
}
75-
7674
// Return number of in-use entries in PCCT's underlying mempool.
7775
func (fixture *Fixture) CountMpInUse() int {
7876
return fixture.Pcct.AsMempool().CountInUse()

csrc/pcct/cs-arc.c

+19-10
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,29 @@ const ptrdiff_t CsArc_ListOffsets_[] = {
1010
[CslDirectDel] = offsetof(CsArc, Del),
1111
};
1212

13-
#define CsArc_c(arc) ((arc)->B1.capacity)
14-
#define CsArc_2c(arc) ((arc)->B2.capacity)
15-
#define CsArc_p(arc) ((arc)->T1.capacity)
16-
#define CsArc_p1(arc) ((arc)->T2.capacity)
17-
1813
#define CsArc_Move(arc, entry, src, dst) \
1914
do { \
2015
NDNDPDK_ASSERT((entry)->arcList == CslDirect##src); \
2116
CsList_Remove(&(arc)->src, (entry)); \
2217
(entry)->arcList = CslDirect##dst; \
2318
CsList_Append(&(arc)->dst, (entry)); \
2419
N_LOGV("^ move=%p from=" #src " to=" #dst, (entry)); \
20+
(arc)->moveCb((arc)->moveCbArg, (entry), CslDirect##src, CslDirect##dst); \
2521
} while (false)
2622

23+
/**
24+
* @brief Default handler when entry is moved between lists.
25+
*
26+
* If an entry is moved from T1/T2 to a non-T1/T2 list, its Data packet is released.
27+
*/
28+
__attribute__((nonnull)) static inline void
29+
CsArc_MoveHandler(__rte_unused void* arg, CsEntry* entry, CsListID src, CsListID dst)
30+
{
31+
if ((src == CslDirectT1 || src == CslDirectT2) && !(dst == CslDirectT1 || dst == CslDirectT2)) {
32+
CsEntry_Clear(entry);
33+
}
34+
}
35+
2736
__attribute__((nonnull)) static inline void
2837
CsArc_SetP(CsArc* arc, double p)
2938
{
@@ -45,20 +54,21 @@ CsArc_Init(CsArc* arc, uint32_t capacity)
4554
CsArc_c(arc) = capacity;
4655
CsArc_2c(arc) = 2 * capacity;
4756
CsArc_SetP(arc, 0.0);
57+
58+
arc->moveCb = CsArc_MoveHandler;
59+
arc->moveCbArg = NULL;
4860
}
4961

5062
__attribute__((nonnull)) static void
5163
CsArc_Replace(CsArc* arc, bool isB2)
5264
{
53-
CsEntry* moving = NULL;
5465
if (isB2 ? arc->T1.count >= CsArc_p1(arc) : arc->T1.count > CsArc_p(arc)) {
55-
moving = CsList_GetFront(&arc->T1);
66+
CsEntry* moving = CsList_GetFront(&arc->T1);
5667
CsArc_Move(arc, moving, T1, B1);
5768
} else {
58-
moving = CsList_GetFront(&arc->T2);
69+
CsEntry* moving = CsList_GetFront(&arc->T2);
5970
CsArc_Move(arc, moving, T2, B2);
6071
}
61-
CsEntry_Clear(moving);
6272
}
6373

6474
__attribute__((nonnull)) static void
@@ -102,7 +112,6 @@ CsArc_AddNew(CsArc* arc, CsEntry* entry)
102112
NDNDPDK_ASSERT(arc->B1.count == 0);
103113
N_LOGV("^ evict-from=T1");
104114
CsEntry* deleting = CsList_GetFront(&arc->T1);
105-
CsEntry_Clear(deleting);
106115
CsArc_Move(arc, deleting, T1, Del);
107116
}
108117
} else {

csrc/pcct/cs-arc.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ CsArc_Init(CsArc* arc, uint32_t capacity);
2828
__attribute__((nonnull)) static __rte_always_inline uint32_t
2929
CsArc_GetCapacity(const CsArc* arc)
3030
{
31-
return arc->B1.capacity;
31+
return CsArc_c(arc);
3232
}
3333

3434
/** @brief Return number of in-memory entries. */

csrc/pcct/cs-entry.h

-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88

99
extern const char* CsEntryKindString[];
1010

11-
typedef struct CsEntry CsEntry;
12-
1311
/**
1412
* @brief A CS entry.
1513
*

0 commit comments

Comments
 (0)