[Gluster-devel] pre6 hanging problems

August R. Wohlt glusterfs at isidore.net
Mon Jul 30 10:36:30 UTC 2007


Hi -

So still the same problem with pre6 hanging regularly with or without gdb:

To summarize:

After starting 2 physically distinct clients (separate clients on gigE
switch with server) on centos 5 with pre6 against a server on centos 5 pre
6, doing a heavy rsync to these mounts will regularly freeze up after a few
hours. The clients only have writebehind enabled, and the server has no
other performance enhancements in it.

When the clients' mounts hang, nothing at all shows up in the server log
with debug turned on. The log simple goes along as usual then stops:

...
2007-07-30 05:18:36 D [inode.c:285:__destroy_inode] brick_1/inode: destroy
inode(0)
2007-07-30 05:18:36 D [inode.c:534:__create_inode] brick_1/inode: create
inode(8979319)
2007-07-30 05:18:36 D [inode.c:327:__active_inode] brick_1/inode: activating
inode(8979319), lru=1024/1024
2007-07-30 05:18:36 D [inode.c:357:__passive_inode] brick_1/inode:
passivating inode(8979319), lru=1025/1024
2007-07-30 05:18:36 D [inode.c:285:__destroy_inode] brick_1/inode: destroy
inode(5031361)
2007-07-30 05:18:36 D [inode.c:285:__destroy_inode] brick_1/inode: destroy
inode(0)


Both of the clients have disconnected it seems, because their logs show:

...
2007-07-29 21:45:18 D [inode.c:285:__destroy_inode] fuse/inode: destroy
inode(46470909)
2007-07-29 21:45:18 D [inode.c:327:__active_inode] fuse/inode: activating
inode(46470877), lru=236831/1024
2007-07-29 21:45:18 D [inode.c:285:__destroy_inode] fuse/inode: destroy
inode(46470877)
2007-07-29 21:45:18 E [fuse-bridge.c:2017:fuse_transport_notify]
glusterfs-fuse: got GF_EVENT_POLLERR
2007-07-29 21:45:18 D [fuse-bridge.c:1857:fuse_transport_disconnect]
glusterfs-fuse: cleaning up fuse transport in disconnect handler

...
2007-07-29 21:45:13 D [inode.c:285:__destroy_inode] fuse/inode: destroy
inode(13058343)
2007-07-29 21:45:13 D [inode.c:327:__active_inode] fuse/inode: activating
inode(13058335), lru=330169/1024
2007-07-29 21:45:13 D [inode.c:285:__destroy_inode] fuse/inode: destroy
inode(13058335)
2007-07-29 21:45:13 E [fuse-bridge.c:2017:fuse_transport_notify]
glusterfs-fuse: got GF_EVENT_POLLERR
2007-07-29 21:45:13 D [fuse-bridge.c:1857:fuse_transport_disconnect]
glusterfs-fuse: cleaning up fuse transport in disconnect handler

Both of them generate SIGCONT in gdb. But they have different behavior when
I continue:

The first one just loops with SIGCONT, the other a SIGPIPE:

client1:

(gdb) run
Starting program: /usr/sbin/glusterfs -N -LDEBUG
-l/var/log/glusterfs/glusterfs.log -f/etc/glusterfs/glusterfs-client.vol/backups
[Thread debugging using libthread_db enabled]
[New Thread -1209063744 (LWP 12708)]
Detaching after fork from child process 12710.
[New Thread 16427936 (LWP 12711)]

Program received signal SIGCONT, Continued.
[Switching to Thread 16427936 (LWP 12711)]
0x0032e7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
(gdb) c
Continuing.

Program received signal SIGCONT, Continued.
0x0032e7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
(gdb) bt
#0  0x0032e7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1  0x005a3824 in raise () from /lib/tls/libpthread.so.0
#2  0x0013bb0c in tcp_bail (this=0x947b3d0) at
../../../../transport/tcp/tcp.c:146
#3  0x00122bbc in transport_bail (this=0x947b3d0) at transport.c:192
#4  0x0012ea16 in call_bail (trans=0x947b3d0) at client-protocol.c:220
#5  0x00123870 in gf_timer_proc (ctx=0xbfe97140) at timer.c:119
#6  0x0059d3cc in start_thread () from /lib/tls/libpthread.so.0
#7  0x00414c3e in clone () from /lib/tls/libc.so.6
(gdb)


