5 #include "ResolveLocker.h"
6 int ResolveLocker(USER_OPTIONS *attachOption);
9 #include <smb_iocons.h>
11 #include <pioctl_nt.h>
13 #define VIOCGETVOLSTAT 0x7
26 afs_int32 BlocksInUse;
27 afs_int32 PartBlocksAvail;
28 afs_int32 PartMaxBlocks;
31 typedef struct VolumeStatus VolumeStatus;
33 typedef struct ViceIoctl {
40 long pioctl(char *pathp, long opcode, struct ViceIoctl *blob, int follow);
43 #define ival(s) strtol(s, NULL, 0)
44 #define AFSDLL "afsauthent.dll"
46 #define WINTORTURE_ASFDLL_ONLINE 1
47 #define WINTORTURE_ASFDLL_OFFLINE 2
48 #define WINTORTURE_ASFDLL_NOTFOUND 3
49 #define WINTORTURE_ASFPIOCTL_NOTFOUND 4
53 extern void EndSecondTime(int cmd);
54 extern void StartSecondTime(int cmd);
55 extern void LogMessage(int ProcessNumber, char *HostName, char *FileName, char *message, int LogID);
56 extern void LogStats(char *FileName, int ToLog, int Iteration, int NumberOfProcesses, int NumberOfThreads,
57 char *HostName, int ProcessNumber, struct cmd_struct ThreadCommandInfo[],
58 char *CommandLine, char *TargetDirectory);
59 extern void SubstituteString(char *s,const char *pattern,const char *insert, size_t len);
61 int IsOnline(char *strPath);
62 BOOL run_netbench(int client, char *ClientTxt, char *PathToSecondDir);
65 HANDLE FileMutexHandle;
66 HANDLE ShutDownEventHandle;
67 HANDLE PauseEventHandle;
68 HANDLE ContinueEventHandle;
71 __declspec( thread ) int AfsTrace;
72 __declspec( thread ) int CurrentLoop;
73 __declspec( thread ) int ProcessNumber = 0;
74 __declspec( thread ) int LogID = 0;
75 __declspec( thread ) int LineCount = 0;
76 __declspec( thread ) int *pThreadStatus;
77 __declspec( thread ) DWORD TickCount1,TickCount2, MilliTickStart;
78 __declspec( thread ) char *IoBuffer = NULL;
79 __declspec( thread ) char AfsLocker[256];
80 __declspec( thread ) char OriginalAfsLocker[256];
81 __declspec( thread ) char HostName[256];
82 __declspec( thread ) struct cmd_struct ThreadCommandInfo[CMD_MAX_CMD + 1];
83 __declspec( thread ) FTABLE ftable[MAX_FILES];
84 __declspec( thread ) HANDLE hWinEventHandle;
85 __declspec( thread ) EXIT_STATUS *pExitStatus;
86 __declspec( thread ) DWORD LastKnownError;
89 DWORD WINAPI StressTestThread(LPVOID lpThreadParameter)
98 char CommandLine[512];
99 char TargetDirectory[512];
100 char WorkingDirectory[512];
101 char ClientText[128];
102 char PathToSecondDir[256];
105 PARAMETERLIST *pParameterList;
106 struct cmd_struct *WinCommandInfo;
108 pParameterList = (PARAMETERLIST *)lpThreadParameter;
109 pThreadStatus = pParameterList->pThreadStatus;
110 BufferSize = pParameterList->BufferSize;
111 ProcessNumber = pParameterList->ProcessNumber;
112 PrintStats = pParameterList->PrintStats;
113 CurrentLoop = pParameterList->CurrentLoop;
114 ProcessID = pParameterList->ProcessID;
115 LogID = pParameterList->LogID;
116 AfsTrace = pParameterList->AfsTrace;
117 pExitStatus = pParameterList->pExitStatus;
118 strcpy(TargetDirectory, pParameterList->TargetDirectory);
119 strcpy(CommandLine, pParameterList->CommandLine);
120 strcpy(ClientText, pParameterList->ClientText);
121 strcpy(PathToSecondDir, pParameterList->PathToSecondDir);
122 strcpy(AfsLocker, pParameterList->AfsLocker);
123 strcpy(HostName, pParameterList->HostName);
124 WinCommandInfo = ( struct cmd_struct *)pParameterList->CommandInfo;
126 sprintf(EventName, "%d%sEvent%05d", ProcessID, HostName, ProcessNumber);
127 hWinEventHandle = OpenEvent(EVENT_ALL_ACCESS, TRUE, EventName);
129 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
130 GetCurrentDirectory(sizeof(WorkingDirectory), WorkingDirectory);
131 sprintf(temp, "%s\\log%05d\\%s", WorkingDirectory, LogID, HostName);
132 CreateDirectory(temp, NULL);
135 memset(ftable, '\0', sizeof(ftable[0]) * MAX_FILES);
136 IoBuffer = malloc(BufferSize);
139 strcpy(pExitStatus->Reason, "Unable to allocate buffer");
140 pExitStatus->ExitStatus = 1;
141 SetEvent(hWinEventHandle);
145 ShutDownEventHandle = CreateEvent(NULL, TRUE, FALSE, "AfsShutdownEvent");
146 PauseEventHandle = CreateEvent(NULL, TRUE, FALSE, "AfsPauseEvent");
147 ContinueEventHandle = CreateEvent(NULL, TRUE, FALSE, "AfsContinueEvent");
148 OSMutexHandle = CreateMutex(NULL, FALSE, "WinTortureOSMutex");
149 MutexHandle = CreateMutex(NULL, FALSE, "WinTortureMutex");
151 strcpy(OriginalAfsLocker, AfsLocker);
156 for (j = 0; j <= CMD_MAX_CMD; j++)
158 WinCommandInfo[j].count = 0;
159 WinCommandInfo[j].min_sec = 0;
160 WinCommandInfo[j].max_sec = 0;
161 WinCommandInfo[j].MilliSeconds = 0;
162 WinCommandInfo[j].total_sec = 0;
163 WinCommandInfo[j].total_sum_of_squares = 0;
164 WinCommandInfo[j].ErrorCount = 0;
165 WinCommandInfo[j].ErrorTime = 0;
166 ThreadCommandInfo[j].count = 0;
167 ThreadCommandInfo[j].min_sec = 1000;
168 ThreadCommandInfo[j].max_sec = 0;
169 ThreadCommandInfo[j].MilliSeconds = 0;
170 ThreadCommandInfo[j].total_sec = 0;
171 ThreadCommandInfo[j].total_sum_of_squares = 0;
172 ThreadCommandInfo[j].ErrorCount = 0;
173 ThreadCommandInfo[j].ErrorTime = 0;
176 run_netbench(ProcessNumber, ClientText, PathToSecondDir);
177 if (LastKnownError != ERROR_NETNAME_DELETED)
179 sprintf(temp, "entered error %d processing\n", LastKnownError);
180 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
182 count = strlen(pExitStatus->Reason);
184 memset(pExitStatus->Reason, '\0', count);
185 pExitStatus->ExitStatus = 0;
186 (*pThreadStatus) = 1;
189 while ((rc = IsOnline(OriginalAfsLocker)) != WINTORTURE_ASFDLL_ONLINE)
191 if ((count > 3) || (rc == WINTORTURE_ASFDLL_NOTFOUND) || (rc == WINTORTURE_ASFPIOCTL_NOTFOUND))
194 strcpy(temp, "AFS client appears to be off-line\n");
195 strcpy(pExitStatus->Reason, temp);
196 pExitStatus->ExitStatus = 1;
197 (*pThreadStatus) = 0;
199 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
200 strcpy(temp, "Stress test is terminating\n");
202 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
205 strcpy(temp, "AFS is online, sleeping 10 seconds before continuing\n");
206 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
210 sprintf(temp, "leaving error %d processing\n", LastKnownError);
211 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
217 for (j = 0; j <= CMD_MAX_CMD; j++)
219 WinCommandInfo[j].count += ThreadCommandInfo[j].count;
220 WinCommandInfo[j].min_sec += ThreadCommandInfo[j].min_sec;
221 WinCommandInfo[j].max_sec += ThreadCommandInfo[j].max_sec;
222 WinCommandInfo[j].total_sec += ThreadCommandInfo[j].total_sec;
223 WinCommandInfo[j].total_sum_of_squares += ThreadCommandInfo[j].total_sum_of_squares;
224 WinCommandInfo[j].ErrorCount += ThreadCommandInfo[j].ErrorCount;
225 WinCommandInfo[j].ErrorTime += ThreadCommandInfo[j].ErrorTime;
228 memset(WorkingDirectory, '\0', sizeof(WorkingDirectory));
229 GetCurrentDirectory(sizeof(WorkingDirectory), WorkingDirectory);
230 sprintf(FileName, "%s\\log%05d\\%s\\Thread_%05d_Stats.log", WorkingDirectory, LogID, HostName, ProcessNumber);
234 WaitForSingleObject(MutexHandle, 4 * 1000);
235 LogStats(FileName, 0, CurrentLoop, 0, 0, HostName, ProcessNumber, ThreadCommandInfo, CommandLine, TargetDirectory);
236 ReleaseMutex(MutexHandle);
239 LogStats(FileName, 1, CurrentLoop, 0, 0, HostName, ProcessNumber, ThreadCommandInfo,CommandLine, TargetDirectory);
241 SetEvent(hWinEventHandle);
242 CloseHandle(hWinEventHandle);
243 // CloseHandle(OSMutexHandle);
244 // CloseHandle(MutexHandle);
250 BOOL run_netbench(int client, char *ClientText, char *PathToSecondDir)
255 char *params[MAX_PARAMS];
265 DWORD TotalBytesRead;
267 enum states bm_state;
268 CRITICAL_SECTION CriticalSection;
271 InitializeCriticalSection(&CriticalSection);
273 sprintf(cname, "client%d", client);
275 sprintf(temp, "Started Iteration %d\n", CurrentLoop);
276 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
277 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
278 sprintf(temp, "Thread %d started\n", ProcessNumber);
279 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
280 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
282 hFile = CreateFile(ClientText, GENERIC_READ | STANDARD_RIGHTS_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
284 if (hFile == INVALID_HANDLE_VALUE)
290 StartSecondTime(CMD_NONAFS);
294 memset(line, '\0', sizeof(line));
296 rc = ReadFile(hFile, line, 128, &NumberOfBytes, NULL);
297 if (rc && NumberOfBytes == 0)
299 pPtr = strchr(line, '\n');
305 if ((*(pPtr - 1)) == '\r')
308 (*(pPtr - 1)) = '\0';
311 TotalBytesRead += (strlen(line) + IncreaseBy);
312 SetFilePointer(hFile, TotalBytesRead, 0, FILE_BEGIN);
314 if (rc = WaitForSingleObject(PauseEventHandle, 0) == WAIT_OBJECT_0)
316 strcpy(temp, "AFS suspend request received\n");
317 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
318 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
319 while (WaitForSingleObject(ContinueEventHandle, 5000) == WAIT_TIMEOUT);
320 strcpy(temp, "AFS continue request received\n");
321 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
322 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
324 if (rc = WaitForSingleObject(ShutDownEventHandle, 0) == WAIT_OBJECT_0)
326 strcpy(temp, "AFS shutdown request received\n");
327 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
328 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
332 if (strlen(line) == 0)
336 /*printf("[%d] %s\n", LineCount, line);*/
338 for (i = 0; i < MAX_PARAMS; i++)
341 SubstituteString(line,"client1", cname, sizeof(line));
342 sprintf(temp, "%s%05d", HostName, LogID);
343 SubstituteString(line,"clients", temp, sizeof(line));
344 SubstituteString(line,"\\\\afs\\locker", AfsLocker, sizeof(line));
345 if (strlen(PathToSecondDir) != 0)
346 SubstituteString(line,"\\\\afs\\lcolby", PathToSecondDir, sizeof(line));
350 EnterCriticalSection(&CriticalSection);
351 printf("Thread%05d - %-6d - %s\n", ProcessNumber, LineCount, line);
352 LeaveCriticalSection(&CriticalSection);
367 pPtr = strstr(pPtr, " ");
381 if (!strncmp(params[0],"SMB", 3))
383 printf("ERROR: You are using a dbench 1 load file\n");
384 if (GetHandleInformation((HANDLE)hWinEventHandle, &dwFlags))
387 if (!strcmp(params[0], "BM_SETUP"))
391 else if (!strcmp(params[0], "BM_WARMUP"))
393 bm_state = BM_WARMUP;
395 else if (!strcmp(params[0], "BM_MEASURE"))
397 bm_state = BM_MEASURE;
399 fprintf(stderr, "setting state to BM_MEASURE\n");
401 else if (!strcmp(params[0],"RECONNECT"))
404 fprintf(stderr, "Reconnecting ...\n");
406 else if (!strcmp(params[0], "SYNC"))
408 int length = atoi(params[1]), st = 0;
410 fprintf(stderr, "Syncing for %d seconds\n", length);
412 else if (!strcmp(params[0],"NTCreateX"))
414 if (nb_createx(params[1], ival(params[2]), ival(params[3]), ival(params[4])) == -1)
417 else if (!stricmp(params[0],"SetLocker"))
419 if (nb_SetLocker(params[1]) == -1)
422 else if (!stricmp(params[0],"Xrmdir"))
424 if (nb_Xrmdir(params[1], params[2]) == -1)
427 else if (!stricmp(params[0],"Mkdir"))
429 if (nb_Mkdir(params[1]) == -1)
432 else if (!stricmp(params[0],"Attach"))
434 if (nb_Attach(params[1], params[2]) == -1)
437 else if (!stricmp(params[0],"Detach"))
439 if (nb_Detach(params[1], params[2]) == -1)
442 else if (!stricmp(params[0],"CreateFile"))
444 if (nb_CreateFile(params[1], atol(params[2])) == -1)
447 else if (!stricmp(params[0],"CopyFiles"))
449 if (nb_CopyFile(params[1], params[2]) == -1)
452 else if (!stricmp(params[0],"DeleteFiles"))
454 if (nb_DeleteFile(params[1]) == -1)
457 else if (!stricmp(params[0],"Move"))
459 if (nb_Move(params[1], params[2]) == -1)
462 else if (!stricmp(params[0],"Xcopy"))
464 if (nb_xcopy(params[1], params[2]) == -1)
467 else if (!strcmp(params[0],"Close"))
469 if (nb_close(ival(params[1])) == -1)
472 else if (!strcmp(params[0],"Rename"))
474 if (nb_rename(params[1], params[2]) == -1)
477 else if (!strcmp(params[0],"Unlink"))
479 if (nb_unlink(params[1]) == -1)
482 else if (!strcmp(params[0],"Deltree"))
484 if (nb_deltree(params[1]) == -1)
487 else if (!strcmp(params[0],"Rmdir"))
489 if (nb_rmdir(params[1]) == -1)
492 else if (!strcmp(params[0],"QUERY_PATH_INFORMATION"))
494 if (nb_qpathinfo(params[1], ival(params[2])) == -1)
497 else if (!strcmp(params[0],"QUERY_FILE_INFORMATION"))
499 if (nb_qfileinfo(ival(params[1])) == -1)
502 else if (!strcmp(params[0],"QUERY_FS_INFORMATION"))
504 if (nb_qfsinfo(ival(params[1])) == -1)
507 else if (!strcmp(params[0],"FIND_FIRST"))
509 if (nb_findfirst(params[1]) == -1)
512 else if (!strcmp(params[0],"WriteX"))
514 if (nb_writex(ival(params[1]), ival(params[2]), ival(params[3]), ival(params[4])) == -1)
517 else if (!strcmp(params[0],"ReadX"))
519 if (nb_readx(ival(params[1]), ival(params[2]), ival(params[3]), ival(params[4])) == -1)
522 else if (!strcmp(params[0],"Flush"))
524 if (nb_flush(ival(params[1])) == -1)
527 else if (!strcmp(params[0],"LockingX"))
529 if (nb_lock(ival(params[1]), ival(params[2]), ival(params[3]), ival(params[4]),
530 (unsigned char)ival(params[5]), ival(params[6])) == -1)
535 printf("Unknown operation %s\n", params[0]);
536 printf("Line read = %s\n", line1);
542 // nb_cleanup(cname);
544 EndSecondTime(CMD_NONAFS);
546 for (i = 0; i < MAX_FILES; i++)
548 if (ftable[i].handle > 0)
549 nb_close(ftable[i].handle);
552 DeleteCriticalSection(&CriticalSection);
557 typedef long ( __cdecl *PPIOCTL)(char *pathp, long opcode, struct ViceIoctl *blobp, int follow);
559 int IsOnline(char *strPath)
565 struct ViceIoctl blob;
566 struct VolumeStatus *status;
570 rc = WaitForSingleObject(OSMutexHandle, 5 * 1000);
573 hAfsDll = LoadLibrary(AFSDLL);
577 ppioctl = (PPIOCTL)GetProcAddress(hAfsDll, "pioctl");
581 blob.out_size = sizeof(space);
583 if (!(code = ppioctl(strPath, VIOCGETVOLSTAT, &blob, 1)))
585 bret = WINTORTURE_ASFDLL_ONLINE;
586 status = (VolumeStatus *)space;
587 if (!status->Online || !status->InService || !status->Blessed || status->NeedsSalvage)
588 bret = WINTORTURE_ASFDLL_OFFLINE;
592 bret = WINTORTURE_ASFPIOCTL_NOTFOUND;
594 FreeLibrary(hAfsDll);
598 bret = WINTORTURE_ASFDLL_NOTFOUND;
600 if (rc == WAIT_OBJECT_0)
601 ReleaseMutex(OSMutexHandle);