Re: gnats queue sorting question

Alexandros Manoussakis <[email protected]> Fri, 4 Dec 2009 22:56:23 -0800
Newsgroups gmane.comp.bug-tracking.gnats.general
Message-ID <[email protected]>
--8323328-1417119084-1259995933=:7874
Content-Type: text/plain; charset="US-ASCII"; format=flowed

FYI what we did on our side was sort the queue by timestamp
(see attached patch) so we left the filenames alone for now.

Thanks,
Alex

On Fri, 4 Dec 2009, Chad Walstrom wrote:

> Hey, Alex.
>
> I know it's been a long time since you last wrote about this, but I've
> cracked open my vim editor and started to poke around again into this
> stuff.
>
> I've looked at the maildir specification at
> http://cr.yp.to/proto/maildir.html, and believe it to be relatively easy
> to implement this as a naming structure.  I've chosen to go with:
>
>   seconds.MmicrosecondsPpidQdeliveries.hostname
>
> Here's a test example code snippet to generate the unique name. I didn't
> research HOST_NAME_MAX and ENAMETOOLONG much past looking at the man
> pages for glibc and POSIX.  We could probably put this in an autoconf
> check.
>
> I began to look at readdir and found that the readdir_r version has some
> badness to it.
>
> http://womble.decadentplace.org.uk/readdir_r-advisory.html (2005)
>
> Using scandir sounds like a great idea, and possibly we could find a
> version of it lying around for those libraries that don't yet have it,
> i.e. POSIX.
>
> The "(int)" casting I did in the printf statement is probably wrong, but
> this is a quick hack.  (Probably use %lu instead, or something.)  Again,
> if we use something like this, we could autoconf check for pid_t (should
> be there no matter what), time_t and suseconds_t and what do do about
> them.
>
> Hostname sizes (potentially 255), and file name sizes (potentially a max
> of 255), could obviously collide, so an snprintf() call could be used to
> limit to the maximum file length.
>
> I wonder if it's all that necessary to use a temporary directory or not,
> but it looks like we're currently using one in queue-pr.c, so keeping
> that symantec is probably fine.  We could essentially rip out the
> asprintf build of the template string and use a normal open() call
> rather than the open_temporary_file().
>
> Oh... and by the way...  It feels good to hack in C again. :)
>
> /* gcc -o uniquename uniquename.c */
> #include <errno.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/time.h>
> #include <sys/types.h>
> #include <unistd.h>
>
> #ifndef HOST_NAME_MAX
> #define HOST_NAME_MAX 255
> #endif
>
>
> /* Get a hostname clean enough for Maildir unique names */
> int get_cleaned_hostname(char *hostname, int len)
> {
>  /* Retrieve the host name */
>  if (0 != gethostname(hostname, len))
>    {
>      /* Only works if GNU Glibc is being used */
>      if (errno == EINVAL
> #ifdef ENAMETOOLONG
>          || errno == ENAMETOOLONG)
> #endif
>        {
>          perror("Name was too long\n");
>        }
>      else if (errno == EFAULT)
>        {
>          perror("Invalid hostname.\n");
>          return(-1);
>        }
>      else
>        {
>          perror("Unknown error condition.\n");
>          return(-1);
>        }
>    }
>
>  /* Clean up the hostname -- cannot have '/' or ':' */
>  int i = 0;
>  for (i;i < len;i++)
>    {
>      if ('/' == hostname[i])
>        {
>          fprintf(stderr, "Found a '/' at index %d.\n", i);
>          hostname[i] = '\057';
>        }
>      else if (':' == hostname[i])
>        {
>          fprintf(stderr, "Found a ':' at index %d.\n", i);
>          hostname[i] = '\072';
>        }
>      else if (' ' == hostname[i])
>        {
>          fprintf(stderr, "Found a ' ' at index %d.\n", i);
>          hostname[i] = '\040';
>        }
>      else if ('\0' == hostname[i])
>        {
>          break;
>        }
>    }
>
>  return(0);
> }
>
> /* Let's see what it takes to make a unique file name. */
> int main (int argc, char **argv)
> {
>  struct timeval tv;
>  char hostname[HOST_NAME_MAX];
>  int deliveries = 0;
>
>  if (0 != get_cleaned_hostname(hostname, HOST_NAME_MAX))
>    {
>      perror("Couldn't retrieve hostname.\n");
>      exit(-1);
>    }
>
>  /**
>  for(deliveries;deliveries < HOST_NAME_MAX; deliveries++) {
>   * Get the time of day -- potentially lots of system calls
>   * if for..loop starts before here. Guaranteed more unique
>   * names.  If we're counting deliveries, which we should,
>   * the for..loop should follow this call.
>   **/
>  if (0 != gettimeofday(&tv, NULL))
>    {
>      perror("Could not get time of day.\n");
>      exit(-1);
>    }
>  for (deliveries;deliveries < HOST_NAME_MAX; deliveries++)
>    {
>      printf("%d.M%dP%dQ%d.%s\n", (int) tv.tv_sec, (int) tv.tv_usec, (int) getpid(), deliveries, hostname);
>    }
> }
>
--8323328-1417119084-1259995933=:7874
Content-Type: text/plain; charset="US-ASCII"; name="queue-pr.patch"
Content-Transfer-Encoding: BASE64
Content-Description: 
Content-Disposition: attachment; filename="queue-pr.patch"