client2:

Starting program: /usr/sbin/glusterfs -f/usr/etc/glusterfs/glusterfs-
client.vol -N -LDEBUG -l/var/log/glusterfs/glusterfs.log /backups
[Thread debugging using libthread_db enabled]
[New Thread -1208265024 (LWP 7022)]
Detaching after fork from child process 7023.
[New Thread 26753968 (LWP 7024)]

Program received signal SIGCONT, Continued.
[Switching to Thread 26753968 (LWP 7024)]
0x007167a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
(gdb) c
Continuing.

Program received signal SIGPIPE, Broken pipe.
[Switching to Thread -1208265024 (LWP 7022)]
0x007167a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
(gdb) bt
#0  0x007167a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1  0x007ef544 in writev () from /lib/tls/libc.so.6
#2  0x00f799a1 in full_rwv (fd=7, vector=0x20157, count=39, fn=0x7ef490
<writev>) at common-utils.c:100
#3  0x00962386 in tcp_client_writev (this=0x8ecf418, vector=0xbffe0fd0,
count=55) at tcp-client.c:251
#4  0x002a7b3b in client_protocol_xfer (frame=0xdd003b0, this=0x8e935c8,
type=GF_OP_TYPE_FOP_REQUEST, op=GF_FOP_WRITE,
    request=0xdea0028) at client-protocol.c:324
#5  0x002a8ec5 in client_writev (frame=0xdd003b0, this=0x8e935c8,
fd=0xc379bc8, vector=0xa8b05d0, count=32, offset=131072)
    at client-protocol.c:1126
#6  0x00efacf0 in wb_sync (frame=0xa8b057c, file=0xdb29698) at
write-behind.c:180
#7  0x00efb7eb in wb_writev (frame=0xdd003b0, this=0x8e97f80, fd=0xc379bc8,
vector=0xbffe13a0, count=1, offset=258048)
    at write-behind.c:603
#8  0x0804d4e8 in fuse_write (req=0xc04dcd8, ino=53232572,
    buf=0xb7b97048 "d6450 at mypacs.net>; Sun, 29 Jul 2007 08:34:58
-0700\nFrom: \"Ebay Leader\" <DemetriusVenable at nosopoetic.com>\nTo:
fubbed6450 at mypacs.net\nSubject: Ebay for dummies for Fubbed6450\nDate: Sun,
29 Jul 2007 07:28"..., size=4096,
    off=258048, fi=0xffffffe0) at fuse-bridge.c:1235
#9  0x00320c1a in do_write (req=0xc04dcd8, nodeid=53232572,
inarg=0xb7b97030) at fuse_lowlevel.c:635
#10 0x00321bd0 in fuse_ll_process (data=0x8e93718, buf=0xb7b97008 "@\020",
len=4160, ch=0x8e936a8) at fuse_lowlevel.c:1171
#11 0x00322ea3 in fuse_session_process (se=0xffffffe0, buf=0xb7b97008
"@\020", len=4160, ch=0x8e936a8) at fuse_session.c:89
#12 0x0804efb9 in fuse_transport_notify (xl=0x8e98020, event=2,
data=0x8e933d0) at fuse-bridge.c:2050
#13 0x00f7af6c in transport_notify (this=0x8e933d0, event=1) at transport.c
:154
#14 0x00f7b581 in sys_epoll_iteration (ctx=0xbffe1570) at epoll.c:54
#15 0x00f7b10b in poll_iteration (ctx=0xbffe1570) at transport.c:262
#16 0x0804a5e3 in main (argc=6, argv=0xbffe1644) at glusterfs.c:382
(gdb) c
Continuing.

All commands running on the mountpoint are frozen when this happens, and
when I run glusterfs without gdb, it just freezes up, and does not die.

If I suspend the server and do a backtrace on it, it shows:

