/vmdir/server/dbintegritychk/dbintegritychkjob.c

https://github.com/vmware/lightwave · C · 270 lines · 197 code · 60 blank · 13 comment · 12 complexity · 1d346baf2887e09a8e162699e290cbac MD5 · raw file

  1. /*
  2. * Copyright © 2019 VMware, Inc. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the “License”); you may not
  5. * use this file except in compliance with the License. You may obtain a copy
  6. * of the License at http://www.apache.org/licenses/LICENSE-2.0
  7. *
  8. * Unless required by applicable law or agreed to in writing, software
  9. * distributed under the License is distributed on an “AS IS” BASIS, without
  10. * warranties or conditions of any kind, EITHER EXPRESS OR IMPLIED. See the
  11. * License for the specific language governing permissions and limitations
  12. * under the License.
  13. */
  14. #include "includes.h"
  15. DWORD
  16. VmDirDBIntegrityCheckGetCommand(
  17. PVMDIR_DB_INTEGRITY_CHECK_JOB_CMD pCmd
  18. )
  19. {
  20. DWORD dwError = 0;
  21. BOOLEAN bInLock = FALSE;
  22. if (pCmd == NULL)
  23. {
  24. BAIL_WITH_VMDIR_ERROR(dwError, ERROR_INVALID_PARAMETER);
  25. }
  26. VMDIR_LOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  27. *pCmd = gVmdirDBIntegrityCheck.pJob->command;
  28. cleanup:
  29. VMDIR_UNLOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  30. return dwError;
  31. error:
  32. VMDIR_LOG_ERROR(VMDIR_LOG_MASK_ALL, "failed, error (%d)", dwError);
  33. goto cleanup;
  34. }
  35. DWORD
  36. VmDirDBIntegrityCheckGetDBName(
  37. PSTR* ppszDBName
  38. )
  39. {
  40. DWORD dwError = 0;
  41. PSTR pszDBName = NULL;
  42. BOOLEAN bInLock = FALSE;
  43. if (ppszDBName == NULL)
  44. {
  45. BAIL_WITH_VMDIR_ERROR(dwError, ERROR_INVALID_PARAMETER);
  46. }
  47. VMDIR_LOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  48. dwError = VmDirAllocateStringA(gVmdirDBIntegrityCheck.pJob->pszDBName, &pszDBName);
  49. BAIL_ON_VMDIR_ERROR(dwError);
  50. *ppszDBName = pszDBName;
  51. pszDBName = NULL;
  52. cleanup:
  53. VMDIR_SAFE_FREE_MEMORY(pszDBName);
  54. VMDIR_UNLOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  55. return dwError;
  56. error:
  57. VMDIR_LOG_ERROR(VMDIR_LOG_MASK_ALL, "failed, error (%d)", dwError);
  58. goto cleanup;
  59. }
  60. VOID
  61. VmDirDBIntegrityCheckComplete(
  62. PVMDIR_STRING_LIST pDBList,
  63. VMDIR_DB_INTEGRITY_CHECK_JOB_STATE state
  64. )
  65. {
  66. BOOLEAN bInLock = FALSE;
  67. VMDIR_LOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  68. clock_gettime(CLOCK_REALTIME, &gVmdirDBIntegrityCheck.pJob->endTime);
  69. VmDirStringListFree(gVmdirDBIntegrityCheck.pJob->pAllDBNames);
  70. gVmdirDBIntegrityCheck.pJob->pAllDBNames = pDBList;
  71. gVmdirDBIntegrityCheck.pJob->state = state;
  72. VMDIR_UNLOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  73. }
  74. DWORD
  75. VmDirDBIntegrityCheckAllocateJobPerDB(
  76. DWORD dwSize
  77. )
  78. {
  79. DWORD dwError = 0;
  80. BOOLEAN bInLock = FALSE;
  81. PVMDIR_DB_INTEGRITY_JOB_PER_DB pJobPerDB = NULL;
  82. VMDIR_LOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  83. dwError = VmDirAllocateMemory(
  84. sizeof(VMDIR_DB_INTEGRITY_JOB_PER_DB) * dwSize, (PVOID*) &pJobPerDB);
  85. BAIL_ON_VMDIR_ERROR(dwError);
  86. gVmdirDBIntegrityCheck.pJob->pJobPerDB = pJobPerDB;
  87. gVmdirDBIntegrityCheck.pJob->dwNumJobPerDB = dwSize;
  88. cleanup:
  89. VMDIR_UNLOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  90. return dwError;
  91. error:
  92. VMDIR_LOG_ERROR(VMDIR_LOG_MASK_ALL, "failed, error (%d)", dwError);
  93. goto cleanup;
  94. }
  95. DWORD
  96. VmDirDBIntegrityCheckPopulateJobPerDB(
  97. PSTR pszDBName
  98. )
  99. {
  100. DWORD dwError = 0;
  101. DWORD dwKeysCount = 0;
  102. BOOLEAN bInLock = FALSE;
  103. PVMDIR_DB_INTEGRITY_JOB_PER_DB pJobPerDB = NULL;
  104. VDIR_BACKEND_CTX beCtx = {0};
  105. beCtx.pBE = VmDirBackendSelect(NULL);
  106. dwError = beCtx.pBE->pfnBEBackendGetDBKeysCount(pszDBName, &dwKeysCount);
  107. BAIL_ON_VMDIR_ERROR(dwError);
  108. VMDIR_LOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  109. pJobPerDB = gVmdirDBIntegrityCheck.pJob->pJobPerDB +
  110. gVmdirDBIntegrityCheck.pJob->dwNumValidJobPerDB;
  111. dwError = VmDirAllocateStringA(pszDBName, &pJobPerDB->pszDBName);
  112. BAIL_ON_VMDIR_ERROR(dwError);
  113. clock_gettime(CLOCK_REALTIME, &pJobPerDB->startTime);
  114. pJobPerDB->state = DB_INTEGRITY_CHECK_JOB_INPROGRESS;
  115. pJobPerDB->dwTotalKeys = dwKeysCount;
  116. gVmdirDBIntegrityCheck.pJob->dwNumValidJobPerDB++;
  117. cleanup:
  118. VMDIR_UNLOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  119. return dwError;
  120. error:
  121. VMDIR_LOG_ERROR(VMDIR_LOG_MASK_ALL, "failed, error (%d)", dwError);
  122. goto cleanup;
  123. }
  124. DWORD
  125. VmDirDBIntegrityCheckUpdateJobPerIter(
  126. DWORD dwJobPerDBIndex,
  127. DWORD dwKeysProcessed,
  128. PVMDIR_DB_INTEGRITY_CHECK_JOB_STATE pState
  129. )
  130. {
  131. DWORD dwError = 0;
  132. BOOLEAN bInLock = FALSE;
  133. if (pState == NULL)
  134. {
  135. BAIL_WITH_VMDIR_ERROR(dwError, ERROR_INVALID_PARAMETER);
  136. }
  137. VMDIR_LOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  138. gVmdirDBIntegrityCheck.pJob->pJobPerDB[dwJobPerDBIndex].dwKeysProcessed = dwKeysProcessed;
  139. if (gVmdirDBIntegrityCheck.pJob->state == DB_INTEGRITY_CHECK_JOB_STOP)
  140. {
  141. gVmdirDBIntegrityCheck.pJob->pJobPerDB[dwJobPerDBIndex].state = DB_INTEGRITY_CHECK_JOB_STOP;
  142. }
  143. *pState = gVmdirDBIntegrityCheck.pJob->pJobPerDB[dwJobPerDBIndex].state;
  144. cleanup:
  145. VMDIR_UNLOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  146. return dwError;
  147. error:
  148. VMDIR_LOG_ERROR(VMDIR_LOG_MASK_ALL, "failed, error (%d)", dwError);
  149. goto cleanup;
  150. }
  151. VOID
  152. VmDirDBIntegrityCheckUpdateJobComplete(
  153. DWORD dwJobPerDBIndex,
  154. DWORD dwKeysProcessed,
  155. VMDIR_DB_INTEGRITY_CHECK_JOB_STATE state
  156. )
  157. {
  158. BOOLEAN bInLock = FALSE;
  159. VMDIR_LOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  160. gVmdirDBIntegrityCheck.pJob->pJobPerDB[dwJobPerDBIndex].state = state;
  161. gVmdirDBIntegrityCheck.pJob->pJobPerDB[dwJobPerDBIndex].dwKeysProcessed = dwKeysProcessed;
  162. clock_gettime(CLOCK_REALTIME, &gVmdirDBIntegrityCheck.pJob->pJobPerDB[dwJobPerDBIndex].endTime);
  163. VMDIR_UNLOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  164. return;
  165. }
  166. DWORD
  167. VmDirDBIntegrityCheckJobGetDBName(
  168. DWORD dwJobPerDBIndex,
  169. PSTR* ppszDBName
  170. )
  171. {
  172. DWORD dwError = 0;
  173. PSTR pszDBName = NULL;
  174. BOOLEAN bInLock = FALSE;
  175. if (ppszDBName == NULL)
  176. {
  177. BAIL_WITH_VMDIR_ERROR(dwError, ERROR_INVALID_PARAMETER);
  178. }
  179. VMDIR_LOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  180. dwError = VmDirAllocateStringA(
  181. gVmdirDBIntegrityCheck.pJob->pJobPerDB[dwJobPerDBIndex].pszDBName, &pszDBName);
  182. BAIL_ON_VMDIR_ERROR(dwError);
  183. *ppszDBName = pszDBName;
  184. cleanup:
  185. VMDIR_UNLOCK_MUTEX(bInLock, gVmdirDBIntegrityCheck.pMutex);
  186. return dwError;
  187. error:
  188. VMDIR_LOG_ERROR(VMDIR_LOG_MASK_ALL, "failed, error (%d)", dwError);
  189. goto cleanup;
  190. }
  191. VOID
  192. VmDirDBIntegrityCheckJobFree(
  193. PVMDIR_DB_INTEGRITY_JOB pJob
  194. )
  195. {
  196. DWORD dwJobCnt = 0;
  197. if (pJob)
  198. {
  199. VMDIR_SAFE_FREE_MEMORY(pJob->pszDBName);
  200. VmDirStringListFree(pJob->pAllDBNames);
  201. pJob->pAllDBNames = NULL;
  202. for (dwJobCnt = 0; dwJobCnt < pJob->dwNumValidJobPerDB; dwJobCnt++)
  203. {
  204. VMDIR_SAFE_FREE_MEMORY(pJob->pJobPerDB[dwJobCnt].pszDBName);
  205. }
  206. VMDIR_SAFE_FREE_MEMORY(pJob->pJobPerDB);
  207. VMDIR_SAFE_FREE_MEMORY(pJob);
  208. }
  209. return;
  210. }