6 #include "ResolveLocker.h"
7 int ResolveLocker(USER_OPTIONS *attachOption);
11 #include <afs\smb_iocons.h>
12 #include <afs\afsint.h>
13 #include <afs\pioctl_nt.h>
15 #define VIOCGETVOLSTAT 0x7
28 afs_int32 BlocksInUse;
29 afs_int32 PartBlocksAvail;
30 afs_int32 PartMaxBlocks;
33 typedef struct VolumeStatus VolumeStatus;
35 typedef struct ViceIoctl {
41 extern long pioctl(char *pathp, long opcode, struct ViceIoctl *blob, int follow);
45 #define ival(s) strtol(s, NULL, 0)
46 #define AFSDLL "afsauthent.dll"
48 #define WINTORTURE_ASFDLL_ONLINE 1
49 #define WINTORTURE_ASFDLL_OFFLINE 2
50 #define WINTORTURE_ASFDLL_NOTFOUND 3
51 #define WINTORTURE_ASFPIOCTL_NOTFOUND 4
55 extern void EndSecondTime(int cmd);
56 extern void StartSecondTime(int cmd);
57 extern void LogMessage(int ProcessNumber, char *HostName, char *FileName, char *message, int LogID);
58 extern void LogStats(char *FileName, int ToLog, int Iteration, int NumberOfProcesses, int NumberOfThreads,
59 char *HostName, int ProcessNumber, struct cmd_struct ThreadCommandInfo[],
60 char *CommandLine, char *TargetDirectory);
61 extern void SubstituteString(char *s,const char *pattern,const char *insert, size_t len);
63 int IsOnline(char *strPath);
64 BOOL run_netbench(int client, char *ClientTxt, char *PathToSecondDir);
67 HANDLE FileMutexHandle;
68 HANDLE ShutDownEventHandle;
69 HANDLE PauseEventHandle;
70 HANDLE ContinueEventHandle;
73 __declspec( thread ) int AfsTrace;
74 __declspec( thread ) int CurrentLoop;
75 __declspec( thread ) int ProcessNumber = 0;
76 __declspec( thread ) int LogID = 0;
77 __declspec( thread ) int LineCount = 0;
78 __declspec( thread ) int *pThreadStatus;
79 __declspec( thread ) DWORD TickCount1,TickCount2, MilliTickStart;
80 __declspec( thread ) int BufferSize = 4096;
81 __declspec( thread ) char *IoBuffer = NULL;
82 __declspec( thread ) char AfsLocker[256];
83 __declspec( thread ) char OriginalAfsLocker[256];
84 __declspec( thread ) char HostName[256];
85 __declspec( thread ) struct cmd_struct ThreadCommandInfo[CMD_MAX_CMD + 1];
86 __declspec( thread ) FTABLE ftable[MAX_FILES];
87 __declspec( thread ) HANDLE hWinEventHandle;
88 __declspec( thread ) EXIT_STATUS *pExitStatus;
89 __declspec( thread ) DWORD LastKnownError;
92 DWORD WINAPI StressTestThread(LPVOID lpThreadParameter)
100 char CommandLine[512];
101 char TargetDirectory[512];
102 char WorkingDirectory[512];
103 char ClientText[128];
104 char PathToSecondDir[256];
107 PARAMETERLIST *pParameterList;
108 struct cmd_struct *WinCommandInfo;
110 pParameterList = (PARAMETERLIST *)lpThreadParameter;
111 pThreadStatus = pParameterList->pThreadStatus;
112 BufferSize = pParameterList->BufferSize;
113 ProcessNumber = pParameterList->ProcessNumber;
114 PrintStats = pParameterList->PrintStats;
115 CurrentLoop = pParameterList->CurrentLoop;
116 ProcessID = pParameterList->ProcessID;
117 LogID = pParameterList->LogID;
118 AfsTrace = pParameterList->AfsTrace;
119 pExitStatus = pParameterList->pExitStatus;
120 strcpy(TargetDirectory, pParameterList->TargetDirectory);
121 strcpy(CommandLine, pParameterList->CommandLine);
122 strcpy(ClientText, pParameterList->ClientText);
123 strcpy(PathToSecondDir, pParameterList->PathToSecondDir);
124 strcpy(AfsLocker, pParameterList->AfsLocker);
125 strcpy(HostName, pParameterList->HostName);
126 WinCommandInfo = ( struct cmd_struct *)pParameterList->CommandInfo;
128 sprintf(EventName, "%d%sEvent%05d", ProcessID, HostName, ProcessNumber);
129 hWinEventHandle = OpenEvent(EVENT_ALL_ACCESS, TRUE, EventName);
131 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
132 GetCurrentDirectory(sizeof(WorkingDirectory), WorkingDirectory);
133 sprintf(temp, "%s\\log%05d\\%s", WorkingDirectory, LogID, HostName);
134 CreateDirectory(temp, NULL);
137 memset(ftable, '\0', sizeof(ftable[0]) * MAX_FILES);
138 IoBuffer = malloc(BufferSize);
141 strcpy(pExitStatus->Reason, "Unable to allocate buffer");
142 pExitStatus->ExitStatus = 1;
143 SetEvent(hWinEventHandle);
146 memset(IoBuffer, (unsigned char)getpid(), BufferSize);
148 ShutDownEventHandle = CreateEvent(NULL, TRUE, FALSE, "AfsShutdownEvent");
149 PauseEventHandle = CreateEvent(NULL, TRUE, FALSE, "AfsPauseEvent");
150 ContinueEventHandle = CreateEvent(NULL, TRUE, FALSE, "AfsContinueEvent");
151 OSMutexHandle = CreateMutex(NULL, FALSE, "WinTortureOSMutex");
152 MutexHandle = CreateMutex(NULL, FALSE, "WinTortureMutex");
154 strcpy(OriginalAfsLocker, AfsLocker);
159 for (j = 0; j <= CMD_MAX_CMD; j++)
161 WinCommandInfo[j].count = 0;
162 WinCommandInfo[j].min_sec = 0;
163 WinCommandInfo[j].max_sec = 0;
164 WinCommandInfo[j].MilliSeconds = 0;
165 WinCommandInfo[j].total_sec = 0;
166 WinCommandInfo[j].total_sum_of_squares = 0;
167 WinCommandInfo[j].ErrorCount = 0;
168 WinCommandInfo[j].ErrorTime = 0;
169 ThreadCommandInfo[j].count = 0;
170 ThreadCommandInfo[j].min_sec = 1000;
171 ThreadCommandInfo[j].max_sec = 0;
172 ThreadCommandInfo[j].MilliSeconds = 0;
173 ThreadCommandInfo[j].total_sec = 0;
174 ThreadCommandInfo[j].total_sum_of_squares = 0;
175 ThreadCommandInfo[j].ErrorCount = 0;
176 ThreadCommandInfo[j].ErrorTime = 0;
179 run_netbench(ProcessNumber, ClientText, PathToSecondDir);
180 if (LastKnownError != ERROR_NETNAME_DELETED)
182 sprintf(temp, "entered error %d processing\n", LastKnownError);
183 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
185 count = strlen(pExitStatus->Reason);
187 memset(pExitStatus->Reason, '\0', count);
188 pExitStatus->ExitStatus = 0;
189 (*pThreadStatus) = 1;
192 while ((rc = IsOnline(OriginalAfsLocker)) != WINTORTURE_ASFDLL_ONLINE)
194 if ((count > 3) || (rc == WINTORTURE_ASFDLL_NOTFOUND) || (rc == WINTORTURE_ASFPIOCTL_NOTFOUND))
197 sprintf(temp, "AFS path \"%s\" appears to be off-line\n", OriginalAfsLocker);
198 strcpy(pExitStatus->Reason, temp);
199 pExitStatus->ExitStatus = 1;
200 (*pThreadStatus) = 0;
202 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
203 strcpy(temp, "Stress test is terminating\n");
205 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
208 sprintf(temp, "AFS path \"%s\" is online, sleeping 10 seconds before continuing\n", OriginalAfsLocker);
209 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
213 sprintf(temp, "leaving error 0x%x processing\n", LastKnownError);
214 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
220 for (j = 0; j <= CMD_MAX_CMD; j++)
222 WinCommandInfo[j].count += ThreadCommandInfo[j].count;
223 WinCommandInfo[j].min_sec += ThreadCommandInfo[j].min_sec;
224 WinCommandInfo[j].max_sec += ThreadCommandInfo[j].max_sec;
225 WinCommandInfo[j].total_sec += ThreadCommandInfo[j].total_sec;
226 WinCommandInfo[j].total_sum_of_squares += ThreadCommandInfo[j].total_sum_of_squares;
227 WinCommandInfo[j].ErrorCount += ThreadCommandInfo[j].ErrorCount;
228 WinCommandInfo[j].ErrorTime += ThreadCommandInfo[j].ErrorTime;
231 memset(WorkingDirectory, '\0', sizeof(WorkingDirectory));
232 GetCurrentDirectory(sizeof(WorkingDirectory), WorkingDirectory);
233 sprintf(FileName, "%s\\log%05d\\%s\\Thread_%05d_Stats.log", WorkingDirectory, LogID, HostName, ProcessNumber);
237 WaitForSingleObject(MutexHandle, 4 * 1000);
238 LogStats(FileName, 0, CurrentLoop, 0, 0, HostName, ProcessNumber, ThreadCommandInfo, CommandLine, TargetDirectory);
239 ReleaseMutex(MutexHandle);
242 LogStats(FileName, 1, CurrentLoop, 0, 0, HostName, ProcessNumber, ThreadCommandInfo,CommandLine, TargetDirectory);
244 SetEvent(hWinEventHandle);
245 CloseHandle(hWinEventHandle);
246 // CloseHandle(OSMutexHandle);
247 // CloseHandle(MutexHandle);
253 BOOL run_netbench(int client, char *ClientText, char *PathToSecondDir)
258 char *params[MAX_PARAMS];
268 DWORD TotalBytesRead;
270 enum states bm_state;
271 CRITICAL_SECTION CriticalSection;
274 InitializeCriticalSection(&CriticalSection);
276 sprintf(cname, "client%d", client);
278 sprintf(temp, "Started Iteration %d\n", CurrentLoop);
279 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
280 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
281 sprintf(temp, "Thread %d started\n", ProcessNumber);
282 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
283 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
285 hFile = CreateFile(ClientText, GENERIC_READ | STANDARD_RIGHTS_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
287 if (hFile == INVALID_HANDLE_VALUE)
293 StartSecondTime(CMD_NONAFS);
297 memset(line, '\0', sizeof(line));
299 rc = ReadFile(hFile, line, 128, &NumberOfBytes, NULL);
300 if (rc && NumberOfBytes == 0)
302 pPtr = strchr(line, '\n');
308 if ((*(pPtr - 1)) == '\r')
311 (*(pPtr - 1)) = '\0';
314 TotalBytesRead += (DWORD)(strlen(line) + IncreaseBy);
315 SetFilePointer(hFile, TotalBytesRead, 0, FILE_BEGIN);
317 if (rc = WaitForSingleObject(PauseEventHandle, 0) == WAIT_OBJECT_0)
319 strcpy(temp, "AFS suspend request received\n");
320 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
321 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
322 while (WaitForSingleObject(ContinueEventHandle, 5000) == WAIT_TIMEOUT);
323 strcpy(temp, "AFS continue request received\n");
324 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
325 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
327 if (rc = WaitForSingleObject(ShutDownEventHandle, 0) == WAIT_OBJECT_0)
329 strcpy(temp, "AFS shutdown request received\n");
330 sprintf(FileName, "Thread_%05d.log", ProcessNumber);
331 LogMessage(ProcessNumber, HostName, FileName, temp, LogID);
335 if (strlen(line) == 0)
339 /*printf("[%d] %s\n", LineCount, line);*/
341 for (i = 0; i < MAX_PARAMS; i++)
344 SubstituteString(line,"client1", cname, sizeof(line));
345 sprintf(temp, "%s%05d", HostName, LogID);
346 SubstituteString(line,"clients", temp, sizeof(line));
347 SubstituteString(line,"\\\\afs\\locker", AfsLocker, sizeof(line));
348 if (strlen(PathToSecondDir) != 0)
349 SubstituteString(line,"\\\\afs\\lcolby", PathToSecondDir, sizeof(line));
353 EnterCriticalSection(&CriticalSection);
354 printf("Thread%05d - %-6d - %s\n", ProcessNumber, LineCount, line);
355 LeaveCriticalSection(&CriticalSection);
370 pPtr = strstr(pPtr, " ");
384 if (!strncmp(params[0],"SMB", 3))
386 printf("ERROR: You are using a dbench 1 load file\n");
387 if (GetHandleInformation((HANDLE)hWinEventHandle, &dwFlags))
390 if (!strcmp(params[0], "BM_SETUP"))
394 else if (!strcmp(params[0], "BM_WARMUP"))
396 bm_state = BM_WARMUP;
398 else if (!strcmp(params[0], "BM_MEASURE"))
400 bm_state = BM_MEASURE;
402 fprintf(stderr, "setting state to BM_MEASURE\n");
404 else if (!strcmp(params[0],"RECONNECT"))
407 fprintf(stderr, "Reconnecting ...\n");
409 else if (!strcmp(params[0], "SYNC"))
411 int length = atoi(params[1]), st = 0;
413 fprintf(stderr, "Syncing for %d seconds\n", length);
415 else if (!strcmp(params[0],"NTCreateX"))
417 if (nb_createx(params[1], ival(params[2]), ival(params[3]), ival(params[4])) == -1)
420 else if (!stricmp(params[0],"SetLocker"))
422 if (nb_SetLocker(params[1]) == -1)
425 else if (!stricmp(params[0],"Xrmdir"))
427 if (nb_Xrmdir(params[1], params[2]) == -1)
430 else if (!stricmp(params[0],"Mkdir"))
432 if (nb_Mkdir(params[1]) == -1)
435 else if (!stricmp(params[0],"Attach"))
437 if (nb_Attach(params[1], params[2]) == -1)
440 else if (!stricmp(params[0],"Detach"))
442 if (nb_Detach(params[1], params[2]) == -1)
445 else if (!stricmp(params[0],"CreateFile"))
447 if (nb_CreateFile(params[1], atol(params[2])) == -1)
450 else if (!stricmp(params[0],"CopyFiles"))
452 if (nb_CopyFile(params[1], params[2]) == -1)
455 else if (!stricmp(params[0],"DeleteFiles"))
457 if (nb_DeleteFile(params[1]) == -1)
460 else if (!stricmp(params[0],"Move"))
462 if (nb_Move(params[1], params[2]) == -1)
465 else if (!stricmp(params[0],"Xcopy"))
467 if (nb_xcopy(params[1], params[2]) == -1)
470 else if (!strcmp(params[0],"Close"))
472 if (nb_close(ival(params[1])) == -1)
475 else if (!strcmp(params[0],"Rename"))
477 if (nb_rename(params[1], params[2]) == -1)
480 else if (!strcmp(params[0],"Unlink"))
482 if (nb_unlink(params[1]) == -1)
485 else if (!strcmp(params[0],"Deltree"))
487 if (nb_deltree(params[1]) == -1)
490 else if (!strcmp(params[0],"Rmdir"))
492 if (nb_rmdir(params[1]) == -1)
495 else if (!strcmp(params[0],"QUERY_PATH_INFORMATION"))
497 if (nb_qpathinfo(params[1], ival(params[2])) == -1)
500 else if (!strcmp(params[0],"QUERY_FILE_INFORMATION"))
502 if (nb_qfileinfo(ival(params[1])) == -1)
505 else if (!strcmp(params[0],"QUERY_FS_INFORMATION"))
507 if (nb_qfsinfo(ival(params[1])) == -1)
510 else if (!strcmp(params[0],"FIND_FIRST"))
512 if (nb_findfirst(params[1]) == -1)
515 else if (!strcmp(params[0],"WriteX"))
517 if (nb_writex(ival(params[1]), ival(params[2]), ival(params[3]), ival(params[4])) == -1)
520 else if (!strcmp(params[0],"ReadX"))
522 if (nb_readx(ival(params[1]), ival(params[2]), ival(params[3]), ival(params[4])) == -1)
525 else if (!strcmp(params[0],"Flush"))
527 if (nb_flush(ival(params[1])) == -1)
530 else if (!strcmp(params[0],"LockingX"))
532 if (nb_lock(ival(params[1]), ival(params[2]), ival(params[3]), ival(params[4]),
533 (unsigned char)ival(params[5]), ival(params[6])) == -1)
538 printf("Unknown operation %s\n", params[0]);
539 printf("Line read = %s\n", line1);
545 // nb_cleanup(cname);
547 EndSecondTime(CMD_NONAFS);
549 for (i = 0; i < MAX_FILES; i++)
551 if (ftable[i].handle > 0)
552 nb_close(ftable[i].handle);
555 DeleteCriticalSection(&CriticalSection);
560 typedef long ( __cdecl *PPIOCTL)(char *pathp, long opcode, struct ViceIoctl *blobp, int follow);
562 int IsOnline(char *strPath)
568 struct ViceIoctl blob;
569 struct VolumeStatus *status;
570 static PPIOCTL ppioctl = NULL;
571 static HINSTANCE hAfsDll = NULL;
573 rc = WaitForSingleObject(OSMutexHandle, 5 * 1000);
576 hAfsDll = LoadLibrary(AFSDLL);
580 ppioctl = (PPIOCTL)GetProcAddress(hAfsDll, "pioctl");
584 blob.out_size = sizeof(space);
587 if (!(code = ppioctl(strPath, VIOCGETVOLSTAT, &blob, 1)))
589 bret = WINTORTURE_ASFDLL_ONLINE;
590 status = (VolumeStatus *)space;
591 if (!status->Online || !status->InService || !status->Blessed || status->NeedsSalvage)
592 bret = WINTORTURE_ASFDLL_OFFLINE;
596 code = ppioctl(strPath, VIOC_PATH_AVAILABILITY, &blob, 1);
602 bret = WINTORTURE_ASFDLL_OFFLINE;
605 bret = WINTORTURE_ASFDLL_ONLINE;
612 bret = WINTORTURE_ASFPIOCTL_NOTFOUND;
615 bret = WINTORTURE_ASFDLL_NOTFOUND;
617 if (rc == WAIT_OBJECT_0)
618 ReleaseMutex(OSMutexHandle);