(gdb) run
Starting program: /usr/sbin/glusterfsd -N -LDEBUG
-f/etc/glusterfs/glusterfs-server.vol -l/var/log/glusterfs/glusterfs.log
[Thread debugging using libthread_db enabled]
[New Thread 46912496205696 (LWP 22070)]
glusterfsd: WARNING: ignoring stale pidfile for PID 22044
[New Thread 1084229952 (LWP 22071)]
[New Thread 1094719808 (LWP 22072)]
[New Thread 1105209664 (LWP 22073)]

Program received signal SIGTSTP, Stopped (user).
[Switching to Thread 46912496205696 (LWP 22070)]
0x000000358400cb5b in __read_nocancel () from /lib64/libpthread.so.0
(gdb) bt
#0  0x000000358400cb5b in __read_nocancel () from /lib64/libpthread.so.0
#1  0x00000036a800ed08 in full_rw (fd=8, buf=0x2aaaac155c90
"00000007\n0000000b:00000006\nCALLER_PID", size=131287,
    op=0x358400cb10 <read>) at common-utils.c:51
#2  0x00000036a800ed7a in gf_full_read (fd=8, buf=0x2aaaac155c90
"00000007\n0000000b:00000006\nCALLER_PID", size=131287)
    at common-utils.c:71
#3  0x00002aaaaaedce8f in tcp_recieve (this=0xd9f13c0, buf=0x2aaaac155c90
"00000007\n0000000b:00000006\nCALLER_PID",
    len=131287) at ../../../../transport/tcp/tcp.c:49
#4  0x00000036a80104a8 in gf_block_unserialize_transport (trans=0xd9f13c0)
at protocol.c:340
#5  0x00002aaaaacd842c in notify (this=0xd9f7e10, event=2, data=0xd9f13c0)
at server-protocol.c:5819
#6  0x00000036a8010df2 in transport_notify (this=0xd9f13c0, event=1) at
transport.c:154
#7  0x00000036a80114e9 in epoll_notify (eevent=1, data=0xd9f13c0) at epoll.c
:54
#8  0x00000036a80117a7 in sys_epoll_iteration (ctx=0x7fff2458de70) at
epoll.c:146
#9  0x00000036a8010fc6 in poll_iteration (ctx=0x7fff2458de70) at transport.c
:262
#10 0x0000000000401a58 in main (argc=5, argv=0x7fff2458dfc8) at glusterfsd.c
:309
(gdb)


When I kill the server and restart it, the client will show Transport not
connected the first time accessing the mount (ie, with "ls"), but the 2nd
time it works and shows the directories therein.

This happens with great regularity. Sometimes the message in the client logs
is "connection on x is still in progress - try again later" but sometimes
it's this disconnected message. Every time, the cure for me is the same--
restart the server and the clients become happy and continue on their merry
way again.

I don't have any problem when I remove writebehind from the clients so that
it's just plain vanilla client -> server, but my throughput drops from
40MB/s to 150Kbps which is not useable for me and so maybe I just haven't
let it go long enough. I have to use pre6 because I'm doing hardlinks on the
mount, so I can't drop to a lower version for stability.

Because this happens with great regularity (~ every 6hrs), I'm more than
happy to do any tracing/debugging that anyone can suggest. Otherwise, I'll
try to start some debugging in the code when I have a few spare cycles (few
and far between!)

Again, this is on a stock kernel on CentOS 5 installation, pre6 glusterfs
client and server, and fuse 2.7.0-glfs1.

client configuration:

 ### Add client feature and attach to remote subvolume
 volume brick
   type protocol/client
   option transport-type tcp/client     # for TCP/IP transport
   option remote-host 192.168.2.5       # IP address of the remote brick
   option remote-subvolume brick_1  # name of the remote volume
 end-volume

# #### Add writeback feature
 volume brick-wb
   type performance/write-behind
   option aggregate-size 131072 # unit in bytes
   subvolumes brick
 end-volume

server configuration:

 ### Export volume "brick" with the contents of "/home/export" directory.
 volume brick_1
   type storage/posix
   option directory /home/vg_3ware1/vivalog/brick_1
 end-volume
 volume brick_2
   type storage/posix
   option directory /home/vg_3ware1/vivalog/brick_2
 end-volume

 ### Add network serving capability to above brick.
 volume server
   type protocol/server
   option transport-type tcp/server     # For TCP/IP transport
   option bind-address 192.168.2.5     # Default is to listen on all
