8460: Add event_at and props.{new,old}.{pdh,owner} to websocket v0. Fix fuse crash...
authorTom Clegg <tom@curoverse.com>
Sun, 11 Dec 2016 08:15:54 +0000 (03:15 -0500)
committerTom Clegg <tom@curoverse.com>
Sun, 11 Dec 2016 08:15:54 +0000 (03:15 -0500)
sdk/go/arvados/log.go
services/fuse/arvados_fuse/__init__.py
services/ws/event.go
services/ws/session_v0.go

index ef56e85ae7b0e8711b38a65090823d182b994415..a48f1c6b5ce62f1dc6878b1ad50a51cc6150b956 100644 (file)
@@ -11,6 +11,7 @@ type Log struct {
        ObjectUUID      string                 `json:"object_uuid"`
        ObjectOwnerUUID string                 `json:"object_owner_uuid"`
        EventType       string                 `json:"event_type"`
+       EventAt         *time.Time             `json:"event,omitempty"`
        Properties      map[string]interface{} `json:"properties"`
        CreatedAt       *time.Time             `json:"created_at,omitempty"`
 }
index 1828e150bb76bdf6185f7fcbb3fe3172fb68e616..63a5513f35d02457d672544d3c46f8ce65a71d7f 100644 (file)
@@ -377,29 +377,22 @@ class Operations(llfuse.Operations):
         if 'event_type' not in ev:
             return
         with llfuse.lock:
+            new_attrs = ev.get("properties", {}).get("new_attributes", {})
+            pdh = new_attrs.get("portable_data_hash")
+            # new_attributes.modified_at currently lacks
+            # subsecond precision (see #6347) so use event_at
+            # which should always be the same.
+            stamp = ev.get("event_at")
+
             for item in self.inodes.inode_cache.find_by_uuid(ev["object_uuid"]):
                 item.invalidate()
-                if ev["object_kind"] == "arvados#collection":
-                    new_attr = (ev.get("properties") and
-                                ev["properties"].get("new_attributes") and
-                                ev["properties"]["new_attributes"])
-
-                    # new_attributes.modified_at currently lacks
-                    # subsecond precision (see #6347) so use event_at
-                    # which should always be the same.
-                    record_version = (
-                        (ev["event_at"], new_attr["portable_data_hash"])
-                        if new_attr else None)
-
-                    item.update(to_record_version=record_version)
+                if stamp and pdh and ev.get("object_kind") == "arvados#collection":
+                    item.update(to_record_version=(stamp, pdh))
                 else:
                     item.update()
 
-            oldowner = (
-                ev.get("properties") and
-                ev["properties"].get("old_attributes") and
-                ev["properties"]["old_attributes"].get("owner_uuid"))
-            newowner = ev["object_owner_uuid"]
+            oldowner = ev.get("properties", {}).get("old_attributes", {}).get("owner_uuid")
+            newowner = ev.get("object_owner_uuid")
             for parent in (
                     self.inodes.inode_cache.find_by_uuid(oldowner) +
                     self.inodes.inode_cache.find_by_uuid(newowner)):
index fa2a5df1b064c2d1b1bfc59a4cea63d54b471150..304f86bbd0583146c4f88a4499d98d872bdab8ea 100644 (file)
@@ -42,12 +42,13 @@ func (e *event) Detail() *arvados.Log {
        }
        var logRow arvados.Log
        var propYAML []byte
-       e.err = e.db.QueryRow(`SELECT id, uuid, object_uuid, COALESCE(object_owner_uuid,''), COALESCE(event_type,''), created_at, properties FROM logs WHERE id = $1`, e.LogID).Scan(
+       e.err = e.db.QueryRow(`SELECT id, uuid, object_uuid, COALESCE(object_owner_uuid,''), COALESCE(event_type,''), event_at, created_at, properties FROM logs WHERE id = $1`, e.LogID).Scan(
                &logRow.ID,
                &logRow.UUID,
                &logRow.ObjectUUID,
                &logRow.ObjectOwnerUUID,
                &logRow.EventType,
+               &logRow.EventAt,
                &logRow.CreatedAt,
                &propYAML)
        if e.err != nil {
index 2b108a2b5c09ea4b25d94e098b024524911dd362..364555a74087461e799b6d7925dc703e4be3c188 100644 (file)
@@ -16,7 +16,7 @@ var (
        errQueueFull   = errors.New("client queue full")
        errFrameTooBig = errors.New("frame too big")
 
-       sendObjectAttributes = []string{"state", "name"}
+       sendObjectAttributes = []string{"state", "name", "owner_uuid", "portable_data_hash"}
 
        v0subscribeOK   = []byte(`{"status":200}`)
        v0subscribeFail = []byte(`{"status":400}`)
@@ -97,6 +97,7 @@ func (sess *v0session) EventMessage(e *event) ([]byte, error) {
                "object_owner_uuid": detail.ObjectOwnerUUID,
                "object_kind":       kind,
                "event_type":        detail.EventType,
+               "event_at":          detail.EventAt,
        }
        if detail.Properties != nil && detail.Properties["text"] != nil {
                msg["properties"] = detail.Properties