Skip to content

Commit b836faf

Browse files
committed
feat:支持初始化管理员帐户
1 parent 2d24512 commit b836faf

File tree

5 files changed

+278
-24
lines changed

5 files changed

+278
-24
lines changed

admin/job/clean_deleted_resource.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@ import (
2727
)
2828

2929
var cleanFuncMapping = map[string]func(timeout time.Duration, job *cleanDeletedResourceJob){
30-
"instance": cleanDeletedInstances,
31-
"service": cleanDeletedServices,
32-
"clients": cleanDeletedClients,
30+
"instance": cleanDeletedInstances,
31+
"service": cleanDeletedServices,
32+
"clients": cleanDeletedClients,
33+
"service_contract": cleanDeletedServiceContracts,
3334
"circuitbreaker_rule": func(timeout time.Duration, job *cleanDeletedResourceJob) {
3435
cleanDeletedRules("circuitbreaker_rule", timeout, job)
3536
},
@@ -58,6 +59,10 @@ var defaultCleanDeletedResourceConfig = CleandeletedResourceConf{
5859
Resource: "service",
5960
Enable: true,
6061
},
62+
{
63+
Resource: "service_contract",
64+
Enable: true,
65+
},
6166
{
6267
Resource: "clients",
6368
Enable: true,
@@ -233,6 +238,21 @@ func cleanDeletedInstances(timeout time.Duration, job *cleanDeletedResourceJob)
233238
}
234239
}
235240

