5 #include "ResolveLocker.h"
6 int ResolveLocker(USER_OPTIONS *attachOption);
10 #include <afs\smb_iocons.h>
11 #include <afs\afsint.h>
12 #include <afs\pioctl_nt.h>
14 #define VIOCGETVOLSTAT 0x7
27 afs_int32 BlocksInUse;
28 afs_int32 PartBlocksAvail;
29 afs_int32 PartMaxBlocks;
32 typedef struct VolumeStatus VolumeStatus;
34 typedef struct ViceIoctl {
40 extern long pioctl(char *pathp, long opcode, struct ViceIoctl *blob, int follow);
44 #define ival(s) strtol(s, NULL, 0)
45 #define AFSDLL "afsauthent.dll"
47 #define WINTORTURE_ASFDLL_ONLINE 1
48 #define WINTORTURE_ASFDLL_OFFLINE 2
49 #define WINTORTURE_ASFDLL_NOTFOUND 3
50 #define WINTORTURE_ASFPIOCTL_NOTFOUND 4
54 extern void EndSecondTime(int cmd);
55 extern void StartSecondTime(int cmd);
56 extern void LogMessage(int ProcessNumber, char *HostName, char *FileName, char *message, int LogID);
57 extern void LogStats(char *FileName, int ToLog, int Iteration, int NumberOfProcesses, int NumberOfThreads,
58 char *HostName, int ProcessNumber, struct cmd_struct ThreadCommandInfo[],
59 char *CommandLine, char *TargetDirectory);
60 extern void SubstituteString(char *s,const char *pattern,const char *insert, size_t len);
62 int IsOnline(char *strPath);
63 BOOL run_netbench(int client, char *ClientTxt, char *PathToSecondDir);
66 HANDLE FileMutexHandle;
67 HANDLE ShutDownEventHandle;
68 HANDLE PauseEventHandle;
69 HANDLE ContinueEventHandle;
72 __declspec( thread ) int AfsTrace;
73 __declspec( thread ) int CurrentLoop;
74 __declspec( thread ) int ProcessNumber = 0;
75 __declspec( thread ) int LogID = 0;
76 __declspec( thread ) int LineCount = 0;
77 __declspec( thread ) int *pThreadStatus;
78 __declspec( thread ) DWORD TickCount1,TickCount2, MilliTickStart;
79 __declspec( thread ) int BufferSize = 4096;
80 __declspec( thread ) char *IoBuffer = NULL;
81 __declspec( thread ) char AfsLocker[256];
82 __declspec( thread ) char OriginalAfsLocker[256];
83 __declspec( thread ) char HostName[256];
84 __declspec( thread ) struct cmd_struct ThreadCommandInfo[CMD_MAX_CMD + 1];
85 __declspec( thread ) FTABLE ftable[MAX_FILES];
86 __declspec( thread ) HANDLE hWinEventHandle;
87 __declspec( thread ) EXIT_STATUS *pExitStatus;
88 __declspec( thread ) DWORD LastKnownError;
91 DWORD WINAPI StressTestThread(LPVOID lpThreadParameter)
99 char CommandLine[512];
100 char TargetDirectory[512];
101 char WorkingDirectory[512];
102 char ClientText[128];
103 char PathToSecondDir[256];
106 PARAMETERLIST *pParameterList;
107 struct cmd_struct *WinCommandInfo;
109 pParameterList = (PARAMETERLIST *)lpThreadParameter;
110 pThreadStatus = pParameterList->pThreadStatus;
111 BufferSize = pParameterList->BufferSize;
112 ProcessNumber = pParameterList->ProcessNumber;
113 PrintStats = pParameterList->PrintStats;
114 CurrentLoop = pParameterList->CurrentLoop;
115 ProcessID = pParameterList->ProcessID;
116 LogID = pParameterList->LogID;
117 AfsTrace = pParameterList->AfsTrace;
118 pExitStatus = pParameterList->pExitStatus;
119 strcpy(TargetDirectory, pParameterList->TargetDirectory);
120 strcpy(CommandLine, pParameterList->CommandLine);
121 strcpy(ClientText, pParameterList->ClientText);
122 strcpy(PathToSecondDir, pParameterList->PathToSecondDir);
123 strcpy(AfsLocker, pParameterList->AfsLocker);
124 strcpy(HostName, pParameterList->HostName);
125 WinCommandInfo = ( struct cmd_struct *)pParameterList->CommandInfo;
127 sprintf(EventName, "%d%sEvent%05d", ProcessID, HostName, ProcessNumber);
128 hWinEventHandle = OpenEvent(EVENT_ALL_ACCESS, TRUE, EventName);
130 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
131 GetCurrentDirectory(sizeof(WorkingDirectory), WorkingDirectory);
132 sprintf(temp, "%s\\log%05d\\%s", WorkingDirectory, LogID, HostName);
133 CreateDirectory(temp, NULL);
136 memset(ftable, '\0', sizeof(ftable[0]) * MAX_FILES);
137 IoBuffer = malloc(BufferSize);
140 strcpy(pExitStatus->Reason, "Unable to allocate buffer");
141 pExitStatus->ExitStatus = 1;
142 SetEvent(hWinEventHandle);
146 ShutDownEventHandle = CreateEvent(NULL, TRUE, FALSE, "AfsShutdownEvent");
147 PauseEventHandle = CreateEvent(NULL, TRUE, FALSE, "AfsPauseEvent");
148 ContinueEventHandle = CreateEvent(NULL, TRUE, FALSE, "AfsContinueEvent");
149 OSMutexHandle = CreateMutex(NULL, FALSE, "WinTortureOSMutex");
150 MutexHandle = CreateMutex(NULL, FALSE, "WinTortureMutex");
152 strcpy(OriginalAfsLocker, AfsLocker);
157 for (j = 0; j <= CMD_MAX_CMD; j++)
159 WinCommandInfo[j].count = 0;
160 WinCommandInfo[j].min_sec = 0;
161 WinCommandInfo[j].max_sec = 0;
162 WinCommandInfo[j].MilliSeconds = 0;
163 WinCommandInfo[j].total_sec = 0;
164 WinCommandInfo[j].total_sum_of_squares = 0;
165 WinCommandInfo[j].ErrorCount = 0;
166 WinCommandInfo[j].ErrorTime = 0;
167 ThreadCommandInfo[j].count = 0;
168 ThreadCommandInfo[j].min_sec = 1000;
169 ThreadCommandInfo[j].max_sec = 0;
170 ThreadCommandInfo[j].MilliSeconds = 0;
171 ThreadCommandInfo[j].total_sec = 0;
172 ThreadCommandInfo[j].total_sum_of_squares = 0;
173 ThreadCommandInfo[j].ErrorCount = 0;
174 ThreadCommandInfo[j].ErrorTime = 0;
177 run_netbench(ProcessNumber, ClientText, PathToSecondDir);
178 if (LastKnownError != ERROR_NETNAME_DELETED)
180 sprintf(temp, "entered error %d processing\n", LastKnownError);
181 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
183 count = strlen(pExitStatus->Reason);
185 memset(pExitStatus->Reason, '\0', count);
186 pExitStatus->ExitStatus = 0;
187 (*pThreadStatus) = 1;
190 while ((rc = IsOnline(OriginalAfsLocker)) != WINTORTURE_ASFDLL_ONLINE)
192 if ((count > 3) || (rc == WINTORTURE_ASFDLL_NOTFOUND) || (rc == WINTORTURE_ASFPIOCTL_NOTFOUND))
195 strcpy(temp, "AFS client appears to be off-line\n");
196 strcpy(pExitStatus->Reason, temp);
197 pExitStatus->ExitStatus = 1;
198 (*pThreadStatus) = 0;
200 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
201 strcpy(temp, "Stress test is terminating\n");
203 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
206 strcpy(temp, "AFS is online, sleeping 10 seconds before continuing\n");
207 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
211 sprintf(temp, "leaving error %d processing\n", LastKnownError);
212 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
218 for (j = 0; j <= CMD_MAX_CMD; j++)
220 WinCommandInfo[j].count += ThreadCommandInfo[j].count;
221 WinCommandInfo[j].min_sec += ThreadCommandInfo[j].min_sec;
222 WinCommandInfo[j].max_sec += ThreadCommandInfo[j].max_sec;
223 WinCommandInfo[j].total_sec += ThreadCommandInfo[j].total_sec;
224 WinCommandInfo[j].total_sum_of_squares += ThreadCommandInfo[j].total_sum_of_squares;
225 WinCommandInfo[j].ErrorCount += ThreadCommandInfo[j].ErrorCount;
226 WinCommandInfo[j].ErrorTime += ThreadCommandInfo[j].ErrorTime;
229 memset(WorkingDirectory, '\0', sizeof(WorkingDirectory));
230 GetCurrentDirectory(sizeof(WorkingDirectory), WorkingDirectory);
231 sprintf(FileName, "%s\\log%05d\\%s\\Thread_%05d_Stats.log", WorkingDirectory, LogID, HostName, ProcessNumber);
235 WaitForSingleObject(MutexHandle, 4 * 1000);
236 LogStats(FileName, 0, CurrentLoop, 0, 0, HostName, ProcessNumber, ThreadCommandInfo, CommandLine, TargetDirectory);
237 ReleaseMutex(MutexHandle);
240 LogStats(FileName, 1, CurrentLoop, 0, 0, HostName, ProcessNumber, ThreadCommandInfo,CommandLine, TargetDirectory);
242 SetEvent(hWinEventHandle);
243 CloseHandle(hWinEventHandle);
244 // CloseHandle(OSMutexHandle);
245 // CloseHandle(MutexHandle);
251 BOOL run_netbench(int client, char *ClientText, char *PathToSecondDir)
256 char *params[MAX_PARAMS];
266 DWORD TotalBytesRead;
268 enum states bm_state;
269 CRITICAL_SECTION CriticalSection;
272 InitializeCriticalSection(&CriticalSection);
274 sprintf(cname, "client%d", client);
276 sprintf(temp, "Started Iteration %d\n", CurrentLoop);
277 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
278 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
279 sprintf(temp, "Thread %d started\n", ProcessNumber);
280 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
281 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
283 hFile = CreateFile(ClientText, GENERIC_READ | STANDARD_RIGHTS_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
285 if (hFile == INVALID_HANDLE_VALUE)
291 StartSecondTime(CMD_NONAFS);
295 memset(line, '\0', sizeof(line));
297 rc = ReadFile(hFile, line, 128, &NumberOfBytes, NULL);
298 if (rc && NumberOfBytes == 0)
300 pPtr = strchr(line, '\n');
306 if ((*(pPtr - 1)) == '\r')
309 (*(pPtr - 1)) = '\0';
312 TotalBytesRead += (DWORD)(strlen(line) + IncreaseBy);
313 SetFilePointer(hFile, TotalBytesRead, 0, FILE_BEGIN);
315 if (rc = WaitForSingleObject(PauseEventHandle, 0) == WAIT_OBJECT_0)
317 strcpy(temp, "AFS suspend request received\n");
318 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
319 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
320 while (WaitForSingleObject(ContinueEventHandle, 5000) == WAIT_TIMEOUT);
321 strcpy(temp, "AFS continue request received\n");
322 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
323 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
325 if (rc = WaitForSingleObject(ShutDownEventHandle, 0) == WAIT_OBJECT_0)
327 strcpy(temp, "AFS shutdown request received\n");
328 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
329 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
333 if (strlen(line) == 0)
337 /*printf("[%d] %s\n", LineCount, line);*/
339 for (i = 0; i < MAX_PARAMS; i++)
342 SubstituteString(line,"client1", cname, sizeof(line));
343 sprintf(temp, "%s%05d", HostName, LogID);
344 SubstituteString(line,"clients", temp, sizeof(line));
345 SubstituteString(line,"\\\\afs\\locker", AfsLocker, sizeof(line));
346 if (strlen(PathToSecondDir) != 0)
347 SubstituteString(line,"\\\\afs\\lcolby", PathToSecondDir, sizeof(line));
351 EnterCriticalSection(&CriticalSection);
352 printf("Thread%05d - %-6d - %s\n", ProcessNumber, LineCount, line);
353 LeaveCriticalSection(&CriticalSection);
368 pPtr = strstr(pPtr, " ");
382 if (!strncmp(params[0],"SMB", 3))
384 printf("ERROR: You are using a dbench 1 load file\n");
385 if (GetHandleInformation((HANDLE)hWinEventHandle, &dwFlags))
388 if (!strcmp(params[0], "BM_SETUP"))
392 else if (!strcmp(params[0], "BM_WARMUP"))
394 bm_state = BM_WARMUP;
396 else if (!strcmp(params[0], "BM_MEASURE"))
398 bm_state = BM_MEASURE;
400 fprintf(stderr, "setting state to BM_MEASURE\n");
402 else if (!strcmp(params[0],"RECONNECT"))
405 fprintf(stderr, "Reconnecting ...\n");
407 else if (!strcmp(params[0], "SYNC"))
409 int length = atoi(params[1]), st = 0;
411 fprintf(stderr, "Syncing for %d seconds\n", length);
413 else if (!strcmp(params[0],"NTCreateX"))
415 if (nb_createx(params[1], ival(params[2]), ival(params[3]), ival(params[4])) == -1)
418 else if (!stricmp(params[0],"SetLocker"))
420 if (nb_SetLocker(params[1]) == -1)
423 else if (!stricmp(params[0],"Xrmdir"))
425 if (nb_Xrmdir(params[1], params[2]) == -1)
428 else if (!stricmp(params[0],"Mkdir"))
430 if (nb_Mkdir(params[1]) == -1)
433 else if (!stricmp(params[0],"Attach"))
435 if (nb_Attach(params[1], params[2]) == -1)
438 else if (!stricmp(params[0],"Detach"))
440 if (nb_Detach(params[1], params[2]) == -1)
443 else if (!stricmp(params[0],"CreateFile"))
445 if (nb_CreateFile(params[1], atol(params[2])) == -1)
448 else if (!stricmp(params[0],"CopyFiles"))
450 if (nb_CopyFile(params[1], params[2]) == -1)
453 else if (!stricmp(params[0],"DeleteFiles"))
455 if (nb_DeleteFile(params[1]) == -1)
458 else if (!stricmp(params[0],"Move"))
460 if (nb_Move(params[1], params[2]) == -1)
463 else if (!stricmp(params[0],"Xcopy"))
465 if (nb_xcopy(params[1], params[2]) == -1)
468 else if (!strcmp(params[0],"Close"))
470 if (nb_close(ival(params[1])) == -1)
473 else if (!strcmp(params[0],"Rename"))
475 if (nb_rename(params[1], params[2]) == -1)
478 else if (!strcmp(params[0],"Unlink"))
480 if (nb_unlink(params[1]) == -1)
483 else if (!strcmp(params[0],"Deltree"))
485 if (nb_deltree(params[1]) == -1)
488 else if (!strcmp(params[0],"Rmdir"))
490 if (nb_rmdir(params[1]) == -1)
493 else if (!strcmp(params[0],"QUERY_PATH_INFORMATION"))
495 if (nb_qpathinfo(params[1], ival(params[2])) == -1)
498 else if (!strcmp(params[0],"QUERY_FILE_INFORMATION"))
500 if (nb_qfileinfo(ival(params[1])) == -1)
503 else if (!strcmp(params[0],"QUERY_FS_INFORMATION"))
505 if (nb_qfsinfo(ival(params[1])) == -1)
508 else if (!strcmp(params[0],"FIND_FIRST"))
510 if (nb_findfirst(params[1]) == -1)
513 else if (!strcmp(params[0],"WriteX"))
515 if (nb_writex(ival(params[1]), ival(params[2]), ival(params[3]), ival(params[4])) == -1)
518 else if (!strcmp(params[0],"ReadX"))
520 if (nb_readx(ival(params[1]), ival(params[2]), ival(params[3]), ival(params[4])) == -1)
523 else if (!strcmp(params[0],"Flush"))
525 if (nb_flush(ival(params[1])) == -1)
528 else if (!strcmp(params[0],"LockingX"))
530 if (nb_lock(ival(params[1]), ival(params[2]), ival(params[3]), ival(params[4]),
531 (unsigned char)ival(params[5]), ival(params[6])) == -1)
536 printf("Unknown operation %s\n", params[0]);
537 printf("Line read = %s\n", line1);
543 // nb_cleanup(cname);
545 EndSecondTime(CMD_NONAFS);
547 for (i = 0; i < MAX_FILES; i++)
549 if (ftable[i].handle > 0)
550 nb_close(ftable[i].handle);
553 DeleteCriticalSection(&CriticalSection);
558 typedef long ( __cdecl *PPIOCTL)(char *pathp, long opcode, struct ViceIoctl *blobp, int follow);
560 int IsOnline(char *strPath)
566 struct ViceIoctl blob;
567 struct VolumeStatus *status;
571 rc = WaitForSingleObject(OSMutexHandle, 5 * 1000);
574 hAfsDll = LoadLibrary(AFSDLL);
578 ppioctl = (PPIOCTL)GetProcAddress(hAfsDll, "pioctl");
582 blob.out_size = sizeof(space);
584 if (!(code = ppioctl(strPath, VIOCGETVOLSTAT, &blob, 1)))
586 bret = WINTORTURE_ASFDLL_ONLINE;
587 status = (VolumeStatus *)space;
588 if (!status->Online || !status->InService || !status->Blessed || status->NeedsSalvage)
589 bret = WINTORTURE_ASFDLL_OFFLINE;
593 bret = WINTORTURE_ASFPIOCTL_NOTFOUND;
595 FreeLibrary(hAfsDll);
599 bret = WINTORTURE_ASFDLL_NOTFOUND;
601 if (rc == WAIT_OBJECT_0)
602 ReleaseMutex(OSMutexHandle);