Skip to content

Commit 59969fe

Browse files
Fix for CNI lock timedout issue. (#382)
* Fix for CNI lock timedout issue. * removed duplicate log * addressed review comments
1 parent 2088315 commit 59969fe

File tree

4 files changed

+41
-50
lines changed

4 files changed

+41
-50
lines changed

cni/network/network.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ import (
2222
)
2323

2424
const (
25-
// Plugin name.
26-
name = "azure-vnet"
2725
dockerNetworkOption = "com.docker.network.generic"
2826
opModeTransparent = "transparent"
2927
// Supported IP version. Currently support only IPv4
@@ -45,7 +43,7 @@ type netPlugin struct {
4543
}
4644

4745
// NewPlugin creates a new netPlugin object.
48-
func NewPlugin(config *common.PluginConfig) (*netPlugin, error) {
46+
func NewPlugin(name string, config *common.PluginConfig) (*netPlugin, error) {
4947
// Setup base plugin.
5048
plugin, err := cni.NewPlugin(name, config.Version)
5149
if err != nil {
@@ -101,7 +99,6 @@ func (plugin *netPlugin) Stop() {
10199
plugin.nm.Uninitialize()
102100
plugin.Uninitialize()
103101
log.Printf("[cni-net] Plugin stopped.")
104-
log.Close()
105102
}
106103

107104
// FindMasterInterface returns the name of the master interface.

cni/network/plugin/main.go

Lines changed: 38 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const (
2727
pluginName = "CNI"
2828
telemetryNumRetries = 5
2929
telemetryWaitTimeInMilliseconds = 200
30+
name = "azure-vnet"
3031
)
3132

3233
// Version is populated by make during build.
@@ -48,26 +49,13 @@ func printVersion() {
4849
fmt.Printf("Azure CNI Version %v\n", version)
4950
}
5051

51-
// If report write succeeded, mark the report flag state to false.
52-
func markSendReport(reportManager *telemetry.ReportManager, tb *telemetry.TelemetryBuffer) {
53-
if err := reportManager.SetReportState(telemetry.CNITelemetryFile); err != nil {
54-
log.Printf("SetReportState failed due to %v", err)
55-
reflect.ValueOf(reportManager.Report).Elem().FieldByName("ErrorMessage").SetString(err.Error())
56-
57-
if err := reportManager.SendReport(tb); err != nil {
58-
log.Printf("SendReport failed due to %v", err)
59-
}
60-
}
61-
}
62-
6352
// send error report to hostnetagent if CNI encounters any error.
6453
func reportPluginError(reportManager *telemetry.ReportManager, tb *telemetry.TelemetryBuffer, err error) {
6554
log.Printf("Report plugin error")
66-
reportManager.Report.(*telemetry.CNIReport).GetReport(pluginName, version, ipamQueryURL)
6755
reflect.ValueOf(reportManager.Report).Elem().FieldByName("ErrorMessage").SetString(err.Error())
6856

6957
if err := reportManager.SendReport(tb); err != nil {
70-
log.Printf("SendReport failed due to %v", err)
58+
log.Errorf("SendReport failed due to %v", err)
7159
}
7260
}
7361

@@ -152,6 +140,15 @@ func main() {
152140
err error
153141
)
154142

143+
log.SetName(name)
144+
log.SetLevel(log.LevelInfo)
145+
if err = log.SetTarget(log.TargetLogfile); err != nil {
146+
fmt.Printf("Failed to setup cni logging: %v\n", err)
147+
return
148+
}
149+
150+
defer log.Close()
151+
155152
config.Version = version
156153
reportManager := &telemetry.ReportManager{
157154
HostNetAgentURL: hostNetAgentURL,
@@ -171,45 +168,40 @@ func main() {
171168
cniReport.VMUptime = upTime.Format("2006-01-02 15:04:05")
172169
}
173170

174-
tb := telemetry.NewTelemetryBuffer("")
175-
tb.ConnectToTelemetryService(telemetryNumRetries, telemetryWaitTimeInMilliseconds)
176-
defer tb.Close()
177-
178-
t := time.Now()
179-
cniReport.Timestamp = t.Format("2006-01-02 15:04:05")
180171
cniReport.GetReport(pluginName, version, ipamQueryURL)
181-
182-
if !reportManager.GetReportState(telemetry.CNITelemetryFile) {
183-
log.Printf("GetReport state file didn't exist. Setting flag to true")
184-
185-
err = reportManager.SendReport(tb)
186-
if err != nil {
187-
log.Printf("SendReport failed due to %v", err)
188-
} else {
189-
markSendReport(reportManager, tb)
190-
}
191-
}
192-
193172
startTime := time.Now().UnixNano() / int64(time.Millisecond)
194173

195-
netPlugin, err := network.NewPlugin(&config)
174+
netPlugin, err := network.NewPlugin(name, &config)
196175
if err != nil {
197176
log.Printf("Failed to create network plugin, err:%v.\n", err)
198-
reportPluginError(reportManager, tb, err)
199177
return
200178
}
201179

202180
netPlugin.SetCNIReport(cniReport)
203181

182+
// CNI Acquires lock
204183
if err = netPlugin.Plugin.InitializeKeyValueStore(&config); err != nil {
205-
log.Printf("Failed to initialize key-value store of network plugin, err:%v.\n", err)
206-
reportPluginError(reportManager, tb, err)
184+
log.Errorf("Failed to initialize key-value store of network plugin, err:%v.\n", err)
185+
tb := telemetry.NewTelemetryBuffer("")
186+
if tberr := tb.Connect(); tberr == nil {
187+
reportPluginError(reportManager, tb, err)
188+
tb.Close()
189+
}
207190
return
208191
}
209192

193+
// Start telemetry process if not already started. This should be done inside lock, otherwise multiple process
194+
// end up creating/killing telemetry process results in undesired state.
195+
tb := telemetry.NewTelemetryBuffer("")
196+
tb.ConnectToTelemetryService(telemetryNumRetries, telemetryWaitTimeInMilliseconds)
197+
defer tb.Close()
198+
199+
t := time.Now()
200+
cniReport.Timestamp = t.Format("2006-01-02 15:04:05")
201+
210202
defer func() {
211203
if errUninit := netPlugin.Plugin.UninitializeKeyValueStore(); errUninit != nil {
212-
log.Printf("Failed to uninitialize key-value store of network plugin, err:%v.\n", err)
204+
log.Errorf("Failed to uninitialize key-value store of network plugin, err:%v.\n", errUninit)
213205
}
214206

215207
if recover() != nil {
@@ -218,7 +210,7 @@ func main() {
218210
}()
219211

220212
if err = netPlugin.Start(&config); err != nil {
221-
log.Printf("Failed to start network plugin, err:%v.\n", err)
213+
log.Errorf("Failed to start network plugin, err:%v.\n", err)
222214
reportPluginError(reportManager, tb, err)
223215
panic("network plugin start fatal error")
224216
}
@@ -227,14 +219,19 @@ func main() {
227219
if handled == true {
228220
log.Printf("CNI UPDATE finished.")
229221
} else if err = netPlugin.Execute(cni.PluginApi(netPlugin)); err != nil {
230-
log.Printf("Failed to execute network plugin, err:%v.\n", err)
222+
log.Errorf("Failed to execute network plugin, err:%v.\n", err)
231223
}
232224

233225
endTime := time.Now().UnixNano() / int64(time.Millisecond)
234226
reflect.ValueOf(reportManager.Report).Elem().FieldByName("OperationDuration").SetInt(int64(endTime - startTime))
235227

236228
netPlugin.Stop()
237229

230+
// release cni lock
231+
if errUninit := netPlugin.Plugin.UninitializeKeyValueStore(); errUninit != nil {
232+
log.Errorf("Failed to uninitialize key-value store of network plugin, err:%v.\n", errUninit)
233+
}
234+
238235
if err != nil {
239236
reportPluginError(reportManager, tb, err)
240237
panic("network plugin execute fatal error")
@@ -244,9 +241,9 @@ func main() {
244241
reflect.ValueOf(reportManager.Report).Elem().FieldByName("CniSucceeded").SetBool(true)
245242

246243
if err = reportManager.SendReport(tb); err != nil {
247-
log.Printf("SendReport failed due to %v", err)
244+
log.Errorf("SendReport failed due to %v", err)
248245
} else {
249246
log.Printf("Sending report succeeded")
250-
markSendReport(reportManager, tb)
251247
}
248+
252249
}

common/utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func LogNetworkInterfaces() {
4646

4747
for _, iface := range interfaces {
4848
addrs, _ := iface.Addrs()
49-
log.Printf("[net] Network interface: %+v with IP addresses: %+v", iface, addrs)
49+
log.Printf("[net] Network interface: %+v with IP: %+v", iface, addrs)
5050
}
5151
}
5252

network/manager.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,7 @@ func (nm *networkManager) restore() error {
182182
for _, extIf := range nm.ExternalInterfaces {
183183
log.Printf("External Interface %+v", extIf)
184184
for _, nw := range extIf.Networks {
185-
log.Printf("network %+v", nw)
186-
for _, ep := range nw.Endpoints {
187-
log.Printf("endpoint %+v", ep)
188-
}
185+
log.Printf("Number of endpoints: %d", len(nw.Endpoints))
189186
}
190187
}
191188

0 commit comments

Comments
 (0)