Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Refactor zettel notification in boxes |
|---|---|
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
e154f55f38757bb9e718fd4b36e82ad2 |
| User & Date: | stern 2024-09-26 11:42:19.013 |
Context
|
2024-09-26
| ||
| 11:48 | Refactor kernel to remove some warnings ... (check-in: 105f0b6440 user: stern tags: trunk) | |
| 11:42 | Refactor zettel notification in boxes ... (check-in: e154f55f38 user: stern tags: trunk) | |
|
2024-09-23
| ||
| 16:59 | Enlarge index queue to remove chance of deadlock ... (check-in: d7cedf7bce user: stern tags: trunk) | |
Changes
Changes to box/box.go.
| ︙ | ︙ | |||
215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
Box BaseBox
Reason UpdateReason
Zid id.Zid
}
// UpdateFunc is a function to be called when a change is detected.
type UpdateFunc func(UpdateInfo)
// Subject is a box that notifies observers about changes.
type Subject interface {
// RegisterObserver registers an observer that will be notified
// if one or all zettel are found to be changed.
RegisterObserver(UpdateFunc)
}
| > > > | 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 |
Box BaseBox
Reason UpdateReason
Zid id.Zid
}
// UpdateFunc is a function to be called when a change is detected.
type UpdateFunc func(UpdateInfo)
// UpdateNotifier is an UpdateFunc, but with separate values.
type UpdateNotifier func(BaseBox, id.Zid, UpdateReason)
// Subject is a box that notifies observers about changes.
type Subject interface {
// RegisterObserver registers an observer that will be notified
// if one or all zettel are found to be changed.
RegisterObserver(UpdateFunc)
}
|
| ︙ | ︙ |
Changes to box/dirbox/dirbox.go.
| ︙ | ︙ | |||
200 201 202 203 204 205 206 |
func (dp *dirBox) stopFileServices() {
for _, c := range dp.fCmds {
close(c)
}
}
func (dp *dirBox) notifyChanged(zid id.Zid, reason box.UpdateReason) {
| | | | 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
func (dp *dirBox) stopFileServices() {
for _, c := range dp.fCmds {
close(c)
}
}
func (dp *dirBox) notifyChanged(zid id.Zid, reason box.UpdateReason) {
if notify := dp.cdata.Notify; notify != nil {
dp.log.Trace().Zid(zid).Uint("reason", uint64(reason)).Msg("notifyChanged")
notify(dp, zid, reason)
}
}
func (dp *dirBox) getFileChan(zid id.Zid) chan fileCmd {
// Based on https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function
sum := 2166136261 ^ uint32(zid)
sum *= 16777619
|
| ︙ | ︙ |
Changes to box/filebox/zipbox.go.
| ︙ | ︙ | |||
31 32 33 34 35 36 37 |
)
type zipBox struct {
log *logger.Logger
number int
name string
enricher box.Enricher
| | | 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
)
type zipBox struct {
log *logger.Logger
number int
name string
enricher box.Enricher
notify box.UpdateNotifier
dirSrv *notify.DirService
}
func (zb *zipBox) Location() string {
if strings.HasPrefix(zb.name, "/") {
return "file://" + zb.name
}
|
| ︙ | ︙ |
Changes to box/manager/manager.go.
| ︙ | ︙ | |||
36 37 38 39 40 41 42 |
)
// ConnectData contains all administration related values.
type ConnectData struct {
Number int // number of the box, starting with 1.
Config config.Config
Enricher box.Enricher
| | | 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
)
// ConnectData contains all administration related values.
type ConnectData struct {
Number int // number of the box, starting with 1.
Config config.Config
Enricher box.Enricher
Notify box.UpdateNotifier
Mapper Mapper
}
// Mapper allows to inspect the mapping between old-style and new-style zettel identifier.
type Mapper interface {
Warnings(context.Context) (*id.Set, error) // Fetch problematic zettel identifier
|
| ︙ | ︙ | |||
142 143 144 145 146 147 148 |
propertyKeys.Set(kd.Name)
}
}
boxLog := kernel.Main.GetLogger(kernel.BoxService)
mgr := &Manager{
mgrLog: boxLog.Clone().Str("box", "manager").Child(),
rtConfig: rtConfig,
| | | | 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
propertyKeys.Set(kd.Name)
}
}
boxLog := kernel.Main.GetLogger(kernel.BoxService)
mgr := &Manager{
mgrLog: boxLog.Clone().Str("box", "manager").Child(),
rtConfig: rtConfig,
infos: make(chan box.UpdateInfo, len(boxURIs)*10),
propertyKeys: propertyKeys,
idxLog: boxLog.Clone().Str("box", "index").Child(),
idxStore: createIdxStore(rtConfig),
idxAr: newAnteroomQueue(1000),
idxReady: make(chan struct{}, 1),
}
mgr.zidMapper = NewZidMapper(mgr)
cdata := ConnectData{Number: 1, Config: rtConfig, Enricher: mgr, Notify: mgr.notifyChanged, Mapper: mgr.zidMapper}
boxes := make([]box.ManagedBox, 0, len(boxURIs)+2)
for _, uri := range boxURIs {
p, err := Connect(uri, authManager, &cdata)
if err != nil {
return nil, err
}
if p != nil {
|
| ︙ | ︙ | |||
484 485 486 487 488 489 490 |
func (mgr *Manager) checkContinue(ctx context.Context) error {
if mgr.State() != box.StartStateStarted {
return box.ErrStopped
}
return ctx.Err()
}
| > > > > > > | 484 485 486 487 488 489 490 491 492 493 494 495 496 |
func (mgr *Manager) checkContinue(ctx context.Context) error {
if mgr.State() != box.StartStateStarted {
return box.ErrStopped
}
return ctx.Err()
}
func (mgr *Manager) notifyChanged(bbox box.BaseBox, zid id.Zid, reason box.UpdateReason) {
if infos := mgr.infos; infos != nil && zid != id.MappingZid {
mgr.infos <- box.UpdateInfo{Box: bbox, Reason: reason, Zid: zid}
}
}
|
Changes to box/membox/membox.go.
| ︙ | ︙ | |||
51 52 53 54 55 56 57 |
maxBytes int
mx sync.RWMutex // Protects the following fields
zettel map[id.Zid]zettel.Zettel
curBytes int
}
func (mb *memBox) notifyChanged(zid id.Zid, reason box.UpdateReason) {
| | | | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
maxBytes int
mx sync.RWMutex // Protects the following fields
zettel map[id.Zid]zettel.Zettel
curBytes int
}
func (mb *memBox) notifyChanged(zid id.Zid, reason box.UpdateReason) {
if notify := mb.cdata.Notify; notify != nil {
notify(mb, zid, reason)
}
}
func (mb *memBox) Location() string {
return mb.u.String()
}
|
| ︙ | ︙ |
Changes to box/notify/directory.go.
| ︙ | ︙ | |||
52 53 54 55 56 57 58 |
// DirService specifies a directory service for file based zettel.
type DirService struct {
box box.ManagedBox
log *logger.Logger
dirPath string
notifier Notifier
| | | | | 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
// DirService specifies a directory service for file based zettel.
type DirService struct {
box box.ManagedBox
log *logger.Logger
dirPath string
notifier Notifier
infos box.UpdateNotifier
mx sync.RWMutex // protects status, entries
state DirServiceState
entries entrySet
}
// ErrNoDirectory signals missing directory data.
var ErrNoDirectory = errors.New("unable to retrieve zettel directory information")
// NewDirService creates a new directory service.
func NewDirService(box box.ManagedBox, log *logger.Logger, notifier Notifier, notify box.UpdateNotifier) *DirService {
return &DirService{
box: box,
log: log,
notifier: notifier,
infos: notify,
state: DsCreated,
}
}
// State the current service state.
func (ds *DirService) State() DirServiceState {
ds.mx.RLock()
|
| ︙ | ︙ | |||
571 572 573 574 575 576 577 |
if oldLen != newLen {
return newLen < oldLen
}
return newExt < oldExt
}
func (ds *DirService) notifyChange(zid id.Zid, reason box.UpdateReason) {
| | | | 571 572 573 574 575 576 577 578 579 580 581 582 |
if oldLen != newLen {
return newLen < oldLen
}
return newExt < oldExt
}
func (ds *DirService) notifyChange(zid id.Zid, reason box.UpdateReason) {
if notify := ds.infos; notify != nil {
ds.log.Trace().Zid(zid).Uint("reason", uint64(reason)).Msg("notifyChange")
notify(ds.box, zid, reason)
}
}
|