Преглед на файлове

make error recovery configurable

tags/v0.10.1
Shivaram Lingamneni преди 6 години
родител
ревизия
7b58bf76ef
променени са 5 файла, в които са добавени 28 реда и са изтрити 8 реда
  1. 5
    3
      irc/client.go
  2. 2
    1
      irc/config.go
  3. 6
    0
      irc/getters.go
  4. 7
    4
      irc/server.go
  5. 8
    0
      oragono.yaml

+ 5
- 3
irc/client.go Целия файл

@@ -185,9 +185,11 @@ func (client *Client) run() {
185 185
 	var msg ircmsg.IrcMessage
186 186
 
187 187
 	defer func() {
188
-		if r := recover(); r != nil {
189
-			client.server.logger.Error("internal",
190
-				fmt.Sprintf("Client caused panic, disconnecting: %v\n%s", r, debug.Stack()))
188
+		if client.server.RecoverFromErrors() {
189
+			if r := recover(); r != nil {
190
+				client.server.logger.Error("internal",
191
+					fmt.Sprintf("Client caused panic, disconnecting: %v\n%s", r, debug.Stack()))
192
+			}
191 193
 		}
192 194
 		// ensure client connection gets closed
193 195
 		client.destroy()

+ 2
- 1
irc/config.go Целия файл

@@ -188,7 +188,8 @@ type Config struct {
188 188
 	Logging []logger.LoggingConfig
189 189
 
190 190
 	Debug struct {
191
-		StackImpact StackImpactConfig
191
+		RecoverFromErrors *bool `yaml:"recover-from-errors"`
192
+		StackImpact       StackImpactConfig
192 193
 	}
193 194
 
194 195
 	Limits struct {

+ 6
- 0
irc/getters.go Целия файл

@@ -23,6 +23,12 @@ func (server *Server) getPassword() []byte {
23 23
 	return server.password
24 24
 }
25 25
 
26
+func (server *Server) RecoverFromErrors() bool {
27
+	server.configurableStateMutex.RLock()
28
+	defer server.configurableStateMutex.RUnlock()
29
+	return server.recoverFromErrors
30
+}
31
+
26 32
 func (server *Server) ProxyAllowedFrom() []string {
27 33
 	server.configurableStateMutex.RLock()
28 34
 	defer server.configurableStateMutex.RUnlock()

+ 7
- 4
irc/server.go Целия файл

@@ -109,6 +109,7 @@ type Server struct {
109 109
 	operclasses                  map[string]OperClass
110 110
 	password                     []byte
111 111
 	passwords                    *passwd.SaltedManager
112
+	recoverFromErrors            bool
112 113
 	registeredChannels           map[string]*RegisteredChannel
113 114
 	registeredChannelsMutex      sync.RWMutex
114 115
 	rehashMutex                  sync.Mutex
@@ -1250,21 +1251,23 @@ func (server *Server) applyConfig(config *Config, initial bool) error {
1250 1251
 		server.name = config.Server.Name
1251 1252
 		server.nameCasefolded = casefoldedName
1252 1253
 	}
1253
-	server.networkName = config.Network.Name
1254 1254
 
1255 1255
 	server.configurableStateMutex.Lock()
1256
+	server.networkName = config.Network.Name
1256 1257
 	if config.Server.Password != "" {
1257 1258
 		server.password = config.Server.PasswordBytes()
1258 1259
 	} else {
1259 1260
 		server.password = nil
1260 1261
 	}
1261
-	server.configurableStateMutex.Unlock()
1262
-
1263 1262
 	// apply new WebIRC command restrictions
1264 1263
 	server.webirc = config.Server.WebIRC
1265
-
1266 1264
 	// apply new PROXY command restrictions
1267 1265
 	server.proxyAllowedFrom = config.Server.ProxyAllowedFrom
1266
+	server.recoverFromErrors = true
1267
+	if config.Debug.RecoverFromErrors != nil {
1268
+		server.recoverFromErrors = *config.Debug.RecoverFromErrors
1269
+	}
1270
+	server.configurableStateMutex.Unlock()
1268 1271
 
1269 1272
 	err = server.connectionLimiter.ApplyConfig(config.Server.ConnectionLimiter)
1270 1273
 	if err != nil {

+ 8
- 0
oragono.yaml Целия файл

@@ -267,6 +267,14 @@ logging:
267 267
 
268 268
 # debug options
269 269
 debug:
270
+    # when enabled, oragono will attempt to recover from certain kinds of
271
+    # client-triggered runtime errors that would normally crash the server.
272
+    # this makes the server more resilient to DoS, but could result in incorrect
273
+    # behavior. deployments that would prefer to "start from scratch", e.g., by
274
+    # letting the process crash and auto-restarting it with systemd, can set
275
+    # this to false.
276
+    recover-from-errors: true
277
+
270 278
     # enabling StackImpact profiling
271 279
     stackimpact:
272 280
         # whether to use StackImpact

Loading…
Отказ
Запис