|
8 | 8 | "NodePassDash/internal/tunnel" |
9 | 9 | "encoding/json" |
10 | 10 | "fmt" |
| 11 | + "strings" |
11 | 12 | "time" |
12 | 13 |
|
13 | 14 | "gorm.io/gorm" |
@@ -375,39 +376,59 @@ func (s *ServiceImpl) DissolveService(sid string) error { |
375 | 376 | // 清空客户端实例的 peer 信息 |
376 | 377 | if service.ClientInstanceId != nil && service.ClientEndpointId != nil { |
377 | 378 | if _, err := nodepass.UpdateInstancePeers(*service.ClientEndpointId, *service.ClientInstanceId, emptyPeer); err != nil { |
378 | | - return fmt.Errorf("清空客户端实例peer信息失败: %w", err) |
| 379 | + // 如果是404错误,说明实例已被删除,忽略该错误 |
| 380 | + if !strings.Contains(err.Error(), "404") { |
| 381 | + return fmt.Errorf("清空客户端实例peer信息失败: %w", err) |
| 382 | + } |
| 383 | + log.Warnf("[Service] 客户端实例不存在,可能已被删除: instanceID=%s, endpointID=%d", *service.ClientInstanceId, *service.ClientEndpointId) |
379 | 384 | } |
380 | 385 |
|
381 | 386 | // 清空数据库中客户端隧道的 peer 字段和 service_sid |
382 | 387 | // 使用 Updates 而不是 Update,以正确触发 JSON 序列化 |
| 388 | + // 如果隧道记录不存在(可能已被删除),Updates 不会报错,只是不更新任何记录 |
383 | 389 | if peerJSON, err := json.Marshal(emptyPeer); err == nil { |
384 | | - if err := s.db.Model(&models.Tunnel{}). |
| 390 | + result := s.db.Model(&models.Tunnel{}). |
385 | 391 | Where("instance_id = ?", *service.ClientInstanceId). |
386 | 392 | Updates(map[string]interface{}{ |
387 | 393 | "peer": string(peerJSON), |
388 | 394 | "service_sid": nil, // 清空 service_sid |
389 | | - }).Error; err != nil { |
390 | | - return fmt.Errorf("清空客户端隧道peer字段失败: %w", err) |
| 395 | + }) |
| 396 | + if result.Error != nil { |
| 397 | + return fmt.Errorf("清空客户端隧道peer字段失败: %w", result.Error) |
| 398 | + } |
| 399 | + // 如果没有更新任何记录,说明隧道可能已被删除,记录警告但不报错 |
| 400 | + if result.RowsAffected == 0 { |
| 401 | + log.Warnf("[Service] 客户端隧道记录不存在,可能已被删除: instanceID=%s", *service.ClientInstanceId) |
391 | 402 | } |
392 | 403 | } |
393 | 404 | } |
394 | 405 |
|
395 | 406 | // 清空服务端实例的 peer 信息(如果存在) |
396 | 407 | if service.ServerInstanceId != nil && service.ServerEndpointId != nil { |
397 | 408 | if _, err := nodepass.UpdateInstancePeers(*service.ServerEndpointId, *service.ServerInstanceId, emptyPeer); err != nil { |
398 | | - return fmt.Errorf("清空服务端实例peer信息失败: %w", err) |
| 409 | + // 如果是404错误,说明实例已被删除,忽略该错误 |
| 410 | + if !strings.Contains(err.Error(), "404") { |
| 411 | + return fmt.Errorf("清空服务端实例peer信息失败: %w", err) |
| 412 | + } |
| 413 | + log.Warnf("[Service] 服务端实例不存在,可能已被删除: instanceID=%s, endpointID=%d", *service.ServerInstanceId, *service.ServerEndpointId) |
399 | 414 | } |
400 | 415 |
|
401 | 416 | // 清空数据库中服务端隧道的 peer 字段和 service_sid |
402 | 417 | // 使用 Updates 而不是 Update,以正确触发 JSON 序列化 |
| 418 | + // 如果隧道记录不存在(可能已被删除),Updates 不会报错,只是不更新任何记录 |
403 | 419 | if peerJSON, err := json.Marshal(emptyPeer); err == nil { |
404 | | - if err := s.db.Model(&models.Tunnel{}). |
| 420 | + result := s.db.Model(&models.Tunnel{}). |
405 | 421 | Where("instance_id = ?", *service.ServerInstanceId). |
406 | 422 | Updates(map[string]interface{}{ |
407 | 423 | "peer": string(peerJSON), |
408 | 424 | "service_sid": nil, // 清空 service_sid |
409 | | - }).Error; err != nil { |
410 | | - return fmt.Errorf("清空服务端隧道peer字段失败: %w", err) |
| 425 | + }) |
| 426 | + if result.Error != nil { |
| 427 | + return fmt.Errorf("清空服务端隧道peer字段失败: %w", result.Error) |
| 428 | + } |
| 429 | + // 如果没有更新任何记录,说明隧道可能已被删除,记录警告但不报错 |
| 430 | + if result.RowsAffected == 0 { |
| 431 | + log.Warnf("[Service] 服务端隧道记录不存在,可能已被删除: instanceID=%s", *service.ServerInstanceId) |
411 | 432 | } |
412 | 433 | } |
413 | 434 | } |
|
0 commit comments