Ignore:
Timestamp:
Feb 27, 2013 11:34:13 PM (10 years ago)
Author:
gah
Message:

rework of stats log file.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/packages/vizservers/pymolproxy/pymolproxy2.c

    r3376 r3377  
    7878#include <tcl.h>
    7979#include <pthread.h>
     80#include <md5.h>
    8081
    8182#undef INLINE
     
    576577
    577578static int
    578 OpenStatsFile(const char *path)
     579GetStatsFile(const char *string)
    579580{
    580581    Tcl_DString ds;
    581     char **argv;
    582     int argc;
    583582    int i;
    584     const char *fileName;
    585     char string[200];
    586 
    587     if (access(STATSDIR, X_OK) != 0) {
    588         mkdir(STATSDIR, 0770);
    589     }
    590     SplitPath(path, &argc, &argv);
     583    char fileName[33];
     584    const char *path;
     585    int length;
     586    char pidstr[200];
     587    md5_state_t state;
     588    md5_byte_t digest[16];
     589
     590    if (string == NULL) {
     591        return statsFile;
     592    }
     593    /* By itself the client's key/value pairs aren't unique.  Add in the
     594     * process id of this render server. */
    591595    Tcl_DStringInit(&ds);
     596    Tcl_DStringAppend(&ds, string, -1);
     597    Tcl_DStringAppendElement(&ds, "pid", 3);
     598    sprintf(pidstr, "%d", getpid());
     599    Tcl_DStringAppendElement(&ds, pidstr, -1);
     600
     601    /* Create a md5 hash of the key/value pairs and use it as the file name. */
     602    string = Tcl_DStringValue(&ds);
     603    length = strlen(string);
     604    md5_init(&state);
     605    md5_append(&state, (const md5_byte_t *)string, length);
     606    md5_finish(&state, digest);
     607    for (i = 0; i < 16; i++) {
     608        sprintf(fileName + i * 2, "%02x", digest[i]);
     609    }
     610    Tcl_DStringLength(&ds, 0);
    592611    Tcl_DStringAppend(&ds, STATSDIR, -1);
    593     for (i = 0; i < argc; i++) {
    594         char *p;
    595 
    596         Tcl_DStringAppend(&ds, "/", 1);
    597         Tcl_DStringAppend(&ds, argv[i], -1);
    598         p = Tcl_DStringValue(&ds);
    599         if (access(p, X_OK) != 0) {
    600             mkdir(p, 0770);
    601         }
    602     }
    603612    Tcl_DStringAppend(&ds, "/", 1);
    604     sprintf(string, "%d", getpid());
    605     Tcl_DStringAppend(&ds, string, -1);
    606     fileName = Tcl_DStringValue(&ds);
    607     free(argv);
    608     statsFile = open(fileName, O_CREAT | O_EXCL | O_WRONLY, 0600);
     613    Tcl_DStringAppend(&ds, fileName, 32);
     614    path = Tcl_DStringValue(&ds);
     615
     616    statsFile = open(path, O_EXCL | O_CREAT | O_WRONLY, 0600);
    609617    Tcl_DStringFree(&ds);
    610618    if (statsFile < 0) {
     
    616624
    617625static int
    618 WriteToStatsFile(const char *s, size_t length)
    619 {
    620     ssize_t numWritten;
    621 
    622     if (statsFile >= 0) {
    623         numWritten = write(statsFile, s, length);
     626WriteToStatsFile(int f, const char *s, size_t length)
     627{
     628
     629    if (f >= 0) {
     630        ssize_t numWritten;
     631
     632        numWritten = write(f, s, length);
    624633        if (numWritten == (ssize_t)length) {
    625             close(dup(statsFile));
     634            close(dup(f));
    626635        }
    627636    }
     
    738747    }
    739748    Tcl_DStringAppend(&ds, "\n", -1);
    740     result = WriteToStatsFile(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds));
     749    f = GetStatsFile(NULL);
     750    result = WriteToStatsFile(f, Tcl_DStringValue(&ds), Tcl_DStringLength(&ds));
    741751    Tcl_DStringFree(&ds);
     752    close(f);
    742753    return result;
    743754}
     
    934945    char buf[BUFSIZ];
    935946    static int first = 1;
    936 
    937     if (argc != 3) {
     947    int f;
     948
     949    if (argc != 2) {
    938950        Tcl_AppendResult(interp, "wrong # of arguments: should be \"", argv[0],
    939                 " path list\"", (char *)NULL);
     951                " list\"", (char *)NULL);
    940952        return TCL_ERROR;
    941953    }
    942     if ((statsFile == -1) && (OpenStatsFile(argv[1]) < 0)) {
     954    /* Use the initial client key value pairs as the parts for a generating
     955     * a unique file name. */
     956    f = GetStatsFile(argv[1]);
     957    if (f < 0) {
    943958        Tcl_AppendResult(interp, "can't open stats file: ",
    944                         Tcl_PosixError(interp), (char *)NULL);
     959                        Tcl_PosixError(interp), (char *)NULL);
    945960        return TCL_ERROR;
    946961    }
     
    983998    free(elems);
    984999    Tcl_DStringAppend(&ds, "\n", 1);
    985     result = WriteToStatsFile(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds));
     1000    result = WriteToStatsFile(f, Tcl_DStringValue(&ds), Tcl_DStringLength(&ds));
    9861001    Tcl_DStringFree(&ds);
    9871002    return result;
Note: See TracChangeset for help on using the changeset viewer.