All of lore.kernel.org
 help / color / mirror / Atom feed
From: Felix Becker <mail@felixbecker.name>
To: linux-kernel@vger.kernel.org
Subject: socket file descriptor a/m/c-timestamps broken in <= 3.8.8?
Date: Tue, 23 Apr 2013 01:39:27 +0200	[thread overview]
Message-ID: <5175CA2F.2030206@felixbecker.name> (raw)

Hi,

I tried to figure out how old my TCP connections are and took a look
at /proc/<pid>/fd/<socketfdnum> using 'ls -la' / 'stat'.

When I'm creating a new socket in my application, the time stamps
returned by stat / ls -la are correct - as expected. After closing the
socket, the fd isn't visible in /proc/<pid>/fd anymore - as expected.
When creating a new socket a few minutes later (which gets the same
number as the socket closed before), the newly created socket has the
same time stamps (access / modify / change) as the old socket - I
didn't expect this.

When using fstat() from <sys/stat.h> I'm getting 0 for a/m/c-time.
Only in /proc/<pid>/fd/ i can see (the wrong) times.

I attached a test code for reproducing the issue. In my production
environments i have new socket file descriptors which have timestamps
indicating that they are many hours old.

Q1: is it a bug that fstat() returns 0-values for a/m/c-time?

Q2: is it a bug that a new socket, with the file descriptor number of
an older socket which existed before, have the a/m/c-times of the old
socket in /proc/<pid>/fd/?

Best regards

Felix

p.s. test setup is a normal x86_64 architecture (intel xeon).

=======================================================================
// sockettest.c

#include <sys/socket.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>


void print_socket_stats(int sfd){
   struct stat socket_stats;
   fstat(sfd, &socket_stats);
   printf("Socket stats for socket %d\n", sfd);
   printf("socket stat: st_atime: %ld\n", socket_stats.st_atime);
   printf("socket stat: st_mtime: %ld\n", socket_stats.st_mtime);
   printf("socket stat: st_ctime: %ld\n", socket_stats.st_ctime);
}

void print_with_time(const char* message){
        time_t t;
        time(&t);
        printf("%s @ %s\n", message, ctime(&t));

}

int main(int argc, char *argv[]) {

   int sfd;

   printf("pid: %d\n", getpid());

   print_with_time("Opening socket");
   sfd = socket(AF_UNIX, SOCK_STREAM, 0);
   printf("opened socket: %d\n",sfd);
   print_socket_stats(sfd);

   print_with_time("sleeping 30\n");

   sleep(30);

   printf("closing socket %d", sfd);
   close(sfd);

   printf("closed socket: %d\n",sfd);
   print_with_time("sleeping 61 seconds");

   sleep(61);

   print_with_time("opening new socket");
   sfd = socket(AF_UNIX, SOCK_STREAM, 0);
   printf("opened socket: %d\n",sfd);
   print_socket_stats(sfd);
   print_with_time("sleeping 999");

   sleep(999);
}

=======================================================================

./sockettest &

pid: 18267
Opening socket @ Mon Apr 22 23:05:37 2013

opened socket: 3
Socket stats for socket 3
socket stat: st_atime: 0
socket stat: st_mtime: 0
socket stat: st_ctime: 0
sleeping 30 @ Mon Apr 22 23:05:37 2013

>>> ls -la /proc/18267/fd/3
lrwx------ 1 becker becker 64 Apr 22 23:05 /proc/18267/fd/3 ->
socket:[210268]


>>> stat /proc/18267/fd/3
  File: `/proc/18267/fd/3' -> `socket:[210268]'
  Size: 64              Blocks: 0          IO Block: 1024   symbolic link
Device: 3h/3d   Inode: 52177       Links: 1
Access: (0700/lrwx------)  Uid: ( 1001/  becker)   Gid: ( 1001/  becker)
Access: 2013-04-22 23:05:46.179813835 +0000
Modify: 2013-04-22 23:05:46.175813886 +0000
Change: 2013-04-22 23:05:46.175813886 +0000

closing socket 3
closed socket: 3

sleeping 61 seconds @ Mon Apr 22 23:06:07 2013

opening new socket @ Mon Apr 22 23:07:08 2013

opened socket: 3
Socket stats for socket 3
socket stat: st_atime: 0
socket stat: st_mtime: 0
socket stat: st_ctime: 0
sleeping 999 @ Mon Apr 22 23:07:08 2013


>>> ls -la /proc/18267/fd/3
lrwx------ 1 becker becker 64 Apr 22 23:05 /proc/18267/fd/3 ->
socket:[210320]

>>> stat /proc/18267/fd/3



  File: `/proc/18267/fd/3' -> `socket:[210320]'
  Size: 64              Blocks: 0          IO Block: 1024   symbolic link
Device: 3h/3d   Inode: 52177       Links: 1
Access: (0700/lrwx------)  Uid: ( 1001/  becker)   Gid: ( 1001/  becker)
Access: 2013-04-22 23:05:46.179813835 +0000
Modify: 2013-04-22 23:05:46.175813886 +0000
Change: 2013-04-22 23:05:46.175813886 +0000

             reply	other threads:[~2013-04-22 23:39 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-22 23:39 Felix Becker [this message]
2013-04-23  0:30 ` socket file descriptor a/m/c-timestamps broken in <= 3.8.8? Eric Wong
2013-04-23  0:37   ` Eric Dumazet
2013-04-23 22:53     ` Felix Becker
2013-04-23 23:18       ` Eric Dumazet

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5175CA2F.2030206@felixbecker.name \
    --to=mail@felixbecker.name \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.