Просмотр исходного кода

Fix: don't log negative network_bytes values

- Omit negative values that may arise due to /proc/net/dev counter wrap around
  or reset; continue to log values on subsequent iterations
- For readability, skip delta logic after getNetworkBytesTransferred failure
- Rename files to conform with naming conventions
Rod Hynes 2 лет назад
Родитель
Сommit
2f813af389
3 измененных файлов с 25 добавлено и 6 удалено
  1. 0 0
      psiphon/server/networkBytes_linux.go
  2. 0 0
      psiphon/server/networkBytes_other.go
  3. 25 6
      psiphon/server/services.go

+ 0 - 0
psiphon/server/network_bandwidth_linux.go → psiphon/server/networkBytes_linux.go


+ 0 - 0
psiphon/server/network_bandwidth_other.go → psiphon/server/networkBytes_other.go


+ 25 - 6
psiphon/server/services.go

@@ -169,6 +169,11 @@ func RunServices(configJSON []byte) (retErr error) {
 			previousNetworkBytesReceived, previousNetworkBytesSent, err := getNetworkBytesTransferred()
 			previousNetworkBytesReceived, previousNetworkBytesSent, err := getNetworkBytesTransferred()
 			if err != nil {
 			if err != nil {
 				log.WithTraceFields(LogFields{"error": errors.Trace(err)}).Error("failed to get initial network bytes transferred")
 				log.WithTraceFields(LogFields{"error": errors.Trace(err)}).Error("failed to get initial network bytes transferred")
+
+				// If getNetworkBytesTransferred fails, stop logging network
+				// bytes for the lifetime of this process, in case there's a
+				// persistent issue with /proc/net/dev data.
+
 				logNetworkBytes = false
 				logNetworkBytes = false
 			}
 			}
 
 
@@ -184,14 +189,20 @@ func RunServices(configJSON []byte) (retErr error) {
 						if err != nil {
 						if err != nil {
 							log.WithTraceFields(LogFields{"error": errors.Trace(err)}).Error("failed to get current network bytes transferred")
 							log.WithTraceFields(LogFields{"error": errors.Trace(err)}).Error("failed to get current network bytes transferred")
 							logNetworkBytes = false
 							logNetworkBytes = false
-						}
 
 
-						networkBytesReceived = currentNetworkBytesReceived - previousNetworkBytesReceived
-						networkBytesSent = currentNetworkBytesSent - previousNetworkBytesSent
+						} else {
+							networkBytesReceived = currentNetworkBytesReceived - previousNetworkBytesReceived
+							networkBytesSent = currentNetworkBytesSent - previousNetworkBytesSent
 
 
-						previousNetworkBytesReceived, previousNetworkBytesSent = currentNetworkBytesReceived, currentNetworkBytesSent
+							previousNetworkBytesReceived, previousNetworkBytesSent = currentNetworkBytesReceived, currentNetworkBytesSent
+						}
 					}
 					}
 
 
+					// In the rare case that /proc/net/dev rx or tx counters
+					// wrap around or are reset, networkBytesReceived or
+					// networkBytesSent may be < 0. logServerLoad will not
+					// log these negative values.
+
 					logServerLoad(support, logNetworkBytes, networkBytesReceived, networkBytesSent)
 					logServerLoad(support, logNetworkBytes, networkBytesReceived, networkBytesSent)
 				}
 				}
 			}
 			}
@@ -393,8 +404,16 @@ func logServerLoad(support *SupportServices, logNetworkBytes bool, networkBytesR
 	serverLoad["event_name"] = "server_load"
 	serverLoad["event_name"] = "server_load"
 
 
 	if logNetworkBytes {
 	if logNetworkBytes {
-		serverLoad["network_bytes_received"] = networkBytesReceived
-		serverLoad["network_bytes_sent"] = networkBytesSent
+
+		// Negative values, which may occur due to counter wrap arounds, are
+		// omitted.
+
+		if networkBytesReceived >= 0 {
+			serverLoad["network_bytes_received"] = networkBytesReceived
+		}
+		if networkBytesSent >= 0 {
+			serverLoad["network_bytes_sent"] = networkBytesSent
+		}
 	}
 	}
 
 
 	establishTunnels, establishLimitedCount :=
 	establishTunnels, establishLimitedCount :=