Worker set its working directory (#8461)
* set working directory * consolidate to worker directory * working directory * correct directory name * refactoring to use wildcard matcher * simplify * cleaning ec working directory * fix reference * clean * adjust test
This commit is contained in:
@@ -728,6 +728,7 @@ func saveMiniConfiguration(dataFolder string) error {
|
||||
}
|
||||
|
||||
func runMini(cmd *Command, args []string) bool {
|
||||
*miniDataFolders = util.ResolvePath(*miniDataFolders)
|
||||
|
||||
// Capture which port flags were explicitly passed on CLI BEFORE config file is applied
|
||||
// This is necessary to distinguish user-specified ports from defaults or config file options
|
||||
@@ -1030,9 +1031,15 @@ func startMiniAdminWithWorker(allServicesReady chan struct{}) {
|
||||
glog.Fatalf("Admin server readiness check failed: %v", err)
|
||||
}
|
||||
|
||||
// Start worker after admin server is ready
|
||||
startMiniWorker()
|
||||
startMiniPluginWorker(ctx)
|
||||
// Start consolidated worker runtime (both standard and plugin runtimes)
|
||||
workerDir := filepath.Join(*miniDataFolders, "worker")
|
||||
if err := os.MkdirAll(workerDir, 0755); err != nil {
|
||||
glog.Fatalf("Failed to create unified worker directory: %v", err)
|
||||
}
|
||||
|
||||
glog.Infof("Starting consolidated maintenance worker system (directory: %s)", workerDir)
|
||||
startMiniWorker(workerDir)
|
||||
startMiniPluginWorker(ctx, workerDir)
|
||||
|
||||
// Wait for worker to be ready by polling its gRPC port
|
||||
workerGrpcAddr := fmt.Sprintf("%s:%d", bindIp, *miniAdminOptions.grpcPort)
|
||||
@@ -1091,17 +1098,13 @@ func waitForWorkerReady(workerGrpcAddr string) {
|
||||
}
|
||||
|
||||
// startMiniWorker starts a single worker for the admin server
|
||||
func startMiniWorker() {
|
||||
glog.Infof("Starting maintenance worker for admin server")
|
||||
func startMiniWorker(workerDir string) {
|
||||
glog.V(1).Infof("Initializing standard worker runtime")
|
||||
|
||||
adminAddr := fmt.Sprintf("%s:%d", *miniIp, *miniAdminOptions.port)
|
||||
capabilities := "vacuum,ec,balance"
|
||||
|
||||
// Use worker directory under main data folder
|
||||
workerDir := filepath.Join(*miniDataFolders, "worker")
|
||||
if err := os.MkdirAll(workerDir, 0755); err != nil {
|
||||
glog.Fatalf("Failed to create worker directory: %v", err)
|
||||
}
|
||||
// Use common worker directory
|
||||
|
||||
glog.Infof("Worker connecting to admin server: %s", adminAddr)
|
||||
glog.Infof("Worker capabilities: %s", capabilities)
|
||||
@@ -1170,7 +1173,7 @@ func startMiniWorker() {
|
||||
glog.Infof("Maintenance worker %s started successfully", workerInstance.ID())
|
||||
}
|
||||
|
||||
func startMiniPluginWorker(ctx context.Context) {
|
||||
func startMiniPluginWorker(ctx context.Context, workerDir string) {
|
||||
glog.Infof("Starting plugin worker for admin server")
|
||||
|
||||
adminAddr := fmt.Sprintf("%s:%d", *miniIp, *miniAdminOptions.port)
|
||||
@@ -1179,10 +1182,7 @@ func startMiniPluginWorker(ctx context.Context) {
|
||||
glog.Infof("Resolved mini plugin worker admin endpoint: %s -> %s", adminAddr, resolvedAdminAddr)
|
||||
}
|
||||
|
||||
workerDir := filepath.Join(*miniDataFolders, "plugin_worker")
|
||||
if err := os.MkdirAll(workerDir, 0755); err != nil {
|
||||
glog.Fatalf("Failed to create plugin worker directory: %v", err)
|
||||
}
|
||||
// Use common worker directory
|
||||
|
||||
util.LoadConfiguration("security", false)
|
||||
grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.worker")
|
||||
|
||||
@@ -153,11 +153,11 @@ func TestResolvePluginWorkerID(t *testing.T) {
|
||||
if generated == "" {
|
||||
t.Fatalf("expected generated id")
|
||||
}
|
||||
if len(generated) < 7 || generated[:7] != "plugin-" {
|
||||
t.Fatalf("expected generated id prefix plugin-, got %q", generated)
|
||||
if len(generated) < 2 || generated[:2] != "w-" {
|
||||
t.Fatalf("expected generated id prefix w-, got %q", generated)
|
||||
}
|
||||
|
||||
persistedPath := filepath.Join(dir, "plugin.worker.id")
|
||||
persistedPath := filepath.Join(dir, "worker.id")
|
||||
if _, statErr := os.Stat(persistedPath); statErr != nil {
|
||||
t.Fatalf("expected persisted worker id file: %v", statErr)
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ heartbeat/load reporting, detection, and execution.
|
||||
|
||||
Behavior:
|
||||
- Use -jobType to choose one or more plugin job handlers (comma-separated list)
|
||||
- Use -workingDir to persist plugin.worker.id for stable worker identity across restarts
|
||||
- Use -workingDir to persist worker.id for stable worker identity across restarts
|
||||
- Use -metricsPort/-metricsIp to expose /health, /ready, and /metrics
|
||||
|
||||
Examples:
|
||||
|
||||
@@ -7,7 +7,6 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
@@ -20,6 +19,7 @@ import (
|
||||
statsCollect "github.com/seaweedfs/seaweedfs/weed/stats"
|
||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||
"github.com/seaweedfs/seaweedfs/weed/util/version"
|
||||
"github.com/seaweedfs/seaweedfs/weed/worker"
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
@@ -130,31 +130,11 @@ func runPluginWorkerWithOptions(options pluginWorkerRunOptions) bool {
|
||||
}
|
||||
|
||||
func resolvePluginWorkerID(explicitID string, workingDir string) (string, error) {
|
||||
id := strings.TrimSpace(explicitID)
|
||||
if id != "" {
|
||||
return id, nil
|
||||
if explicitID != "" {
|
||||
return explicitID, nil
|
||||
}
|
||||
|
||||
workingDir = strings.TrimSpace(workingDir)
|
||||
if workingDir == "" {
|
||||
return "", nil
|
||||
}
|
||||
if err := os.MkdirAll(workingDir, 0755); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
workerIDPath := filepath.Join(workingDir, "plugin.worker.id")
|
||||
if data, err := os.ReadFile(workerIDPath); err == nil {
|
||||
if persisted := strings.TrimSpace(string(data)); persisted != "" {
|
||||
return persisted, nil
|
||||
}
|
||||
}
|
||||
|
||||
generated := fmt.Sprintf("plugin-%d", time.Now().UnixNano())
|
||||
if err := os.WriteFile(workerIDPath, []byte(generated+"\n"), 0644); err != nil {
|
||||
return "", err
|
||||
}
|
||||
return generated, nil
|
||||
// Use the same ID generation/loading logic as the standard worker
|
||||
return worker.GenerateOrLoadWorkerID(workingDir)
|
||||
}
|
||||
|
||||
// buildPluginWorkerHandler constructs the JobHandler for the given job type.
|
||||
|
||||
Reference in New Issue
Block a user