interfaces
   subvolumes brick_1
   option auth.ip.brick_1.allow * # Allow access to "brick" volume
 end-volume

 ### Add network serving capability to above brick.
 volume server
   type protocol/server
   option transport-type tcp/server     # For TCP/IP transport
   option bind-address 192.168.2.5     # Default is to listen on all
interfaces
   subvolumes brick_2
   option listen-port 6997
   option auth.ip.brick_2.allow * # Allow access to "brick" volume
 end-volume

I tried a single "volume server" entry for both bricks, and I get the same
thing.  Also, I have an ssh connection between the two servers open all the
time which never drops, so I'm ruling out network problems across the
switch.

Help!
:august

On 7/26/07, August R. Wohlt <glusterfs at isidore.net> wrote:
>
> Hi avati,
>
> When I run it without gdb, it still has the same behavior. It'll run fine
> for a few hours under load and then freeze. When it does, the client spews
> these to the logs forever. When I kill glusterfs and remount the directory,
> everything's fine again:
>
> 2007-07-26 12:21:31 D [fuse-bridge.c:344:fuse_entry_cbk] glusterfs-fuse:
> ERR => -1 (107)
> 2007-07-26 12:21:31 D [inode.c:285:__destroy_inode] fuse/inode: destroy
> inode(0)
> 2007-07-26 12:23:34 W [client-protocol.c :4158:client_protocol_reconnect]
> brick: attempting reconnect
> 2007-07-26 12:23:34 D [tcp-client.c:178:tcp_connect] brick: connection on
> 4 still in progress - try later
> 2007-07-26 12:29:51 W [client-protocol.c:4158:client_protocol_reconnect]
> brick: attempting reconnect
> 2007-07-26 12:29:51 E [tcp-client.c:170:tcp_connect] brick: non-blocking
> connect() returned: 110 (Connection timed out)
>
> :g
>
> On 7/26/07, Anand Avati <avati at zresearch.com> wrote:
> >
> > August,
> >  It seems to me that you were running the client in GDB, and for some
> > reason that particular client bailed out. While bailing out the client
> > raises SIGCONT which has been caught by gdb (gdb catches all signals before
> > letting the signal handlers take over). the backtrace you have attached is
> > NOT a crash, you had to just 'c' (continue) at the gdb. And most likely,
> > this is what has given the 'hung' effect as well.
> > Is this reproducible for you?
> >
> > thanks,
> > avati
> >
> > 2007/7/26, August R. Wohlt < glusterfs at isidore.net>:
> > >
> > > Hi all -
> > >
> > > I have client and server set up with the pre6 version of gluserfs.
> > > Several
> > > times a day the client mount will freeze up as does any command that
> > > tries
> > > to read from the mountpoint. I have to kill the glusterfs process,
> > > unmount
> > > the directory and remount it to get it to work again.
> > >
> > > When this happens, there is another glusterfs client on other machines
> > > connected to the same server that does not get disconnected. So the
> > > timeout
> > > message in the logs is confusing to me. If it's really timing out
> > > wouldn't
> > > the other server be disconnected, too?
> > >
> > > This is on CentOS 5 with fuse 2.7.0-glfs.
> > >
> > > When it happens, here's what shows up in the client:
> > >
> > > ...
> > > 2007-07-25 09:45:59 D [inode.c:327:__active_inode] fuse/inode:
> > > activating
> > > inode(4210807), lru=0/1024
> > > 2007-07-25 09:45:59 D [inode.c:285:__destroy_inode] fuse/inode:
> > > destroy
> > > inode(4210807)
> > > 2007-07-25 12:37:26 W [client-protocol.c:211:call_bail] brick:
> > > activating
> > > bail-out. pending frames = 1. last sent =
> > > 2007-07-25 12:33:42. last received = 2007-07-25 11:42:59
> > > transport-timeout =
> > > 120
> > > 2007-07-25 12:37:26 C [client-protocol.c:219:call_bail] brick: bailing
> > > transport
> > > 2007-07-25 12:37:26 W [client-protocol.c:4189:client_protocol_cleanup]
> > >
> > > brick: cleaning up state in transport object
> > > 0x80a03d0
> > > 2007-07-25 12:37:26 W [client-protocol.c:4238:client_protocol_cleanup]
> > > brick: forced unwinding frame type(0) op(15)
> > > 2007-07-25 12:37:26 C [tcp.c:81:tcp_disconnect] brick: connection
> > > disconnected
> > >
> > > When it happens, here's what shows up in the server:
> > >
> > > 2007-07-25 15:37:40 E [protocol.c:346:gf_block_unserialize_transport]
> > > libglusterfs/protocol: full_read of block failed: peer (
> > > 192.168.2.3:1023)
> > > 2007-07-25 15:37:40 C [tcp.c:81:tcp_disconnect] server: connection
> > > disconnected
> > > 2007-07-25 15:37:40 E [ protocol.c:251:gf_block_unserialize_transport]
> > > libglusterfs/protocol: EOF from peer ( 192.168.2.4:1023)
> > > 2007-07-25 15:37:40 C [tcp.c:81:tcp_disconnect] server: connection
> > > disconnected
> > >
> > > And here's the client backtrace:
> > >
> > > (gdb) bt
> > > #0  0x0032e7a2 in _dl_sysinfo_int80 () from /lib/ld- linux.so.2
> > > #1  0x005a3824 in raise () from /lib/tls/libpthread.so.0
> > > #2  0x00655b0c in tcp_bail (this=0x80a03d0) at
> > > ../../../../transport/tcp/tcp.c:146
> > > #3  0x00695bbc in transport_bail (this=0x80a03d0) at transport.c :192
> > > #4  0x00603a16 in call_bail (trans=0x80a03d0) at client-protocol.c:220
> > > #5  0x00696870 in gf_timer_proc (ctx=0xbffeec30) at timer.c:119
> > > #6  0x0059d3cc in start_thread () from /lib/tls/libpthread.so.0
> > > #7  0x00414c3e in clone () from /lib/tls/libc.so.6
> > >
> > >
> > > client config:
> > >
> > > ### Add client feature and attach to remote subvolume
> > > volume brick
> > >    type protocol/client
> > >    option transport-type tcp/client     # for TCP/IP transport
> > >    option remote-host 192.168.2.5       # IP address of the remote
> > > brick
> > >    option remote-subvolume brick_1  # name of the remote volume
> > > end-volume
> > >
> > > # #### Add writeback feature
> > >   volume brick-wb
> > >     type performance/write-behind
> > >     option aggregate-size 131072 # unit in bytes
> > >     subvolumes brick
> > >   end-volume
> > >
> > > server config:
> > >
> > > ### Export volume "brick" with the contents of "/home/export"
> > > directory.
> > > volume brick_1
> > >    type storage/posix
> > >    option directory /home/vg_3ware1/vivalog/brick_1
> > > end-volume
> > >
> > > volume brick_2
> > >    type storage/posix
> > >    option directory /home/vg_3ware1/vivalog/brick_2
> > > end-volume
> > >
> > > ### Add network serving capability to above brick.
> > > volume server
> > >    type protocol/server
> > >    option transport-type tcp/server     # For TCP/IP transport
> > >    option bind-address 192.168.2.5     # Default is to listen on all
> > > interfaces
> > >    subvolumes brick_1
> > >    option auth.ip.brick_2.allow * # Allow access to "brick" volume
> > >    option auth.ip.brick_1.allow * # Allow access to "brick" volume
> > > end-volume
> > >
> > > ps I have one server serving two volume bricks to two physically
> > > distinct
> > > clients.  I assume this is okay--that I don't need to have two
> > > separate
> > > server declarations.
> > > _______________________________________________
> > > Gluster-devel mailing list
> > > Gluster-devel at nongnu.org
> > > http://lists.nongnu.org/mailman/listinfo/gluster-devel
> > >
> >
> >
> >
> > --
> > Anand V. Avati
>
>
>



More information about the Gluster-devel mailing list