You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							106 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							106 lines
						
					
					
						
							2.4 KiB
						
					
					
				
								package mount
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"errors"
							 | 
						|
									"fmt"
							 | 
						|
									"path/filepath"
							 | 
						|
									"time"
							 | 
						|
								
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/filer"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/glog"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/mount/meta_cache"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/util"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								func (wfs *WFS) subscribeFilerConfEvents() (*meta_cache.MetadataFollower, error) {
							 | 
						|
									confDir := filer.DirectoryEtcSeaweedFS
							 | 
						|
									confName := filer.FilerConfName
							 | 
						|
									confFullName := filepath.Join(filer.DirectoryEtcSeaweedFS, filer.FilerConfName)
							 | 
						|
								
							 | 
						|
									// read current conf
							 | 
						|
									err := wfs.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error {
							 | 
						|
										content, err := filer.ReadInsideFiler(client, confDir, confName)
							 | 
						|
										if err != nil {
							 | 
						|
											return err
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										fc := filer.NewFilerConf()
							 | 
						|
										if len(content) > 0 {
							 | 
						|
											if err := fc.LoadFromBytes(content); err != nil {
							 | 
						|
												return fmt.Errorf("parse %s: %v", confFullName, err)
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										wfs.FilerConf = fc
							 | 
						|
								
							 | 
						|
										return nil
							 | 
						|
									})
							 | 
						|
									if err != nil {
							 | 
						|
										if errors.Is(err, filer_pb.ErrNotFound) {
							 | 
						|
											glog.V(0).Infof("fuse filer conf %s not found", confFullName)
							 | 
						|
										} else {
							 | 
						|
											return nil, err
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									processEventFn := func(resp *filer_pb.SubscribeMetadataResponse) error {
							 | 
						|
										message := resp.EventNotification
							 | 
						|
										if message.NewEntry == nil {
							 | 
						|
											return nil
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										dir := resp.Directory
							 | 
						|
										name := resp.EventNotification.NewEntry.Name
							 | 
						|
								
							 | 
						|
										if dir != confDir || name != confName {
							 | 
						|
											return nil
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										content := message.NewEntry.Content
							 | 
						|
										fc := filer.NewFilerConf()
							 | 
						|
										if len(content) > 0 {
							 | 
						|
											if err = fc.LoadFromBytes(content); err != nil {
							 | 
						|
												return fmt.Errorf("parse %s: %v", confFullName, err)
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										wfs.FilerConf = fc
							 | 
						|
								
							 | 
						|
										return nil
							 | 
						|
									}
							 | 
						|
									return &meta_cache.MetadataFollower{
							 | 
						|
										PathPrefixToWatch: confFullName,
							 | 
						|
										ProcessEventFn:    processEventFn,
							 | 
						|
									}, nil
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (wfs *WFS) wormEnforcedForEntry(path util.FullPath, entry *filer_pb.Entry) (wormEnforced, wormEnabled bool) {
							 | 
						|
									if entry == nil || wfs.FilerConf == nil {
							 | 
						|
										return false, false
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									rule := wfs.FilerConf.MatchStorageRule(string(path))
							 | 
						|
									if !rule.Worm {
							 | 
						|
										return false, false
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// worm is not enforced
							 | 
						|
									if entry.WormEnforcedAtTsNs == 0 {
							 | 
						|
										return false, true
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// worm will never expire
							 | 
						|
									if rule.WormRetentionTimeSeconds == 0 {
							 | 
						|
										return true, true
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									enforcedAt := time.Unix(0, entry.WormEnforcedAtTsNs)
							 | 
						|
								
							 | 
						|
									// worm is expired
							 | 
						|
									if time.Now().Sub(enforcedAt).Seconds() >= float64(rule.WormRetentionTimeSeconds) {
							 | 
						|
										return false, true
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									return true, true
							 | 
						|
								}
							 |