void cartSimulate(char *host, char *user, char *password, char *database) /* Simulate action of various UCSC Genome Browser CGIs on cart. */ { /* Figure out size of tables. */ struct sqlConnection *conn = sqlConnectRemote(host, user, password, database); int userDbSize = sqlQuickNum(conn, "NOSQLINJ select count(*) from userDb"); if (userDbSize == 0) errAbort("%s.%s table is empty", database, userTable); int maxSampleSize = 1024*1024; int sampleSize = min(userDbSize, maxSampleSize); verbose(2, "# userDb has %d rows, sampling %d\n" , userDbSize, sampleSize); /* Get sample of user id's. */ int *userIds = getSomeInts(conn, "userDb", "id", sampleSize); /* Get userCount random indexes. */ int *randomIxArray, ix; AllocArray(randomIxArray, userCount); verbose(2, "random user ix:\n"); for (ix=0; ix<userCount; ++ix) { randomIxArray[ix] = rand() % sampleSize; verbose(2, "%d ", randomIxArray[ix]); } verbose(2, "\n"); sqlDisconnect(&conn); int iteration = 0; for (;;) { for (ix = 0; ix < userCount; ++ix) { int randomIx = rand()%sampleSize; boolean doNew = randomBitFromProb(newRatio); long startTime = clock1000(); struct sqlConnection *conn = sqlConnectRemote(host, user, password, database); long connectTime = clock1000(); struct dyString *contents = fakeCart(randomFakeSize()); char *userContents = NULL; int userId = userIds[randomIx]; if (doNew) userId = userIds[randomIx] = dummyInsert(conn, userTable); int userUseCount = dummyQuery(conn, userTable, userId, &userContents); long userReadTime = clock1000(); sleep1000(cgiDelay); long cgiSleepTime = clock1000(); updateOne(conn, userTable, contents->string, userId, userUseCount); long userWriteTime = clock1000(); sqlDisconnect(&conn); long disconnectTime = clock1000(); printf("%ld total, %ld oldSize, %ld newSize, %ld connect, %ld userRead, %ld userWrite, %ld disconnect\n", disconnectTime - startTime - (cgiSleepTime - userReadTime), (long) strlen(userContents), (long)contents->stringSize, connectTime - startTime, userReadTime - connectTime, userWriteTime - cgiSleepTime, disconnectTime - userWriteTime ); dyStringFree(&contents); freez(&userContents); sleep1000(hitDelay); if (++iteration >= iterations) return; } } errAbort("cartSimulate(%s %s %s %s) not implemented", host, user, password, database); }
void cartSimNoInsert(char *host, char *user, char *password, char *database, char *milliDelayString, char *iterationString) /* cartSimNoInsert - simulates N users accessing cart at regular intervals * where cart data is read and then written back unchanged */ { int milliDelay = sqlUnsigned(milliDelayString); int iterations = sqlUnsigned(iterationString); /* Figure out size of tables. */ struct sqlConnection *conn = sqlConnectRemote(host, user, password, database); int userDbSize = sqlQuickNum(conn, "NOSQLINJ select count(*) from userDb"); int sessionDbSize = sqlQuickNum(conn, "NOSQLINJ select count(*) from sessionDb"); int sampleSize = min(userDbSize, sessionDbSize); int maxSampleSize = 8*1024; sampleSize = min(sampleSize, maxSampleSize); verbose(2, "# userDb has %d rows, sessionDb has %d rows, sampling %d\n" , userDbSize, sessionDbSize, sampleSize); /* Get sample of user id's. */ int *userIds = getSomeInts(conn, "userDb", "id", sampleSize); int *sessionIds = getSomeInts(conn, "sessionDb", "id", sampleSize); /* Get userCount random indexes. */ int *randomIxArray, ix; AllocArray(randomIxArray, userCount); verbose(2, "random user ix:\n"); for (ix=0; ix<userCount; ++ix) { randomIxArray[ix] = rand() % sampleSize; verbose(2, "%d ", randomIxArray[ix]); } verbose(2, "\n"); sqlDisconnect(&conn); int iteration = 0; int querySize = 1024*1024*16; char *query = needLargeMem(querySize); for (;;) { for (ix = 0; ix < userCount; ++ix) { int randomIx = randomIxArray[ix]; long startTime = clock1000(); struct sqlConnection *conn = sqlConnectRemote(host, user, password, database); long connectTime = clock1000(); sqlSafef(query, querySize, "select contents from userDb where id=%d", userIds[randomIx]); char *userContents = sqlQuickString(conn, query); long userReadTime = clock1000(); sqlSafef(query, querySize, "select contents from sessionDb where id=%d", sessionIds[randomIx]); char *sessionContents = sqlQuickString(conn, query); long sessionReadTime = clock1000(); sqlSafef(query, querySize, "update userDb set contents='%s' where id=%d", userContents, userIds[randomIx]); if (!readOnly) sqlUpdate(conn, query); long userWriteTime = clock1000(); sqlSafef(query, querySize, "update sessionDb set contents='%s' where id=%d", sessionContents, sessionIds[randomIx]); if (!readOnly) sqlUpdate(conn, query); long sessionWriteTime = clock1000(); sqlDisconnect(&conn); long disconnectTime = clock1000(); printf("%ld total, %ld size, %ld connect, %ld userRead, %ld sessionRead, %ld userWrite, %ld sessionWrite\n", disconnectTime - startTime, (long) strlen(userContents) + strlen(sessionContents), connectTime - startTime, userReadTime - connectTime, sessionReadTime - userReadTime, userWriteTime - sessionReadTime, sessionWriteTime - userReadTime); freez(&userContents); freez(&sessionContents); sleep1000(milliDelay); if (++iteration >= iterations) return; } } }