diff --git a/cmd/revad/grace/grace.go b/cmd/revad/grace/grace.go index 81b0759f84..8f2d3212af 100644 --- a/cmd/revad/grace/grace.go +++ b/cmd/revad/grace/grace.go @@ -220,7 +220,13 @@ func (w *Watcher) GetListeners(servers map[string]Server) (map[string]net.Listen // Do we abort running the forked child? Probably yes, as if the parent cannot be // killed that means we run two version of the code indefinitely. w.log.Info().Msgf("killing parent pid gracefully with SIGQUIT: %d", w.ppid) - err := syscall.Kill(w.ppid, syscall.SIGQUIT) + p, err := os.FindProcess(w.ppid) + if err != nil { + w.log.Error().Err(err).Msgf("error finding parent process with ppid:%d", w.ppid) + err = errors.Wrap(err, "error finding parent process") + return nil, err + } + err = p.Kill() if err != nil { w.log.Error().Err(err).Msgf("error killing parent process with ppid:%d", w.ppid) err = errors.Wrap(err, "error killing parent process") diff --git a/pkg/storage/fs/local/local.go b/pkg/storage/fs/local/local.go index 35defd5275..4f16a423b6 100644 --- a/pkg/storage/fs/local/local.go +++ b/pkg/storage/fs/local/local.go @@ -20,20 +20,16 @@ package local import ( "context" - "crypto/md5" - "encoding/binary" "fmt" "io" "io/ioutil" "os" "path" "strings" - "syscall" "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/storage/fs/registry" - "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/mime" "github.com/cs3org/reva/pkg/storage" "github.com/mitchellh/mapstructure" @@ -109,38 +105,6 @@ func (fs *localFS) removeRoot(np string) string { type localFS struct{ root string } -// calcEtag will create an etag based on the md5 of -// - mtime, -// - inode (if available), -// - device (if available) and -// - size. -// errors are logged, but an etag will still be returned -func calcEtag(ctx context.Context, fi os.FileInfo) string { - log := appctx.GetLogger(ctx) - h := md5.New() - err := binary.Write(h, binary.BigEndian, fi.ModTime().Unix()) - if err != nil { - log.Error().Err(err).Msg("error writing mtime") - } - stat, ok := fi.Sys().(*syscall.Stat_t) - if ok { - // take device and inode into account - err = binary.Write(h, binary.BigEndian, stat.Ino) - if err != nil { - log.Error().Err(err).Msg("error writing inode") - } - err = binary.Write(h, binary.BigEndian, stat.Dev) - if err != nil { - log.Error().Err(err).Msg("error writing device") - } - } - err = binary.Write(h, binary.BigEndian, fi.Size()) - if err != nil { - log.Error().Err(err).Msg("error writing size") - } - return fmt.Sprintf(`"%x"`, h.Sum(nil)) -} - func (fs *localFS) normalize(ctx context.Context, fi os.FileInfo, fn string) *storageproviderv0alphapb.ResourceInfo { fn = fs.removeRoot(path.Join("/", fn)) md := &storageproviderv0alphapb.ResourceInfo{ diff --git a/pkg/storage/fs/local/local_unix.go b/pkg/storage/fs/local/local_unix.go new file mode 100644 index 0000000000..0f1e57fc2a --- /dev/null +++ b/pkg/storage/fs/local/local_unix.go @@ -0,0 +1,64 @@ +// Copyright 2018-2019 CERN +// +// 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. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// +build linux + +package local + +import ( + "context" + "crypto/md5" + "encoding/binary" + "fmt" + "os" + "syscall" + + "github.com/cs3org/reva/pkg/appctx" +) + +// calcEtag will create an etag based on the md5 of +// - mtime, +// - inode (if available), +// - device (if available) and +// - size. +// errors are logged, but an etag will still be returned +func calcEtag(ctx context.Context, fi os.FileInfo) string { + log := appctx.GetLogger(ctx) + h := md5.New() + err := binary.Write(h, binary.BigEndian, fi.ModTime().Unix()) + if err != nil { + log.Error().Err(err).Msg("error writing mtime") + } + stat, ok := fi.Sys().(*syscall.Stat_t) + if ok { + // take device and inode into account + err = binary.Write(h, binary.BigEndian, stat.Ino) + if err != nil { + log.Error().Err(err).Msg("error writing inode") + } + err = binary.Write(h, binary.BigEndian, stat.Dev) + if err != nil { + log.Error().Err(err).Msg("error writing device") + } + } + err = binary.Write(h, binary.BigEndian, fi.Size()) + if err != nil { + log.Error().Err(err).Msg("error writing size") + } + return fmt.Sprintf(`"%x"`, h.Sum(nil)) +} diff --git a/pkg/storage/fs/local/local_windows.go b/pkg/storage/fs/local/local_windows.go new file mode 100644 index 0000000000..5c0bb73812 --- /dev/null +++ b/pkg/storage/fs/local/local_windows.go @@ -0,0 +1,52 @@ +// Copyright 2018-2019 CERN +// +// 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. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// +build windows + +package local + +import ( + "context" + "crypto/md5" + "encoding/binary" + "fmt" + "os" + + "github.com/cs3org/reva/pkg/appctx" +) + +// calcEtag will create an etag based on the md5 of +// - mtime, +// - inode (if available), +// - device (if available) and +// - size. +// errors are logged, but an etag will still be returned +func calcEtag(ctx context.Context, fi os.FileInfo) string { + log := appctx.GetLogger(ctx) + h := md5.New() + err := binary.Write(h, binary.BigEndian, fi.ModTime().Unix()) + if err != nil { + log.Error().Err(err).Msg("error writing mtime") + } + // device and inode hale no meaning on windows + err = binary.Write(h, binary.BigEndian, fi.Size()) + if err != nil { + log.Error().Err(err).Msg("error writing size") + } + return fmt.Sprintf(`"%x"`, h.Sum(nil)) +}