Files
d5e5400903 lisafs: Allow connections to have varying implementations.
Earlier, the lisafs package allowed programming varying server implementations.
However, it assumed that all connections on the same server have the same
implementation. In an effort to build custom filesystem gofer implementations,
it would be useful to run various implementations on the same server instance.
The server synchronizes concurrent RPCs on the same filesystem tree by
maintaining the entire filesystem tree in memory and holding server-side locks.
We would want to have these concurrency guarantees across different
implementations.

This change largely refactors all the implementation specificity from Server
to Connection. The lisafs wire protocol already encodes the supported message
list and the max message size per-mount on MountResp. So no wire protocol
changes needed. Hence this is completely backwards compatible and should not
lead to any change in behavior.

This is a precursor to a follow-up rework of #12950 that drops the multi-Server
fan-out and lets LisafsServer choose a per-mount ConnectionImpl that returns
the backend ControlFDImpl, all inside the single shared lisafs.Server.

Co-authored-by: Shayon Mukherjee <[email protected]>
PiperOrigin-RevId: 916313093
2026-05-15 20:53:35 -07:00

64 lines
1.8 KiB
Go

// Copyright 2021 The gVisor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package lisafs_test
import (
"testing"
"gvisor.dev/gvisor/pkg/lisafs"
"gvisor.dev/gvisor/pkg/lisafs/testsuite"
"gvisor.dev/gvisor/pkg/log"
"gvisor.dev/gvisor/runsc/fsgofer"
)
// Note that these are not supposed to be extensive or robust tests. These unit
// tests provide a sanity check that all RPCs at least work in obvious ways.
func init() {
log.SetLevel(log.Debug)
if err := fsgofer.OpenProcSelfFD("/proc/self/fd"); err != nil {
panic(err)
}
}
// tester implements testsuite.Tester.
type tester struct{}
// NewConnImpl implements testsuite.Tester.NewServer.
func (tester) NewConnImpl(t *testing.T) lisafs.ConnectionImpl {
return fsgofer.NewConnectionImpl(&fsgofer.Config{})
}
// LinkSupported implements testsuite.Tester.LinkSupported.
func (tester) LinkSupported() bool {
return true
}
// SetUserGroupIDSupported implements testsuite.Tester.SetUserGroupIDSupported.
func (tester) SetUserGroupIDSupported() bool {
return true
}
// BindSupported implements testsuite.Tester.BindSupported.
func (tester) BindSupported() bool {
// In some test environments, the mount path is really large and bind(2)
// fails with EINVAL if the path length >= 108.
return false
}
func TestFSGofer(t *testing.T) {
testsuite.RunAllLocalFSTests(t, tester{})
}