241+
func cleanDeletedServiceContracts(timeout time.Duration, job *cleanDeletedResourceJob) {
242+
batchSize := uint32(100)
243+
for {
244+
count, err := job.storage.BatchCleanDeletedClients(timeout, batchSize)
245+
if err != nil {
246+
log.Errorf("[Maintain][Job][CleanDeletedClients] batch clean deleted client, err: %v", err)
247+
break
248+
}
249+
log.Infof("[Maintain][Job][CleanDeletedClients] clean deleted client count %d", count)
250+
if count < batchSize {
251+
break
252+
}
253+
}
254+
}
255+
236256
func cleanDeletedRules(rule string, timeout time.Duration, job *cleanDeletedResourceJob) {
237257
batchSize := uint32(100)
238258
for {

store/admin_api.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ type AdminStore interface {
4343
GetUnHealthyInstances(timeout time.Duration, limit uint32) ([]string, error)
4444
// BatchCleanDeletedClients batch clean soft deleted clients
4545
BatchCleanDeletedClients(timeout time.Duration, batchSize uint32) (uint32, error)
46+
// BatchCleanDeletedServiceContracts batch clean soft deleted service_contract
47+
BatchCleanDeletedServiceContracts(timeout time.Duration, batchSize uint32) (uint32, error)
4648
// BatchCleanDeletedServices batch clean soft deleted clients
4749
BatchCleanDeletedServices(timeout time.Duration, batchSize uint32) (uint32, error)
4850
// BatchCleanDeletedRules batch clean soft deleted clients

store/boltdb/admin.go

Lines changed: 91 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -157,37 +157,22 @@ func (m *adminStore) getUnHealthyInstancesBefore(mtime time.Time, limit uint32)
157157
fields := []string{insFieldProto, insFieldValid}
158158
instances, err := m.handler.LoadValuesByFilter(tblNameInstance, fields, &model.Instance{},
159159
func(m map[string]interface{}) bool {
160-
161-
valid, ok := m[insFieldValid]
162-
if ok && !valid.(bool) {
160+
if valid, ok := m[insFieldValid]; ok && !valid.(bool) {
163161
return false
164162
}
165-
166163
insProto, ok := m[insFieldProto]
167164
if !ok {
168165
return false
169166
}
170-
171167
ins := insProto.(*apiservice.Instance)
172-
173168
insMtime, err := time.Parse("2006-01-02 15:04:05", ins.GetMtime().GetValue())
174169
if err != nil {
175170
log.Errorf("[Store][boltdb] parse instance mtime error, %v", err)
176171
return false
177172
}
178-
179-
if insMtime.Before(mtime) {
180-
return false
181-
}
182-
183-
if !ins.GetEnableHealthCheck().GetValue() {
184-
return false
185-
}
186-
187-
if ins.GetHealthy().GetValue() {
173+
if insMtime.Before(mtime) || !ins.GetEnableHealthCheck().GetValue() || ins.GetHealthy().GetValue() {
188174
return false
189175
}
190-
191176
return true
192177
})
193178

@@ -255,7 +240,49 @@ func (m *adminStore) BatchCleanDeletedClients(timeout time.Duration, batchSize u
255240

256241
// BatchCleanDeletedServices batch clean soft deleted clients
257242
func (m *adminStore) BatchCleanDeletedServices(timeout time.Duration, batchSize uint32) (uint32, error) {
258-
return 0, nil
243+
mtime := time.Now().Add(-timeout)
244+
fields := []string{svcFieldValid, SvcFieldModifyTime}
245+
values, err := m.handler.LoadValuesByFilter(tblNameService, fields, &model.Service{},
246+
func(m map[string]interface{}) bool {
247+
valid, ok := m[svcFieldValid]
248+
if !ok {
249+
return false
250+
}
251+
if valid.(bool) {
252+
return false
253+
}
254+
255+
modifyTime, ok := m[SvcFieldModifyTime]
256+
if !ok {
257+
return false
258+
}
259+
if modifyTime.(time.Time).After(mtime) {
260+
return false
261+
}
262+
263+
return true
264+
})
265+
if err != nil {
266+
return 0, err
267+
}
268+
if len(values) == 0 {
269+
return 0, nil
270+
}
271+
272+
var count uint32 = 0
273+
keys := make([]string, 0, batchSize)
274+
for k := range values {
275+
keys = append(keys, k)
276+
count++
277+
if count >= batchSize {
278+
break
279+
}
280+
}
281+
err = m.handler.DeleteValues(tblNameService, keys)
282+
if err != nil {
283+
return count, err
284+
}
285+
return count, nil
259286
}
260287

261288
// BatchCleanDeletedRules batch clean soft deleted clients
@@ -267,3 +294,49 @@ func (m *adminStore) BatchCleanDeletedRules(rule string, timeout time.Duration,
267294
func (m *adminStore) BatchCleanDeletedConfigFiles(timeout time.Duration, batchSize uint32) (uint32, error) {
268295
return 0, nil
269296
}
297+
298+
func (m *adminStore) BatchCleanDeletedServiceContracts(timeout time.Duration, batchSize uint32) (uint32, error) {
299+
mtime := time.Now().Add(-timeout)
300+
fields := []string{ContractFieldValid, ContractFieldModifyTime}
301+
values, err := m.handler.LoadValuesByFilter(tblServiceContract, fields, &serviceContractStore{},
302+
func(m map[string]interface{}) bool {
303+
valid, ok := m[ContractFieldValid]
304+
if !ok {
305+
return false
306+
}
307+
if valid.(bool) {
308+
return false
309+
}
310+
311+
modifyTime, ok := m[ContractFieldModifyTime]
312+
if !ok {
313+
return false
314+
}
315+
if modifyTime.(time.Time).After(mtime) {
316+
return false
317+
}
318+
319+
return true
320+
})
321+
if err != nil {
322+
return 0, err
323+
}
324+
if len(values) == 0 {
325+
return 0, nil
326+
}
327+
328+
var count uint32 = 0
329+
keys := make([]string, 0, batchSize)
330+
for k := range values {
331+
keys = append(keys, k)
332+
count++
333+
if count >= batchSize {
334+
break
335+
}
336+
}
337+
err = m.handler.DeleteValues(tblServiceContract, keys)
338+
if err != nil {
339+
return count, err
340+
}
341+
return count, nil
342+
}

store/mock/api_mock.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

store/mysql/admin.go

Lines changed: 147 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -561,15 +561,159 @@ func (m *adminStore) BatchCleanDeletedClients(timeout time.Duration, batchSize u
561561

562562
// BatchCleanDeletedServices batch clean soft deleted clients
563563
func (m *adminStore) BatchCleanDeletedServices(timeout time.Duration, batchSize uint32) (uint32, error) {
564-
return 0, nil
564+
log.Infof("[Store][database] batch clean soft deleted services(%d)", batchSize)
565+
var rowsAffected int64
566+
err := m.master.processWithTransaction("batchCleanDeletedServices", func(tx *BaseTx) error {
567+
// 查询出需要清理的实例 ID 信息
568+
loadWaitDel := "SELECT id FROM service WHERE flag = 1 AND " +
569+
"mtime <= FROM_UNIXTIME(UNIX_TIMESTAMP(SYSDATE()) - ?) LIMIT ?"
570+
rows, err := tx.Query(loadWaitDel, int32(timeout.Seconds()), batchSize)
571+
if err != nil {
572+
log.Errorf("[Store][database] batch clean soft deleted services(%d), err: %s", batchSize, err.Error())
573+
return store.Error(err)
574+
}
575+
waitDelIds := make([]interface{}, 0, batchSize)
576+
defer func() {
577+
_ = rows.Close()
578+
}()
579+
580+
placeholders := make([]string, 0, batchSize)
581+
for rows.Next() {
582+
var id string
583+
if err := rows.Scan(&id); err != nil {
584+
log.Errorf("[Store][database] scan deleted services id, err: %s", err.Error())
585+
return store.Error(err)
586+
}
587+
waitDelIds = append(waitDelIds, id)
588+
placeholders = append(placeholders, "?")
589+
}
590+
591+
if len(waitDelIds) == 0 {
592+
return nil
593+
}
594+
inSql := strings.Join(placeholders, ",")
595+
596+
cleanMetaStr := fmt.Sprintf("delete from service_metadata where id in (%s)", inSql)
597+
if _, err := tx.Exec(cleanMetaStr, waitDelIds...); err != nil {
598+
log.Errorf("[Store][database] batch clean soft deleted services(%d), err: %s", batchSize, err.Error())
599+
return store.Error(err)
600+
}
601+
602+
cleanInsStr := fmt.Sprintf("delete from service where flag = 1 and id in (%s)", inSql)
603+
result, err := tx.Exec(cleanInsStr, waitDelIds...)
604+
if err != nil {
605+
log.Errorf("[Store][database] batch clean soft deleted services(%d), err: %s", batchSize, err.Error())
606+
return store.Error(err)
607+
}
608+
609+
tRows, err := result.RowsAffected()
610+
if err != nil {
611+
log.Warnf("[Store][database] batch clean soft deleted services(%d), get RowsAffected err: %s",
612+
batchSize, err.Error())
613+
return store.Error(err)
614+
}
615+
616+
if err = tx.Commit(); err != nil {
617+
log.Errorf("[Store][database] batch clean soft deleted services(%d) commit tx err: %s",
618+
batchSize, err.Error())
619+
return err
620+
}
621+
622+
rowsAffected = tRows
623+
return nil
624+
})
625+
return uint32(rowsAffected), err
565626
}
566627

567628
// BatchCleanDeletedRules batch clean soft deleted clients
568629
func (m *adminStore) BatchCleanDeletedRules(rule string, timeout time.Duration, batchSize uint32) (uint32, error) {
569-
return 0, nil
630+
log.Infof("[Store][database] batch clean soft deleted %s(%d)", rule, batchSize)
631+
var rows int64
632+
err := m.master.processWithTransaction("batchCleanDeleted"+rule, func(tx *BaseTx) error {
633+
mainStr := "delete from " + rule + " where flag = 1 limit ?"
634+
result, err := tx.Exec(mainStr, int32(timeout.Seconds()), batchSize)
635+
if err != nil {
636+
log.Errorf("[Store][database] batch clean soft deleted %s(%d), err: %s", rule, batchSize, err.Error())
637+
return store.Error(err)
638+
}
639+
640+
tRows, err := result.RowsAffected()
641+
if err != nil {
642+
log.Warnf("[Store][database] batch clean soft deleted %s(%d), get RowsAffected err: %s",
643+
rule, batchSize, err.Error())
644+
return store.Error(err)
645+
}
646+
647+
if err := tx.Commit(); err != nil {
648+
log.Errorf("[Store][database] batch clean soft deleted %s(%d) commit tx err: %s",
649+
rule, batchSize, err.Error())
650+
return err
651+
}
652+
653+
rows = tRows
654+
return nil
655+
})
656+
return uint32(rows), err
570657
}
571658

572659
// BatchCleanDeletedConfigFiles batch clean soft deleted clients
573660
func (m *adminStore) BatchCleanDeletedConfigFiles(timeout time.Duration, batchSize uint32) (uint32, error) {
574-
return 0, nil
661+
log.Infof("[Store][database] batch clean soft deleted config_files(%d)", batchSize)
662+
var rows int64
663+
err := m.master.processWithTransaction("batchCleanDeletedConfigFiles", func(tx *BaseTx) error {
664+
mainStr := "delete from config_file where flag = 1 limit ?"
665+
result, err := tx.Exec(mainStr, int32(timeout.Seconds()), batchSize)
666+
if err != nil {
667+
log.Errorf("[Store][database] batch clean soft deleted config_files(%d), err: %s", batchSize, err.Error())
668+
return store.Error(err)
669+
}
670+
671+
tRows, err := result.RowsAffected()
672+
if err != nil {
673+
log.Warnf("[Store][database] batch clean soft deleted config_files(%d), get RowsAffected err: %s",
674+
batchSize, err.Error())
675+
return store.Error(err)
676+
}
677+
678+
if err := tx.Commit(); err != nil {
679+
log.Errorf("[Store][database] batch clean soft deleted config_files(%d) commit tx err: %s",
680+
batchSize, err.Error())
681+
return err
682+
}
683+
684+
rows = tRows
685+
return nil
686+
})
687+
return uint32(rows), err
688+
}
689+
690+
// BatchCleanDeletedServiceContracts batch clean soft deleted service_contract
691+
func (m *adminStore) BatchCleanDeletedServiceContracts(timeout time.Duration, batchSize uint32) (uint32, error) {
692+
log.Infof("[Store][database] batch clean soft deleted service_contract(%d)", batchSize)
693+
var rows int64
694+
err := m.master.processWithTransaction("batchCleanDeletedServiceContracts", func(tx *BaseTx) error {
695+
mainStr := "delete from service_contract sc join service_contract_detail sd ON sc.id = sd.contract_id where sc.flag = 1 limit ?"
696+
result, err := tx.Exec(mainStr, int32(timeout.Seconds()), batchSize)
697+
if err != nil {
698+
log.Errorf("[Store][database] batch clean soft deleted service_contract(%d), err: %s", batchSize, err.Error())
699+
return store.Error(err)
700+
}
701+
702+
tRows, err := result.RowsAffected()
703+
if err != nil {
704+
log.Warnf("[Store][database] batch clean soft deleted service_contract(%d), get RowsAffected err: %s",
705+
batchSize, err.Error())
706+
return store.Error(err)
707+
}
708+
709+
if err := tx.Commit(); err != nil {
710+
log.Errorf("[Store][database] batch clean soft deleted service_contract(%d) commit tx err: %s",
711+
batchSize, err.Error())
712+
return err
713+
}
714+
715+
rows = tRows
716+
return nil
717+
})
718+
return uint32(rows), err
575719
}

0 commit comments

Comments
 (0)