Compare commits
13 Commits
v17.06.0-c
...
v17.06.0-c
| Author | SHA1 | Date | |
|---|---|---|---|
| 29fcd5dfae | |||
| 9600fb4e78 | |||
| 0f80f28c1a | |||
| 29e7f7b8c9 | |||
| 4c2cf22362 | |||
| afcb08cfb0 | |||
| 46a9d6b041 | |||
| b8c7116a23 | |||
| b089783b38 | |||
| 605ffe91cf | |||
| eb837fd7bc | |||
| 475c218fd7 | |||
| f2eb8b825b |
@ -1 +1 @@
|
||||
17.06.0-ce-rc3
|
||||
17.06.0-ce-rc4
|
||||
|
||||
@ -1 +1 @@
|
||||
17.06.0-ce-rc3
|
||||
17.06.0-ce-rc4
|
||||
|
||||
@ -7,6 +7,7 @@ import (
|
||||
"golang.org/x/net/context"
|
||||
|
||||
"github.com/Sirupsen/logrus"
|
||||
"github.com/docker/docker/pkg/pools"
|
||||
"github.com/docker/docker/pkg/promise"
|
||||
"github.com/docker/docker/pkg/term"
|
||||
)
|
||||
@ -86,7 +87,7 @@ func (c *Config) CopyStreams(ctx context.Context, cfg *AttachConfig) chan error
|
||||
if cfg.TTY {
|
||||
_, err = copyEscapable(cfg.CStdin, cfg.Stdin, cfg.DetachKeys)
|
||||
} else {
|
||||
_, err = io.Copy(cfg.CStdin, cfg.Stdin)
|
||||
_, err = pools.Copy(cfg.CStdin, cfg.Stdin)
|
||||
}
|
||||
if err == io.ErrClosedPipe {
|
||||
err = nil
|
||||
@ -116,7 +117,7 @@ func (c *Config) CopyStreams(ctx context.Context, cfg *AttachConfig) chan error
|
||||
}
|
||||
|
||||
logrus.Debugf("attach: %s: begin", name)
|
||||
_, err := io.Copy(stream, streamPipe)
|
||||
_, err := pools.Copy(stream, streamPipe)
|
||||
if err == io.ErrClosedPipe {
|
||||
err = nil
|
||||
}
|
||||
@ -174,5 +175,5 @@ func copyEscapable(dst io.Writer, src io.ReadCloser, keys []byte) (written int64
|
||||
pr := term.NewEscapeProxy(src, keys)
|
||||
defer src.Close()
|
||||
|
||||
return io.Copy(dst, pr)
|
||||
return pools.Copy(dst, pr)
|
||||
}
|
||||
|
||||
@ -17,15 +17,16 @@ import (
|
||||
"github.com/docker/docker/pkg/ioutils"
|
||||
)
|
||||
|
||||
const buffer32K = 32 * 1024
|
||||
|
||||
var (
|
||||
// BufioReader32KPool is a pool which returns bufio.Reader with a 32K buffer.
|
||||
BufioReader32KPool = newBufioReaderPoolWithSize(buffer32K)
|
||||
// BufioWriter32KPool is a pool which returns bufio.Writer with a 32K buffer.
|
||||
BufioWriter32KPool = newBufioWriterPoolWithSize(buffer32K)
|
||||
buffer32KPool = newBufferPoolWithSize(buffer32K)
|
||||
)
|
||||
|
||||
const buffer32K = 32 * 1024
|
||||
|
||||
// BufioReaderPool is a bufio reader that uses sync.Pool.
|
||||
type BufioReaderPool struct {
|
||||
pool sync.Pool
|
||||
@ -54,11 +55,31 @@ func (bufPool *BufioReaderPool) Put(b *bufio.Reader) {
|
||||
bufPool.pool.Put(b)
|
||||
}
|
||||
|
||||
type bufferPool struct {
|
||||
pool sync.Pool
|
||||
}
|
||||
|
||||
func newBufferPoolWithSize(size int) *bufferPool {
|
||||
return &bufferPool{
|
||||
pool: sync.Pool{
|
||||
New: func() interface{} { return make([]byte, size) },
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (bp *bufferPool) Get() []byte {
|
||||
return bp.pool.Get().([]byte)
|
||||
}
|
||||
|
||||
func (bp *bufferPool) Put(b []byte) {
|
||||
bp.pool.Put(b)
|
||||
}
|
||||
|
||||
// Copy is a convenience wrapper which uses a buffer to avoid allocation in io.Copy.
|
||||
func Copy(dst io.Writer, src io.Reader) (written int64, err error) {
|
||||
buf := BufioReader32KPool.Get(src)
|
||||
written, err = io.Copy(dst, buf)
|
||||
BufioReader32KPool.Put(buf)
|
||||
buf := buffer32KPool.Get()
|
||||
written, err = io.CopyBuffer(dst, src, buf)
|
||||
buffer32KPool.Put(buf)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@ -159,3 +159,8 @@ func TestNewWriteCloserWrapperWithAWriteCloser(t *testing.T) {
|
||||
t.Fatalf("The ReaderCloser should have been closed, it is not.")
|
||||
}
|
||||
}
|
||||
|
||||
func TestBufferPoolPutAndGet(t *testing.T) {
|
||||
buf := buffer32KPool.Get()
|
||||
buffer32KPool.Put(buf)
|
||||
}
|
||||
|
||||
@ -107,7 +107,7 @@ github.com/containerd/containerd cfb82a876ecc11b5ca0977d1733adbe58599088a
|
||||
github.com/tonistiigi/fifo 1405643975692217d6720f8b54aeee1bf2cd5cf4
|
||||
|
||||
# cluster
|
||||
github.com/docker/swarmkit 6083c7689ed00a6f2d67941443603df69c2ff6ba
|
||||
github.com/docker/swarmkit bf9b892c0b27bb3e13195bcef4d964fce2987bf1
|
||||
github.com/gogo/protobuf v0.4
|
||||
github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a
|
||||
github.com/google/certificate-transparency d90e65c3a07988180c5b1ece71791c0b6506826e
|
||||
|
||||
@ -152,6 +152,10 @@ func (na *NetworkAllocator) Allocate(n *api.Network) error {
|
||||
n.DriverState = &api.Driver{
|
||||
Name: d.name,
|
||||
}
|
||||
// In order to support backward compatibility with older daemon
|
||||
// versions which assumes the network attachment to contains
|
||||
// non nil IPAM attribute, passing an empty object
|
||||
n.IPAM = &api.IPAMOptions{Driver: &api.Driver{}}
|
||||
} else {
|
||||
nw.pools, err = na.allocatePools(n)
|
||||
if err != nil {
|
||||
|
||||
15
components/engine/vendor/github.com/docker/swarmkit/manager/manager.go
generated
vendored
15
components/engine/vendor/github.com/docker/swarmkit/manager/manager.go
generated
vendored
@ -945,18 +945,19 @@ func (m *Manager) becomeLeader(ctx context.Context) {
|
||||
if err := store.CreateNetwork(tx, newIngressNetwork()); err != nil {
|
||||
log.G(ctx).WithError(err).Error("failed to create default ingress network")
|
||||
}
|
||||
// Create now the static predefined node-local networks which
|
||||
// are known to be present in each cluster node. This is needed
|
||||
// in order to allow running services on the predefined docker
|
||||
// networks like `bridge` and `host`.
|
||||
log.G(ctx).Info("Creating node-local predefined networks")
|
||||
for _, p := range networkallocator.PredefinedNetworks() {
|
||||
}
|
||||
// Create now the static predefined if the store does not contain predefined
|
||||
//networks like bridge/host node-local networks which
|
||||
// are known to be present in each cluster node. This is needed
|
||||
// in order to allow running services on the predefined docker
|
||||
// networks like `bridge` and `host`.
|
||||
for _, p := range networkallocator.PredefinedNetworks() {
|
||||
if store.GetNetwork(tx, p.Name) == nil {
|
||||
if err := store.CreateNetwork(tx, newPredefinedNetwork(p.Name, p.Driver)); err != nil {
|
||||
log.G(ctx).WithError(err).Error("failed to create predefined network " + p.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
|
||||
@ -31,6 +31,7 @@ ubuntu-xenial: ## build ubuntu xenial deb packages
|
||||
-v $(CURDIR)/debbuild/$@:/build \
|
||||
-v $(ENGINE_DIR):/engine \
|
||||
-v $(CLI_DIR):/cli \
|
||||
-v $(CURDIR)/systemd:/root/build-deb/systemd \
|
||||
debbuild-$@/$(ARCH)
|
||||
$(CHOWN) -R $(shell id -u):$(shell id -g) debbuild/$@
|
||||
|
||||
@ -42,6 +43,7 @@ ubuntu-trusty: ## build ubuntu trusty deb packages
|
||||
-v $(CURDIR)/debbuild/$@:/build \
|
||||
-v $(ENGINE_DIR):/engine \
|
||||
-v $(CLI_DIR):/cli \
|
||||
-v $(CURDIR)/systemd:/root/build-deb/systemd \
|
||||
debbuild-$@/$(ARCH)
|
||||
$(CHOWN) -R $(shell id -u):$(shell id -g) debbuild/$@
|
||||
|
||||
@ -53,6 +55,7 @@ ubuntu-yakkety: ## build ubuntu yakkety deb packages
|
||||
-v $(CURDIR)/debbuild/$@:/build \
|
||||
-v $(ENGINE_DIR):/engine \
|
||||
-v $(CLI_DIR):/cli \
|
||||
-v $(CURDIR)/systemd:/root/build-deb/systemd \
|
||||
debbuild-$@/$(ARCH)
|
||||
$(CHOWN) -R $(shell id -u):$(shell id -g) debbuild/$@
|
||||
|
||||
@ -64,6 +67,7 @@ ubuntu-zesty: ## build ubuntu zesty deb packages
|
||||
-v $(CURDIR)/debbuild/$@:/build \
|
||||
-v $(ENGINE_DIR):/engine \
|
||||
-v $(CLI_DIR):/cli \
|
||||
-v $(CURDIR)/systemd:/root/build-deb/systemd \
|
||||
debbuild-$@/$(ARCH)
|
||||
$(CHOWN) -R $(shell id -u):$(shell id -g) debbuild/$@
|
||||
|
||||
@ -75,6 +79,7 @@ debian-jessie: ## build debian jessie deb packages
|
||||
-v $(CURDIR)/debbuild/$@:/build \
|
||||
-v $(ENGINE_DIR):/engine \
|
||||
-v $(CLI_DIR):/cli \
|
||||
-v $(CURDIR)/systemd:/root/build-deb/systemd \
|
||||
debbuild-$@/$(ARCH)
|
||||
$(CHOWN) -R $(shell id -u):$(shell id -g) debbuild/$@
|
||||
|
||||
@ -86,6 +91,7 @@ debian-stretch: ## build debian stretch deb packages
|
||||
-v $(CURDIR)/debbuild/$@:/build \
|
||||
-v $(ENGINE_DIR):/engine \
|
||||
-v $(CLI_DIR):/cli \
|
||||
-v $(CURDIR)/systemd:/root/build-deb/systemd \
|
||||
debbuild-$@/$(ARCH)
|
||||
$(CHOWN) -R $(shell id -u):$(shell id -g) debbuild/$@
|
||||
|
||||
@ -97,5 +103,6 @@ debian-wheezy: ## build debian wheezy deb packages
|
||||
-v $(CURDIR)/debbuild/$@:/build \
|
||||
-v $(ENGINE_DIR):/engine \
|
||||
-v $(CLI_DIR):/cli \
|
||||
-v $(CURDIR)/systemd:/root/build-deb/systemd \
|
||||
debbuild-$@/$(ARCH)
|
||||
$(CHOWN) -R $(shell id -u):$(shell id -g) debbuild/$@
|
||||
|
||||
@ -5,8 +5,8 @@ engine/contrib/*-integration usr/share/docker-ce/contrib/
|
||||
engine/contrib/check-config.sh usr/share/docker-ce/contrib/
|
||||
engine/contrib/completion/fish/docker.fish usr/share/fish/vendor_completions.d/
|
||||
engine/contrib/completion/zsh/_docker usr/share/zsh/vendor-completions/
|
||||
engine/contrib/init/systemd/docker.service lib/systemd/system/
|
||||
engine/contrib/init/systemd/docker.socket lib/systemd/system/
|
||||
systemd/docker.service lib/systemd/system/
|
||||
systemd/docker.socket lib/systemd/system/
|
||||
engine/contrib/mk* usr/share/docker-ce/contrib/
|
||||
engine/contrib/nuke-graph-directory.sh usr/share/docker-ce/contrib/
|
||||
engine/contrib/syntax/nano/Dockerfile.nanorc usr/share/nano/
|
||||
|
||||
34
components/packaging/deb/systemd/docker.service
Normal file
34
components/packaging/deb/systemd/docker.service
Normal file
@ -0,0 +1,34 @@
|
||||
[Unit]
|
||||
Description=Docker Application Container Engine
|
||||
Documentation=https://docs.docker.com
|
||||
After=network-online.target docker.socket firewalld.service
|
||||
Wants=network-online.target
|
||||
Requires=docker.socket
|
||||
|
||||
[Service]
|
||||
Type=notify
|
||||
# the default is not to use systemd for cgroups because the delegate issues still
|
||||
# exists and systemd currently does not support the cgroup feature set required
|
||||
# for containers run by docker
|
||||
ExecStart=/usr/bin/dockerd -H fd://
|
||||
ExecReload=/bin/kill -s HUP $MAINPID
|
||||
LimitNOFILE=1048576
|
||||
# Having non-zero Limit*s causes performance problems due to accounting overhead
|
||||
# in the kernel. We recommend using cgroups to do container-local accounting.
|
||||
LimitNPROC=infinity
|
||||
LimitCORE=infinity
|
||||
# Uncomment TasksMax if your systemd version supports it.
|
||||
# Only systemd 226 and above support this version.
|
||||
#TasksMax=infinity
|
||||
TimeoutStartSec=0
|
||||
# set delegate yes so that systemd does not reset the cgroups of docker containers
|
||||
Delegate=yes
|
||||
# kill only the docker process, not all processes in the cgroup
|
||||
KillMode=process
|
||||
# restart the docker process if it exits prematurely
|
||||
Restart=on-failure
|
||||
StartLimitBurst=3
|
||||
StartLimitInterval=60s
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
12
components/packaging/deb/systemd/docker.socket
Normal file
12
components/packaging/deb/systemd/docker.socket
Normal file
@ -0,0 +1,12 @@
|
||||
[Unit]
|
||||
Description=Docker Socket for the API
|
||||
PartOf=docker.service
|
||||
|
||||
[Socket]
|
||||
ListenStream=/var/run/docker.sock
|
||||
SocketMode=0660
|
||||
SocketUser=root
|
||||
SocketGroup=docker
|
||||
|
||||
[Install]
|
||||
WantedBy=sockets.target
|
||||
@ -11,7 +11,8 @@ RPMBUILD=docker run --privileged --rm -i \
|
||||
-v $(CURDIR)/rpmbuild/BUILD:/root/rpmbuild/BUILD \
|
||||
-v $(CURDIR)/rpmbuild/BUILDROOT:/root/rpmbuild/BUILDROOT \
|
||||
-v $(CURDIR)/rpmbuild/RPMS:/root/rpmbuild/RPMS \
|
||||
-v $(CURDIR)/rpmbuild/SRPMS:/root/rpmbuild/SRPMS
|
||||
-v $(CURDIR)/rpmbuild/SRPMS:/root/rpmbuild/SRPMS \
|
||||
-v $(CURDIR)/systemd:/systemd
|
||||
RPMBUILD_FLAGS=-ba\
|
||||
--define '_gitcommit $(word 3,$(GEN_RPM_VER))' \
|
||||
--define '_release $(word 2,$(GEN_RPM_VER))' \
|
||||
|
||||
@ -95,7 +95,7 @@ install -p -m 644 engine/contrib/udev/80-docker.rules $RPM_BUILD_ROOT/%{_sysconf
|
||||
install -d $RPM_BUILD_ROOT/etc/sysconfig
|
||||
install -d $RPM_BUILD_ROOT/%{_initddir}
|
||||
install -d $RPM_BUILD_ROOT/%{_unitdir}
|
||||
install -p -m 644 engine/contrib/init/systemd/docker.service.rpm $RPM_BUILD_ROOT/%{_unitdir}/docker.service
|
||||
install -p -m 644 /systemd/docker.service $RPM_BUILD_ROOT/%{_unitdir}/docker.service
|
||||
# add bash, zsh, and fish completions
|
||||
install -d $RPM_BUILD_ROOT/usr/share/bash-completion/completions
|
||||
install -d $RPM_BUILD_ROOT/usr/share/zsh/vendor-completions
|
||||
@ -163,5 +163,14 @@ fi
|
||||
|
||||
%changelog
|
||||
|
||||
* Wed May 10 2017 <andrewhsu@docker.com> 17.06.0-dev
|
||||
- Initial RPM release
|
||||
* Thu Jun 15 2017 <andrewhsu@docker.com> 17.06.0-ce-rc4
|
||||
- release docker-ce 17.06.0-ce-rc4
|
||||
|
||||
* Tue Jun 13 2017 <andrewhsu@docker.com> 17.06.0-ce-rc3
|
||||
- release docker-ce 17.06.0-ce-rc3
|
||||
|
||||
* Wed Jun 07 2017 <andrewhsu@docker.com> 17.06.0-ce-rc2
|
||||
- release docker-ce 17.06.0-ce-rc2
|
||||
|
||||
* Mon May 29 2017 <andrewhsu@docker.com> 17.06.0-ce-rc1
|
||||
- release docker-ce 17.06.0-ce-rc1
|
||||
|
||||
@ -95,7 +95,7 @@ install -p -m 644 engine/contrib/udev/80-docker.rules $RPM_BUILD_ROOT/%{_sysconf
|
||||
install -d $RPM_BUILD_ROOT/etc/sysconfig
|
||||
install -d $RPM_BUILD_ROOT/%{_initddir}
|
||||
install -d $RPM_BUILD_ROOT/%{_unitdir}
|
||||
install -p -m 644 engine/contrib/init/systemd/docker.service.rpm $RPM_BUILD_ROOT/%{_unitdir}/docker.service
|
||||
install -p -m 644 /systemd/docker.service $RPM_BUILD_ROOT/%{_unitdir}/docker.service
|
||||
# add bash, zsh, and fish completions
|
||||
install -d $RPM_BUILD_ROOT/usr/share/bash-completion/completions
|
||||
install -d $RPM_BUILD_ROOT/usr/share/zsh/vendor-completions
|
||||
@ -163,5 +163,14 @@ fi
|
||||
|
||||
%changelog
|
||||
|
||||
* Wed May 10 2017 <andrewhsu@docker.com> 17.06.0-dev
|
||||
- Initial RPM release
|
||||
* Thu Jun 15 2017 <andrewhsu@docker.com> 17.06.0-ce-rc4
|
||||
- release docker-ce 17.06.0-ce-rc4
|
||||
|
||||
* Tue Jun 13 2017 <andrewhsu@docker.com> 17.06.0-ce-rc3
|
||||
- release docker-ce 17.06.0-ce-rc3
|
||||
|
||||
* Wed Jun 07 2017 <andrewhsu@docker.com> 17.06.0-ce-rc2
|
||||
- release docker-ce 17.06.0-ce-rc2
|
||||
|
||||
* Mon May 29 2017 <andrewhsu@docker.com> 17.06.0-ce-rc1
|
||||
- release docker-ce 17.06.0-ce-rc1
|
||||
|
||||
@ -94,7 +94,7 @@ install -p -m 644 engine/contrib/udev/80-docker.rules $RPM_BUILD_ROOT/%{_sysconf
|
||||
install -d $RPM_BUILD_ROOT/etc/sysconfig
|
||||
install -d $RPM_BUILD_ROOT/%{_initddir}
|
||||
install -d $RPM_BUILD_ROOT/%{_unitdir}
|
||||
install -p -m 644 engine/contrib/init/systemd/docker.service.rpm $RPM_BUILD_ROOT/%{_unitdir}/docker.service
|
||||
install -p -m 644 /systemd/docker.service $RPM_BUILD_ROOT/%{_unitdir}/docker.service
|
||||
# add bash, zsh, and fish completions
|
||||
install -d $RPM_BUILD_ROOT/usr/share/bash-completion/completions
|
||||
install -d $RPM_BUILD_ROOT/usr/share/zsh/vendor-completions
|
||||
@ -162,5 +162,14 @@ fi
|
||||
|
||||
%changelog
|
||||
|
||||
* Wed May 10 2017 <andrewhsu@docker.com> 17.06.0-dev
|
||||
- Initial RPM release
|
||||
* Thu Jun 15 2017 <andrewhsu@docker.com> 17.06.0-ce-rc4
|
||||
- release docker-ce 17.06.0-ce-rc4
|
||||
|
||||
* Tue Jun 13 2017 <andrewhsu@docker.com> 17.06.0-ce-rc3
|
||||
- release docker-ce 17.06.0-ce-rc3
|
||||
|
||||
* Wed Jun 07 2017 <andrewhsu@docker.com> 17.06.0-ce-rc2
|
||||
- release docker-ce 17.06.0-ce-rc2
|
||||
|
||||
* Mon May 29 2017 <andrewhsu@docker.com> 17.06.0-ce-rc1
|
||||
- release docker-ce 17.06.0-ce-rc1
|
||||
|
||||
@ -5,6 +5,11 @@ VERSION=$2
|
||||
|
||||
[[ $# < 2 ]] && echo 'not enough args' && exit 1
|
||||
|
||||
DATE_COMMAND="date"
|
||||
if [[ $(uname) -eq "Darwin" ]]; then
|
||||
DATE_COMMAND="docker run --rm alpine date"
|
||||
fi
|
||||
|
||||
GIT_COMMAND="git -C $ENGINE_DIR"
|
||||
rpmName=docker-ce
|
||||
rpmVersion="$VERSION"
|
||||
@ -32,7 +37,7 @@ fi
|
||||
# if we have a "-dev" suffix or have change in Git, let's make this package version more complex so it works better
|
||||
if [[ "$rpmVersion" == *-dev ]] || [ -n "$($GIT_COMMAND status --porcelain)" ]; then
|
||||
gitUnix="$($GIT_COMMAND log -1 --pretty='%at')"
|
||||
gitDate="$(date --date "@$gitUnix" +'%Y%m%d.%H%M%S')"
|
||||
gitDate="$($DATE_COMMAND --date "@$gitUnix" +'%Y%m%d.%H%M%S')"
|
||||
gitCommit="$($GIT_COMMAND log -1 --pretty='%h')"
|
||||
gitVersion="${gitDate}.git${gitCommit}"
|
||||
# gitVersion is now something like '20150128.112847.17e840a'
|
||||
|
||||
33
components/packaging/rpm/systemd/docker.service
Normal file
33
components/packaging/rpm/systemd/docker.service
Normal file
@ -0,0 +1,33 @@
|
||||
[Unit]
|
||||
Description=Docker Application Container Engine
|
||||
Documentation=https://docs.docker.com
|
||||
After=network-online.target firewalld.service
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=notify
|
||||
# the default is not to use systemd for cgroups because the delegate issues still
|
||||
# exists and systemd currently does not support the cgroup feature set required
|
||||
# for containers run by docker
|
||||
ExecStart=/usr/bin/dockerd
|
||||
ExecReload=/bin/kill -s HUP $MAINPID
|
||||
# Having non-zero Limit*s causes performance problems due to accounting overhead
|
||||
# in the kernel. We recommend using cgroups to do container-local accounting.
|
||||
LimitNOFILE=infinity
|
||||
LimitNPROC=infinity
|
||||
LimitCORE=infinity
|
||||
# Uncomment TasksMax if your systemd version supports it.
|
||||
# Only systemd 226 and above support this version.
|
||||
#TasksMax=infinity
|
||||
TimeoutStartSec=0
|
||||
# set delegate yes so that systemd does not reset the cgroups of docker containers
|
||||
Delegate=yes
|
||||
# kill only the docker process, not all processes in the cgroup
|
||||
KillMode=process
|
||||
# restart the docker process if it exits prematurely
|
||||
Restart=on-failure
|
||||
StartLimitBurst=3
|
||||
StartLimitInterval=60s
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
Reference in New Issue
Block a user