SW5kZXg6IHF1ZXVlLXByLmMNCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJD
UyBmaWxlOiAvY3ZzL2p1bmlwZXIvc3ctdG9vbHMvc3JjL2duYXRzLWRiaS9n
bmF0cy9xdWV1ZS1wci5jLHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS4yOC4x
Ni41DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjguMTYuNg0KZGlmZiAtdSAt
cCAtcjEuMjguMTYuNSAtcjEuMjguMTYuNg0KLS0tIHF1ZXVlLXByLmMJMTcg
QXByIDIwMDkgMjI6NTk6MjYgLTAwMDAJMS4yOC4xNi41DQorKysgcXVldWUt
cHIuYwkyOCBNYXkgMjAwOSAwOToxNzowNiAtMDAwMAkxLjI4LjE2LjYNCkBA
IC03OCw2ICs3OCwzMiBAQCBzdHJ1Y3QgZWRpdF9pbmZvDQogICBjaGFyICpy
ZWFzb247DQogfTsNCiANCitzdHJ1Y3QgZmlsZQ0KK3sNCisgIGNoYXIgKm5h
bWU7DQorICBpbnQgbXRpbWU7DQorfTsNCisNCisvKiBDb21wYXJlIGZ1bmN0
aW9uIGZvciBxc29ydCAqLw0KK3N0YXRpYyBpbnQNCitjbXByX210aW1lIChj
b25zdCB2b2lkICpmaWxlMSwgY29uc3Qgdm9pZCAqZmlsZTIpDQorew0KKyAg
c3RydWN0IGZpbGUgY29uc3QgKmZpcnN0ID0gZmlsZTE7DQorICBzdHJ1Y3Qg
ZmlsZSBjb25zdCAqc2Vjb25kID0gZmlsZTI7DQorICBpbnQgcmV0dmFsID0g
MDsNCisNCisgIGlmIChmaXJzdC0+bXRpbWUgPCBzZWNvbmQtPm10aW1lKQ0K
KyAgICB7DQorICAgICAgcmV0dmFsID0gLTE7DQorICAgIH0NCisgIGVsc2Ug
aWYgKGZpcnN0LT5tdGltZSA+IHNlY29uZC0+bXRpbWUpDQorICAgIHsNCisg
ICAgICByZXR2YWwgPSAxOw0KKyAgICB9DQorDQorICByZXR1cm4gcmV0dmFs
Ow0KK30NCisNCiBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0NCiB7
DQogICB7ImRhdGFiYXNlIiwgMSwgTlVMTCwgJ2QnfSwNCkBAIC0xMTc1LDcg
KzEyMDEsNyBAQCB2YWxpZF9maWxlIChjaGFyICpuYW1lLCBjaGFyICpsb29w
UHJldmVuDQogICBjaGFyICpsaW5lOw0KICAgRklMRSAqZnA7DQogDQotICBp
ZiAoc3RyY21wIChuYW1lLCAiY29yZSIpID09IDApDQorICBpZiAoc3RybmNh
c2VjbXAgKG5hbWUsICJjb3JlIiwgNCkgPT0gMCkNCiAgICAgew0KICAgICAg
IGxvZ19tc2cgKExPR19JTkZPLCAwLCAiY29yZSBmaWxlIGluIHF1ZXVlIGRp
cmVjdG9yeSIpOw0KICAgICAgIHJldHVybiAwOw0KQEAgLTEyNzEsMTMgKzEy
OTcsMTIgQEAgcnVuX2duYXRzIChjaGFyICpkYm5hbWUsIGNvbnN0IGNoYXIg
KnF1ZQ0KICAgRXJyb3JEZXNjIGVyciA9IE5VTEw7DQogICBESVIgKmQ7DQog
ICBzdHJ1Y3QgZGlyZW50ICpuZXh0Ow0KKyAgc3RydWN0IGZpbGUgKmZpbGVz
ID0gTlVMTDsNCisgIHN0cnVjdCBzdGF0IHN0YXRidWZmOw0KICAgaW50IGk7
DQogICBpbnQgbmZpbGVzID0gMDsNCiAgIGludCBtYXhmaWxlcyA9IDEwOw0K
ICAgY2hhciAqbHBoOw0KLSAgc3RydWN0IGZpbGUgew0KLSAgICBjaGFyICpu
YW1lOw0KLSAgfSAqZmlsZXMgPSBOVUxMOw0KIA0KICAgaWYgKG5ldHdvcmtf
bW9kZSkNCiAgICAgew0KQEAgLTEzMjksMjUgKzEzNTQsMzkgQEAgcnVuX2du
YXRzIChjaGFyICpkYm5hbWUsIGNvbnN0IGNoYXIgKnF1ZQ0KIAl7DQogCSAg
aWYgKG5leHQtPmRfbmFtZVswXSAhPSAnLicpDQogCSAgICB7DQotCSAgICAg
IGlmICghIHZhbGlkX2ZpbGUgKChjaGFyICopIG5leHQtPmRfbmFtZSwgbHBo
LCBkYXRhYmFzZSkpDQorCSAgICAgIGlmIChzdGF0KG5leHQtPmRfbmFtZSwg
JnN0YXRidWZmKSA9PSAtMSkNCiAJCXsNCisJCSAgbG9nX21zZyAoTE9HX05P
VElDRSwgMSwgImNhbid0IHN0YXQ6ICIsIG5leHQtPmRfbmFtZSk7DQogCQkg
IGNvbnRpbnVlOw0KIAkJfQ0KLQ0KLQkgICAgICBpZiAobmZpbGVzID09IG1h
eGZpbGVzKQ0KKwkgICAgICBpZiAoU19JU1JFRyAoc3RhdGJ1ZmYuc3RfbW9k
ZSkpDQogCQl7DQotCQkgIG1heGZpbGVzICo9IDI7DQotCQkgIGZpbGVzID0g
KHN0cnVjdCBmaWxlICopDQotCQkgICAgeHJlYWxsb2MgKChjaGFyICopIGZp
bGVzLCBzaXplb2YgKHN0cnVjdCBmaWxlKSAqIG1heGZpbGVzKTsNCisJCSAg
aWYgKCEgdmFsaWRfZmlsZSAoKGNoYXIgKikgbmV4dC0+ZF9uYW1lLCBscGgs
IGRhdGFiYXNlKSkNCisJCSAgICB7DQorCQkgICAgICBjb250aW51ZTsNCisJ
CSAgICB9DQorDQorCQkgIGlmIChuZmlsZXMgPT0gbWF4ZmlsZXMpDQorCQkg
ICAgew0KKwkJICAgICAgbWF4ZmlsZXMgKj0gMjsNCisJCSAgICAgIGZpbGVz
ID0gKHN0cnVjdCBmaWxlICopDQorCQkJeHJlYWxsb2MgKChjaGFyICopIGZp
bGVzLCBzaXplb2YgKHN0cnVjdCBmaWxlKSAqIG1heGZpbGVzKTsNCisJCSAg
ICB9DQorCQkgIGZpbGVzW25maWxlc10ubmFtZSA9IChjaGFyICopIHhzdHJk
dXAgKG5leHQtPmRfbmFtZSk7DQorCQkgIGZpbGVzW25maWxlc10ubXRpbWUg
PSBzdGF0YnVmZi5zdF9tdGltZTsNCisJCSAgbmZpbGVzKys7DQogCQl9DQot
CSAgICAgIGZpbGVzW25maWxlcysrXS5uYW1lID0gKGNoYXIgKikgeHN0cmR1
cCAobmV4dC0+ZF9uYW1lKTsNCiAJICAgIH0NCiAJfQ0KICAgICAgIGNsb3Nl
ZGlyIChkKTsNCisgICAgICBmcmVlIChscGgpOw0KKyAgICAgIC8qIFNvcnQg
dGhlIGxpc3Qgb2YgcXVldWUgZmlsZXMgaW4gdGhlIG9yZGVyIG9mIHRoZWly
IGFycml2YWwgdGltZSAqLw0KKyAgICAgIGlmIChuZmlsZXMgPiAxKQ0KKwl7
DQorCSAgcXNvcnQgKGZpbGVzLCBuZmlsZXMsIHNpemVvZiAoKmZpbGVzKSwg
Y21wcl9tdGltZSk7DQorCX0NCiAgICAgfQ0KIA0KLSAgZnJlZSAobHBoKTsN
Ci0NCiAgIC8qIFJ1biBhIGduYXRzIHByb2Nlc3MgZm9yIGVhY2ggZmlsZS4g
Ki8NCiAgIGZvciAoaSA9IDA7IGkgPCBuZmlsZXM7IGkrKykNCiAgICAgew0K

--8323328-1417119084-1259995933=:7874
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Help-gnats mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/help-gnats

--8323328-1417119084-1259995933=:7874--