@@ -81,28 +81,25 @@ func (f *FDB) Start(ctx context.Context) error {
8181 }
8282 f .db = db
8383
84- etcd , err := directory .CreateOrOpen (db , []string {f .dirName }, nil )
85- if err != nil {
84+ if err = f .openDirectory (); err != nil {
8685 return err
8786 }
88- f .dir = etcd
8987
9088 if CleanDirOnStart {
91- _ , err = db . Transact ( func (tr fdb.Transaction ) (ret interface {}, e error ) {
92- tr .ClearRange (etcd )
93- return
89+ _ , err = transact ( db , 0 , func (tr fdb.Transaction ) (interface {}, error ) {
90+ tr .ClearRange (f . dir )
91+ return 0 , nil
9492 })
93+ if err != nil {
94+ return err
95+ }
9596 }
9697
97- if err != nil {
98- return err
99- }
100-
101- f .byRevision = CreateByRevisionSubspace (etcd )
102- f .byKeyAndRevision = CreateByKeyRevisionSubspace (etcd )
103- f .watch = CreateWatchSubspace (etcd )
104- f .compactRev = CreateCompactRevisionSubspace (etcd )
105- f .rev = CreateRevisionSubspace (etcd )
98+ f .byRevision = CreateByRevisionSubspace (f .dir )
99+ f .byKeyAndRevision = CreateByKeyRevisionSubspace (f .dir )
100+ f .watch = CreateWatchSubspace (f .dir )
101+ f .compactRev = CreateCompactRevisionSubspace (f .dir )
102+ f .rev = CreateRevisionSubspace (f .dir )
106103
107104 // https://github.com/kubernetes/kubernetes/blob/442a69c3bdf6fe8e525b05887e57d89db1e2f3a5/staging/src/k8s.io/apiserver/pkg/storage/storagebackend/factory/etcd3.go#L97
108105 if ! APITest {
@@ -118,6 +115,28 @@ func (f *FDB) Start(ctx context.Context) error {
118115 return nil
119116}
120117
118+ // The FDB operations intentionally retry forever and there is no explicit way to timeout directory opening.
119+ // https://forums.foundationdb.org/t/golang-fdb-mustopendefault-does-not-fail-when-fdb-cluster-content-points-to-invalid-host/715/2
120+ // Wrapping directory opening in a goroutine.
121+ func (f * FDB ) openDirectory () error {
122+ errCh := make (chan error , 1 )
123+ go func () {
124+ dir , err := directory .CreateOrOpen (f .db , []string {f .dirName }, nil )
125+ f .dir = dir
126+ errCh <- err
127+ }()
128+
129+ select {
130+ case err := <- errCh :
131+ if err != nil {
132+ return err
133+ }
134+ case <- time .After (transactionTimeout ):
135+ return errors .New ("directory creation timed out" )
136+ }
137+ return nil
138+ }
139+
121140// https://apple.github.io/foundationdb/tls.html#configuring-tls
122141func (f * FDB ) setTLSConfig () error {
123142 if f .tlsConfig .CertFile != "" {
0 commit comments