7
7
"github.com/named-data/ndnd/dv/tlv"
8
8
enc "github.com/named-data/ndnd/std/encoding"
9
9
"github.com/named-data/ndnd/std/log"
10
- "github.com/named-data/ndnd/std/ndn "
10
+ "github.com/named-data/ndnd/std/object "
11
11
ndn_sync "github.com/named-data/ndnd/std/sync"
12
- "github.com/named-data/ndnd/std/utils"
13
12
)
14
13
15
14
// Fetch all required prefix data
@@ -60,31 +59,26 @@ func (dv *Router) prefixDataFetch(nodeId enc.Name) {
60
59
// Fetch the prefix data
61
60
log .Debugf ("prefixDataFetch: fetching prefix data for %s [%d => %d]" , nodeId , router .Known , router .Latest )
62
61
63
- cfg := & ndn.InterestConfig {
64
- MustBeFresh : true ,
65
- Lifetime : utils .IdPtr (4 * time .Second ),
66
- Nonce : utils .ConvertNonce (dv .engine .Timer ().Nonce ()),
67
- }
68
-
69
- isSnap := router .Latest - router .Known > 100
62
+ // Prefix object for other router
70
63
name := append (nodeId ,
71
64
enc .NewStringComponent (enc .TypeKeywordNameComponent , "DV" ),
72
65
enc .NewStringComponent (enc .TypeKeywordNameComponent , "PFX" ),
73
66
)
74
- if isSnap {
75
- name = append ( name , enc . NewStringComponent ( enc . TypeKeywordNameComponent , "SNAP" ))
76
- cfg . CanBePrefix = true
67
+ if router . Latest - router . Known > table . PrefixTableSnapThreshold {
68
+ // no version - discover the latest snapshot
69
+ name = append ( name , table . PrefixTableSnap )
77
70
} else {
78
- name = append (name , enc .NewSequenceNumComponent (router .Known + 1 ))
71
+ name = append (name ,
72
+ enc .NewSequenceNumComponent (router .Known + 1 ),
73
+ enc .NewVersionComponent (0 ), // immutable
74
+ )
79
75
}
80
76
81
- interest , err := dv .engine .Spec ().MakeInterest (name , cfg , nil , nil )
82
- if err != nil {
83
- log .Warnf ("prefixDataFetch: failed to make Interest: %+v" , err )
84
- return
85
- }
77
+ dv .client .Consume (name , func (state * object.ConsumeState ) bool {
78
+ if ! state .IsComplete () {
79
+ return true
80
+ }
86
81
87
- err = dv .engine .Express (interest , func (args ndn.ExpressCallbackArgs ) {
88
82
go func () {
89
83
// Done fetching, restart if needed
90
84
defer func () {
@@ -95,30 +89,22 @@ func (dv *Router) prefixDataFetch(nodeId enc.Name) {
95
89
go dv .prefixDataFetch (nodeId ) // recheck
96
90
}()
97
91
98
- // Sleep this goroutine if no data was received
99
- if args .Result != ndn .InterestResultData {
100
- log .Warnf ("prefixDataFetch: failed to fetch prefix data %s: %d" , interest .FinalName , args .Result )
101
-
102
- // see advertDataFetch
103
- if args .Result != ndn .InterestResultTimeout {
104
- time .Sleep (2 * time .Second )
105
- } else {
106
- time .Sleep (100 * time .Millisecond )
107
- }
92
+ // Wait before retry if there was a failure
93
+ if err := state .Error (); err != nil {
94
+ log .Warnf ("prefixDataFetch: failed to fetch prefix data %s: %+v" , name , err )
95
+ time .Sleep (1 * time .Second )
108
96
return
109
97
}
110
98
111
- dv .processPrefixData (args . Data , router )
99
+ dv .processPrefixData (state . Name (), state . Content () , router )
112
100
}()
101
+
102
+ return true
113
103
})
114
- if err != nil {
115
- log .Warnf ("prefixDataFetch: failed to express Interest: %+v" , err )
116
- return
117
- }
118
104
}
119
105
120
- func (dv * Router ) processPrefixData (data ndn. Data , router * table.PrefixTableRouter ) {
121
- ops , err := tlv .ParsePrefixOpList (enc .NewWireReader (data . Content () ), true )
106
+ func (dv * Router ) processPrefixData (name enc. Name , data [] byte , router * table.PrefixTableRouter ) {
107
+ ops , err := tlv .ParsePrefixOpList (enc .NewBufferReader (data ), true )
122
108
if err != nil {
123
109
log .Warnf ("prefixDataFetch: failed to parse PrefixOpList: %+v" , err )
124
110
return
@@ -127,18 +113,21 @@ func (dv *Router) processPrefixData(data ndn.Data, router *table.PrefixTableRout
127
113
dv .mutex .Lock ()
128
114
defer dv .mutex .Unlock ()
129
115
130
- // Update sequence number
131
- dataName := data .Name ()
132
- seqNo := dataName [len (dataName )- 1 ]
133
- if seqNo .Typ != enc .TypeSequenceNumNameComponent {
116
+ // Get sequence number from name
117
+ seqNo := name [len (name )- 2 ]
118
+ if seqNo .Equal (table .PrefixTableSnap ) && name [len (name )- 1 ].Typ == enc .TypeVersionNameComponent {
119
+ // version is sequence number for snapshot
120
+ seqNo = name [len (name )- 1 ]
121
+ } else if seqNo .Typ != enc .TypeSequenceNumNameComponent {
122
+ // version is immutable, sequence number is in name
134
123
log .Warnf ("prefixDataFetch: unexpected sequence number type: %s" , seqNo .Typ )
135
124
return
136
125
}
137
126
138
127
// Update the prefix table
139
128
router .Known = seqNo .NumberVal ()
140
129
if dv .pfx .Apply (ops ) {
141
- // Update the local fib if prefix table changed (very expensive)
142
- go dv .fibUpdate ()
130
+ // Update the local fib if prefix table changed
131
+ go dv .fibUpdate () // very expensive
143
132
}
144
133
}
0 commit comments