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--