// WithContext adds app- and request-specific values to the context. // It is called by FUSE for normal runs, but may be called explicitly // in other settings, such as tests. func (f *FS) WithContext(ctx context.Context) context.Context { ctx = context.WithValue(ctx, CtxAppIDKey, f) logTags := make(logger.CtxLogTags) logTags[CtxIDKey] = CtxOpID ctx = logger.NewContextWithLogTags(ctx, logTags) // Add a unique ID to this context, identifying a particular // request. id, err := libkbfs.MakeRandomRequestID() if err != nil { f.log.Errorf("Couldn't make request ID: %v", err) } else { ctx = context.WithValue(ctx, CtxIDKey, id) } if runtime.GOOS == "darwin" { // Timeout operations before they hit the osxfuse time limit, // so we don't hose the entire mount (Fixed in OSXFUSE 3.2.0). // The timeout is 60 seconds, but it looks like sometimes it // tries multiple attempts within that 60 seconds, so let's go // a little under 60/3 to be safe. // // It should be safe to ignore the CancelFunc here because our // parent context will be canceled by the FUSE serve loop. ctx, _ = context.WithTimeout(ctx, 19*time.Second) } return ctx }
// NewContextWithOpID adds a unique ID to this context, identifying // a particular request. func NewContextWithOpID(ctx context.Context, log logger.Logger) context.Context { if runtime.GOOS == "darwin" { // Timeout operations before they hit the osxfuse time limit, // so we don't hose the entire mount. The timeout is 60 // seconds, but it looks like sometimes it tries multiple // attempts within that 60 seconds, so let's go a little under // 60/3 to be safe. ctx, _ = context.WithTimeout(ctx, 19*time.Second) } id, err := libkbfs.MakeRandomRequestID() if err != nil { log.Errorf("Couldn't make request ID: %v", err) return ctx } return context.WithValue(ctx, CtxIDKey, id) }